본문 바로가기

GAB STORY

일상 속 소소한 순간들과 개발 공부 과정에서의 다양한 경험들을 담아낸 공간입니다.
DEVELOPE/Etc

OAuth2.0

by 갑스토리 2020. 8. 1.

Google OAuth2.0이란?

OAuth 2.0은 다양한 플랫폼 환경에서 권한 부여를 위한 산업 표준 프로토콜입니다. OAuth 2.0은 페이스북이나 구글의 아이디로 제 3의 서비스에 로그인해서 등록되어 있는 정보( 친구 목록 )나 기능( 담벼락 글쓰기 )에 접근할 수 있는 권한을 제어하기 위한 표준 프로토콜입니다.

용어

 

용어 설명  
Resource owner Resource Server의 계정을 소유한 일반 사용자 notice
Client Resource owner을 대신해 인증과 자원을 사용할 수 있도록 제공하는 Client 티스토리
Authorization Server Resource owner을 인증하고 리소스 접근 권한을 Client에게 임명합니다.

Google
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

댓글