Inertia

oauth2

요즘 대부분의 사이트의 회원가입/로그인 화면을 보면 Facebook/Google/Twitter를 통해서 가입 및 로그인을 할 수 있게 만들어 놨다. 이것이 흥한 이유는 매번 같은 정보를 기입해야 하는 유저들이 버튼 한번만 클릭하면 되는 편리함 + 중/소 사이트들의 security에 불안을 느끼기 때문이기도 함.

이러한 것을 가능하게 해주는 것이 OAuth란 스펙인데 현재는 2.0이 대부분임.

OAuth2

OAuth가 없던 시절에 이런것을 하려고 하면, 우선 나의 앱(client)이 페이스북 계정과 연동하게 하려면 아이디/패스워드를 클라이언트에게 노출 될 수밖에 없고, 이렇게 되면 내가 페북의 비번관리를 잘못하면 비번이 노출되게 되고 그러면 페이스북의 비번을 뚫리게 되므로 보안적으로 허술해짐.

그래서 고안한 것이 OAuth인데, 비번 대신에 access_token 을 발급해주고, 필요한 정보가 있으면 access_token으로 쿼리를 하면 답을 주겠다는 것임. 아래 flow 참고.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+

facebook/google/twitter로서는 당연히 자신의 계정이 많으 퍼질수록 좋음. 그래서 3rd party가(sign up을 쉽게 하고자 하는) 자신의 앱을 등록할 수 있게 해줌. 이때 app idapp secret 을 발급하주고, 이것을 이용해서 oauth의 endpoint로 로그인을 요청하면 로그인 결과를 redirect_uri로 리턴해줌. 리턴시 access token을 보내주는 flow!

fb/google/twitter로서도 app_id로 3rd party들을 컨트롤할 수 있으니 이보다 계정 오너로서는 이보다 더 좋을순 없음. 점점 모든 데이터는 빅 플레이어들에게 유리하게 가는 구조.

Example : Google OAuth

이해를 돕기 위해 구글 web Oauth를 구현해 보자. google oauth reference 를 띄어놓고..

  1. Google cloud platform console에 로그인
  2. oauth를 사용하기 위한 project 생성
  3. 생성후, 해당 프로젝트의 메뉴에서 API&services>credential을 선택후, credential 생성.
    1. web application 선택
    2. origin 과 redirect uri 등록
  4. 위의 과정에서 client_idclient_secret이 발급이 되었다. 이제 이것을 이용해서 로그인을 할차례.
  5. 아래의 url로 구글 인증을 요청하고, 아뒤/비번을 맞게 입력했다면 redirect_uri로 token을 uri에 붙여서 보낸다. 이 토큰을 이용해서, 이메일/이름/프로파일 아이콘 등을 요청할 수 있다.

    https://accounts.google.com/o/oauth2/v2/auth?client_id=`client_id`&response_type=token&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile&redirect_uri=`your_redirect_uri`

References