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 | 필수 항목. 애플리케이션의 OAuth 2.0 클라이언트 ID로, APIs Console에서 값을 확인할 수 있습니다. |
redirect_uri | 필수 항목. 클라이언트 ID에 대해 등록된 redirect_uri입니다. 애플리케이션에 대해 유효한 리디렉션 URI를 APIs Console에 등록합니다. |
response_type | 필수 항목. Google OAuth 2.0 엔드포인트에서 인증 코드의 반환 여부를 결정합니다. 매개변수 값을 code로 설정합니다. |
scope | 필수 항목. 사용자를 대신하여 애플리케이션이 액세스할 수 있는 리소스를 식별하는 공백으로 구분된 범위의 목록입니다. 이 값은 Google이 사용자에게 표시하는 동의 페이지에 나열되는 권한을 결정합니다. YouTube Data API은(는) 다음 범위를 지원합니다.
|
approval_prompt | 선택 항목. 이 매개변수는 사용자가 특정 작업을 완료하려고 시도할 때마다 애플리케이션에 대한 계정 액세스 권한을 부여하라는 메시지를 표시할지 여부를 나타냅니다. 기본값은 auto이며, 이는 사용자가 처음으로 보호된 리소스에 액세스하려고 하는 경우에만 액세스 권한을 부여하면 됨을 나타냅니다. 특정 범위 집합과 관련해 이미 애플리케이션에 액세스 권한을 부여한 경우에도 사용자를 동의 페이지로 안내하려면 매개변수 값을 force로 설정합니다. |
access_type | 권장 항목. 이 매개변수는 사용자가 브라우저에 없을 때 애플리케이션이 액세스 토큰을 갱신할 수 있는지 여부를 나타냅니다. 유효한 매개변수 값은 online 및 offline입니다. 사용자가 없을 때 애플리케이션이 갱신 토큰을 사용하도록 허용하려면 매개변수 값을 offline으로 설정합니다. (이 문서의 뒷부분에서 설명할 액세스 토큰의 갱신 방법입니다.) |
state | 선택 항목. 애플리케이션이 요청 및 리디렉션 응답 간 상태를 유지하는 데 사용하는 문자열입니다. 전송한 정확한 값은 사용자가 애플리케이션의 액세스 요청에 동의하거나 거부한 후 redirect_uri의 해시(#) 프래그먼트에 있는 name=value 쌍으로 반환됩니다. 이 매개변수는 사용자를 애플리케이션 내 올바른 리소스로 안내하고 임시값을 전송하며 교차 사이트 요청 위조를 방지하는 등의 용도로 사용할 수 있습니다. |
login_hint | 선택 항목. 애플리케이션이 인증을 시도하는 사용자를 알고 있는 경우 이 매개변수를 사용하여 Google 인증 서버에 힌트를 제공할 수 있습니다. 서버는 힌트를 사용하여 로그인 양식의 이메일 입력란을 미리 채워 놓거나 적절한 멀티 로그인 세션을 선택함으로써 로그인 흐름을 단순화합니다. |
용어 | 설명 | 예시 |
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
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