Google OAuth2.0이란?
OAuth 2.0은 다양한 플랫폼 환경에서 권한 부여를 위한 산업 표준 프로토콜입니다. OAuth 2.0은 페이스북이나 구글의 아이디로 제 3의 서비스에 로그인해서 등록되어 있는 정보( 친구 목록 )나 기능( 담벼락 글쓰기 )에 접근할 수 있는 권한을 제어하기 위한 표준 프로토콜입니다.
용어
용어 | 설명 | |
Resource owner | Resource Server의 계정을 소유한 일반 사용자 | notice |
Client | Resource owner을 대신해 인증과 자원을 사용할 수 있도록 제공하는 Client | 티스토리 |
Authorization Server | Resource owner을 인증하고 리소스 접근 권한을 Client에게 임명합니다. |
|
Resource Server | 보호된 자원을 호스팅하는 서버로써 AcessToken을 사용하여 보호된 리소스을 제공합니다. | Adsense |
용어 | 설명 | 예시 |
client_id | Client을 식별하는 고유 ID | 159016255328-xxx |
client_idclient_id | 인증처리를 완료한 후 token정보를 반환해줄 url 주소 | localhost://oauth/callback |
response_type | token, code값을 선택할 수 있으며 code가 셋팅된 경우 Implicit flow에 따라 인증된 코드를 반환합니다. | code |
scope | permissions을 ,로 구분하여 요청합니다. | openid |
access_type | 옵션에는 offline, online이 있으며, 만약 access_token이 만료되었을때 refresh_token으로 갱신이 필요하면 offline값을 사용해야 됩니다. | offline |
state | client와 resource server간 정보를 교환할 때 공유할 정보를 나타냅니다. 즉, redirect_uri에 호출될때 처음 전달한 scope데이터는 다시 돌려받게 되며 이값을 통해 데이터 변조 여부를 판단합니다. |
id=100 |
include_granted_scopes | true로 설정된 경우 이전의 권한 scope가 새로운 인증에 사용될 수 있습니다. | true |
login_hint | 어떤 유저가 인증을 시도하는지 추가정보를 보내면 Google Authentication Server가 활용하게 됩니다. | user@gmail.com |
prompt | 옵션이 선택되지 않으면 최초 한번만 prompt 정보가 표시됩니다. (ex refresh_token) 즉, 항상 refresh_token을 받기위해서는 아래의 옵션을 명시해야됩니다. none : Do not display any authentication or consent screens. Must not be specified with other values. consent : Prompt the user for consent. select_account : Prompt the user to select an account. |
consent |
용어 | 설명 | 예시 |
access_token | 인증된 토큰 | ya29.a0AfH6SMAtvp0H6-xxx |
refresh_token | access_token만료시 새로운 access_token을 받급 받기 위해 필요한 token | 1//0evizddMIXxxxIARAAGA4Sxxxx |
expires_in | access_token 만료까지 남은 Seconds | 1596187945 |
scope | 허가된 자원 scope | openid |
token_type | 토큰 타입 | Bearer |
Http code
// 인증 요청
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
access_type=offline&
include_granted_scopes=true&
response_type=code&
state=state_parameter_passthrough_value&
redirect_uri=https%3A//oauth2.example.com/code&
client_id=client_id
// 인증 응답
{
"code": "4/P7q7W91a-oMsCeLvIaQm6bTrgtp7",
"state": "xxxxx"
}
// token 요청
https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
// token 응답 to redirect_uri
{
"access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
"expires_in": 3920,
"token_type": "Bearer",
"scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
"refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}
// 자원 사용 요청
GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token
// Token 정보 요청
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxx
Bearer Authentication란?
API에 접속하기 위해서는 access token을 API 서버에 제출해서 인증을 해야 합니다. 이 때 사용하는 인증 방법이 Bearer Authentication 입니다. 이 방법은 OAuth를 위해서 고안된 방법이고, RFC 6750에 표준명세서가 있습니다.
flowchart
prompt 옵션
- prompt consent옵션으로 발급받은 Token은 항상 refresh_token이 포함되어 있고 이 토큰을 통해 access_token을 갱신할 수 있습니다.
- 또한 refresh_token이 있다는 뜻은 각 access_token이 독립적으로 사용된다는 뜻입니다. 즉 처음 발급 받은 access_token은 두번째 발급받은 access_token이 폐기되어도 영향을 받지 않습니다.
- 단, revoke을 통해 Permission을 삭제한 경우에는 Google accountId에 포함된 모든 access_token, refresh_token이 무효화 됩니다.
refresh_token 만료 정책
- 사용자가 권한을 회수한 경우 (revoke)
- 6개월동안 사용 되지 않은 경우
- 사용자가 비밀번호를 변경한 경우
- 사용자 계정당 50개 이상의 refresh_token이 발급된 경우 오래된 토큰부터 순차적 무효화
참고
https://developers.google.com/identity/protocols/oauth2/web-server#redirecting
댓글