인증&보안

OAuth 2.0

iKay 2020. 8. 11. 23:01
반응형

1. OAuth 2.0 이란?

 

OAuth 2.0 은 authorization을 위한 industry standard 프로토콜로써, resource owner를 대신해 3rd party 애플리케이션이 API를 통해 access 할 수 있게 한다

 

앱에 로그인 할 때 구글 로그인을 해본 경험이 있을 것이다. 이 때, 사용되는 것이 OAuth 2.0 이다. 앱에 로그인 할 때 앱 대신 구글에 로그인 함으로서, 3rd party 앱에게 access token을 전달하고, 앱은 access token을 통해 구글로부터 나에 대한 정보(email, 이름)등을 가져올 수 있다.

 

OAuth 2.0을 이해하기 위해 role의 정의, 전체적인 flow를 이해하는 것이 중요하다. 이것들에 대해 조금 더 자세히 알아보자.

 

2. OAuth 2.0 role 구성

OAuth 2.0에는 4가지 role이 있다. 우선 이 role을 이해해야 OAuth 2.0 flow를 쉽게 이해할 수 있다.

 

A. resource owner

client(3rd party 앱)를 사용하는 엔드 유저를 일컫는다. client에게 resource server에 있는 resource를 제한적으로 접근 할 수 있게 허락하는 과정이 필요하다. 제한적으로 접근이란, scope(resource 접근 범위)를 말한다.

 

B. resource server

rosurce owner resource를 제공하는 서버이다. client가 access token을 통해 resource에 접근하는 것이 허용된다.

 

C. client

우리가 개발해야 하는, end user가 사용하는 3rd party 앱을 일컫는다. resource owner 대신 resource server에 접근하는 주체이다. client라는 단어 때문에 헷갈릴 수 있는데, 프론트엔드(웹 브라우저 자바스크립트 앱, 모바일 앱, 데스크톱 앱 등) 뿐만 아니라 앱을 구성하는 모든 구성이 포함될 수 있다. 예를 들어, client는 frontend server, backend server의 조합으로로 구성될 수도 있다.

 

D. authorization server

client에게 access token 또는 refresh token도 함께 발행하는 서버이다. access token resource owner가 성공적으로 authenticate하고 authorization을 확인 후에 발행된다. 또는 refresh token에 의해 access token이 재발행될 수 있다.

 

 

3. OAuth 2.0 flow

OAuth 2.0 어떻게 진행되는지 flow 살펴보자. OAuth 2.0을 적용하는 입장에서 이 flow를 잘 이해하는 것이 매우 중요하다고 생각한다. OAuth 2.0 provider에 따라 flow가 따라 조금씩 다를 수 있지만, 크게 다르지 않다. 그래서 구체적인 예와 함께 설명하는 것이 이해하기에 더 쉬울 것 같아서 구글 OAuth 2.0 flow(https://developers.google.com/identity/protocols/oauth2#scenarios) 를 참고해 설명한다.

 

 

 

 

(A) user가 client에 접근해서 구글 로그인 버튼을 클릭하면, 구글 로그인 화면으로 redirect 되도록 한다.

 

(B) 로그인을 성공하면 callback으로 client는 authorization grant를 받는다. client가 authorization grant를 받을 수 있게 redirection_url을 미리 정확히 설정해두어야 한다. authorization grant는 client가 access token을 얻기 위해 일회성으로 사용되는 credential이다. authorization grant 종류가 여러가지(참고: https://oauth.net/2/grant-types/) 있는데 구글의 경우 authorization grant로 authorization code를 사용하는 것으로 보이고 다른 곳에서도 현재로써 가장 흔하게 사용되는 방법인 것 같다.

 

(C) authorization code를 이용해 token과 교환한다. token을 발급 받는다. token에는 access token과 refresh token이 있다.

 

(D) access token을 이용해서 resource owner(user) 를 대신해서 resource server(Google Server)에 있는 정보를 Google API를 통해 접근 가능하다. 구글의 경우 http header의 Authorization 필드에 "Bearer {access_token}"을 넣어서 접근 가능(https://developers.google.com/identity/protocols/oauth2/web-server#callinganapi)하다.

 

4. Access Token과 Refresh Token

access token은 client가 resource owner 대신 API로 resource에 접근할 때 사용되는 credential 이다. token은 scope(resource access 범위), duration(언제 만료되는지)가 명시되어 있다. duration이 짧은 편이다.

 

refresh token은 access token을 발급받기 위한 credential이다. refresh token은 authorization server에 의해 client에게 발급되고 새로운 access token을 발급받는데 사용된다. 보통 duration이 긴 편이다. access token을 발급 받기 위해 사용되기 때문에 resource server로 resource를 가져올 때 사용되지 않는다.

 

아래 그림을 참고하면 더 이해하기 쉬울 것 같다.

 

 

 

 

 

 

반응형

'인증&보안' 카테고리의 다른 글

TLS Certificates  (0) 2020.08.20