Oauth_구글로_로그인_하기 이론
구글로 로그인하기 - 권한 부여 코드 승인 타입
OAuth란?
제 3의 서비스에 계정 관리를 맡기는 방식을 말한다. 우리가 자주 사용하는 네이버 로그인, 카카오 로그인, 구글 로그인 등을 이용하여 로그인 하는 방식을 말한다.
관련용어
리소스 오너 (Resource Owner) 인증 서버에 자신의 정보를 사용하도록 허가하는 주체. 서비스를 이용하는 사용자가 해당 됨
리소스 서버 (Resource Server) 리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체. 네이버, 구글, 페이스북이 해당 됨
인증 서버 (Authorization Server) 사용자에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미함
클라이언트 애플리케이션 (Client Application) 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체. 개발자가 만들고 잇는 서비스에 해당 됨
리소스 오너 정보를 취득하는 방법 4가지
1. 권한 부여 코드 승인 타입
Authorization Code Grant type
OAuth 2.0에서 가장 잘 알려진 인증 방법이다.
클라이언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스오너에 대한 액세스 토큰을 발급받는 방식이다.
2. 암시적 승인 타입
Implicit Grant Type
서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법이다.
클라이언트가 요청을 보내면 리소스오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공 받는 방식이다.
3. 리소스 소유자 암호 자격증명 승인 타입
Resource Owner Password Credentials
클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식이다.
4. 클라이언트 자격증명 승인 타입
Client Credentials Grant
클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식이다.
권한 부여 코드 승인 타입
Oauth 2.0에서 가장 잘 알려진 인증 방식인 권한 부여 코드 승인 타입을 살펴볼 예정이다!
동작 방법

스프링 부트 서버가 권한 서버로 보내는 요청
``` API Request GET https://권한서버uri/authorize? client_id=3r3f323& redirect_uri=https://localhost/myapp& response_type=code& scope=profile
- client_id
인증 서버가 클라이언트에 할당한 고유 식별자.
OAuth 서비스에 등록할 때 서비스에서 생성하는 값
- redirect_uri
로그인 성공 시 이동해야 하는 URI
- response_type
클라이언트가 제공받길 원하는 응답 타입
인증 코드를 받을 때는 code 값을 포함해야 한다
- scope
제공받고자 하는 리소스 오너의 정보 목록
#### 추가 설명
**데이터 접근용 권한 부여 **
- 인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자의 데이터에 접근 동의를 얻는다.
- 최초 1회만 진행되며 이후에는 인증 서버에서 동의 내용을 정하고 있기 때문에 로그인만 진행함.
- 로그인이 성공되면 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신함.
**인증 코드 제공**
- 사용자가 로그인에 성공하면 권한 요청 시에 파라미터로 보낸 redirect_uri로 리다이렉션되며 이때 파라미터에 인증 코드를 함께 전달 받을 수 있음
> **EX)**
GET : http://localhost:8080/myapp?code=ekw9fk3290wl1
**액세스 토큰 응답이란?**
- 인증 코드를 받으면 액세스 토큰으로 교환해야 하는데 액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 의미한다.
- 대체로 POST로 요청을 보냄
``` API Request
POST https://권한서버uri/token?
{
"client_id" : "3r3f323",
"client_secret": "aabb11dd44",
"redirect_uri" : "https://localhost/myapp",
"grant_type" : "authorization_code",
"code" : "a23dn231d3i312"
}
“client_secret” = OAuth 서비스에 등록할 때 제공받는 비밀키 “grant_type” = 권한 유형을 확인하는 데 사용함
액세스 토큰 응답 값 예시
{
"access_token" : "ffddeep",
"token_type" : "Bearer",
"expires_in" : 3600,
"scope" : "openid profile"
...생략...
}
액세스 토큰으로 API 응답 & 반환 요청을 통해 response로 제공받은 액세스 토큰으로 리소스 오너의 정보를 가져올 수 있다. 정보가 필요할 때마다 API 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답한다.
리소스 오너의 정보를 가져오는 요청 예시
``` API Request GET https://권한서버uri/userinfo
header : Authorization: Bearer ffddeep
```
참고
- 스프링 부트 3 백앤드 개발자 되기 : 자바 편 (2판)