OAuth2.0 개념
- OAuth는 구글, 페이스북, 카카오톡으로 로그인이 가능하도록 하는 API이다.
- 잘 활용하면 세션관리, 개발 비용, 운영 비용을 줄일 수 있다.
- Open Authorization == OAuth
- 제 3의 앱이 자원의 소유자인 서비스 이용자를 대신하여 서비스를 요청할 수 있도록 자원 접근 권한을 위임하는 방법이다.
- 인증을 위한 오픈 표준 프로토콜이다.
- OAuth1.0 과 OAuth2.0
- 1.0 : 웹 애플리케이션 이외의 애플리케이션(안드로이드, ios 등)에서는 사용하기 곤란함
- 2.0 : 보안강화를 위한 Access Token Life-time 을 지정하여 사용가능
OAuth2.0 용어
- User
- Service Provider에 계정을 가지고 있으면서, Consumer를 이용하려는 사용자
- Service Provider
- OAuth를 사용하는 Open API를 제공하는 서비스
- Consumer
- OAuth 인증을 사용하여 Service Provider의 기능을 사용하려는 애플리케이션이나 웹 서비스
- Request Token
- Consumer가 Service Provider에게 접근 권한을 인증받기 위해 사용하는 값이다.
- 인증이 완료된 후에는 Access Token으로 교환한다.
- Access Token
OAuth의 주체 4가지
- client
- resource owner의 보호된 자원에 접근하는 애플리케이션.
- 웹이나 앱이다.
- resource owner
- 자원 소유자. 보호된 자원에 접근하는 권한을 제공.
- 유저이다.
- resource server
- 요청을 수신하고 권한을 검증하여 결과(자원)을 응답.
- authorization server
OAuth2.0 동작방식 (1)
-
client -> resource server
-
resource sever -> client
- client ID, client secret 정보를 준다.
- 이때, 어떤 information만 요청할 것인지 scope를 지정해주는게 좋다.
-
1,2를 바탕으로 client에 client Oauth를 붙이면, 사용자가 이를 클릭한다.
-
resource owner -> client
- oauth 버튼을 누르면, client에서 어떤 정보가 필요하고 이를 승인해줄 것인지 묻는다.
- 승인 버튼을 누르면, resource owner는 server로 접속하여 해당 server에 로그인하고 정보 제공하는 것을 허락한다.
-
server -> client
- 승인이 완료되면, server는 client에게 code(비밀번호)를 제공한다.
-
client -> server
- client는 code, id, secret값을 server로 보낸다.
- 이때 허락받은 client가 맞는지 확인한다.
-
server -> client
- server는 client에게 access token을 발급한다.
- client는 받은 access token을 보관해야한다.
- 최초로 발급된 access token response에는 refresh token이 함께 전송된다.
- access token 만료시에는 동작하지 않기 때문에, refresh token을 활용하여 주기적으로 업데이터 되는 access token을 받아와서 resource server에 data 요청을 해야한다.
- refresh token은 access type을 offline으로 설정할 경우에만 해당되어 발급되므로 유출되지 않도록 보관해야 한다.
- refresh token을 담아 POST 요청하면 새로운 access token을 받아올 수 있다. (android에서 getAccessToken(), refresheToken() 과 같은 함수로 활용가능)
-
client
- client는 access token을 통해 resource server에 사전 승인된 정보를 언제든지 얻을 수 있게 된다.
- 공식문서에 data를 요청하는 url 파라미터 양식을 활용한다.
-
client
- owner의 정보를 받아온 client는 이를 활용하여 owner에게 service를 제공할 수 있게 된다.
OAuth2.0 동작방식 (2)
- resource owner -> client -> authorization server
- resource owner는 client를 통해 authorizaion server에 인증을 받고 권한을 허가한다.
Method: GET
https://{인증서버}/oauth/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}
-
authorization server -> client
- authorization server는 권한 허가와 authorization code를 발급한다.
- code를 담은 redirect URL을 통한 응답으로 발급한다.
{리다이렉트 URL}?code={code}
-
전달받은 {리다이렉트 URL}
를 통해 브라우저는 client backend 서버로 redirect 되며 authorization code를 전달한다.
-
client backend는 {인증서버}로 client backend에서 가지고 있는 client_id, client_secret과 리다이렉트로 전달받은 grant type, authorization code, {리다이렉트 URL}을 보낸다.
-
{인증서버}로부터 access token을 발급받는다.
OAuth2.0 특징
구글 OAuth2.0
- api 라이브러리 에서 사용하고자하는 api를 실행시킨다.
- 당연히 accessToken을 발급 받은 뒤에 사용가능하다.
- 사용자 인증 정보 페이지에서 api 및 oauth client id를 발급받아 secret.gradle에 정보를 입력한다.
좋은 글 감사합니다. 정말 깔끔하게 정리해주셨네요.
덕분에 개념을 정리하는 데 도움이 많이 되었습니다!