-
OAuth 2 요약oauth2 2022. 2. 4. 00:18
OAuth2 는 생활 코딩의 OAuth 2.0 설명이 가장 잘 되어 있고 적극 추천한다. 동영상을 보면서 이해한 부분을 정리한다.
용어
용어가 혼동되지 않도록 잘 구분해야 한다.
- Client: 내가 운영하는 사이트 (예: https://my.site)
- Resource Server: 내 사이트에서 이용할려는 외부 서비스 (예: facebook login)
- Resource Owner: 내 사이트에 접속해 외부 서비스를 이용할려는 사용자
편의상 내가 운영 관리하는 Site 를 Client 로 생각하자. 우리(?)는 보통 Site 개발자니 설명은 Client 중심으로 한다.
등록
어떤 사용자가 내 사이트에 로그인 후 생성한 컨텐츠를 Resource Server (facebook) 에 업로드하고 싶어한다고 상상하자. Client(내 사이트) 에서 Resource Server(facebook) 의 기능을 쓰기 위해서는 등록 과정이 필요하다.
- Client 가 Resource Server 에 등록 신청을 하면, Resource Server 에서는 Client Id, Client Secret 을 발급해 준다.
- Client 는 Resource Server 에 이용 등록 신청할 때 Redirect URL 정보도 남겨야 한다. (나중에 Resource Server 에서 남겨놓은 Redirect URL 로 redirect 호출해 준다.)
Resource Owner 승인
Resource Owner 가 내 사이트에서 만든 컨텐츠를 facebook 에 업로드 하려고 한다면..
- 내 사이트에서는 Resource Server 로 갈 수 있는 Link 를 Resource Owner 에게 제공한다. Link 는 아래와 같은 형태가 될 것이다. scope 은 우리가 Resource Server 에서 사용할 기능(업로드 같은..)을 의미한다.
https://facebook.com/?client_id=1&scope=B,C&redirect_uri=https://my.site/callback
- Resource Owner 는 (로그인이 안된 상태라면) 자기 facebook 계정으로 로그인한다.
- 로그인이 성공하면 Resource Server 은 Client 에서 URL 로 요청한 client_id, redirect_uri 정보가 일치하는지 확인한다.
- client_id, redirect_uri 정보가 일치하면 Resource Server 는 scope 으로 요청한 권한(B, C)을 Client 에게 부여해도 괜찮을지 Resource Owner 에게 물어보는 화면을 제공한다.
- Resource Owner 가 Client 에게 권한 부여를 승인하면, Resource Owner 가 해당 scope 의 권한을 Client 에게 허용하였다는 정보가 Resource Server 에 남게된다.
Resource Server 승인
Resource Owner 가 승인했으니, Resource Server 에서 Client 에 바로 accessToken 을 발급해주면 좋을테지만.. 바로 이렇게 하지는 않고..
- Resource Server 에서는 Resource Owner 의 웹 브라우저에게 authorization code (임시 비밀번호) 정보가 담긴 URL 을 전송한다.
Location: https://my.site/callback?code=3
- Resource Owner 의 웹 브라우저는 https://my.site/callback?code=3 으로 이동한다.
- 이제 Client 도 authorization code=3 을 알게 된다. Client 는 Client Secret, authorization code 정보 등을 담아 Resource Server 에 직접 접속해 accessToken 을 요청한다.
https://facebook.com/token?grant_type=authorization_code&code=3&client_secret=2&client_id=1&redirect_uri=https://my.site/callback
AccessToken 발급
- Resource Server 는 Client 가 보낸 정보(authorization_code, Client Secret, ...) 가 일치하면 accessToken 을 발급해 준다. 이때 임시 비밀번호로 사용했던 authorization code 정보는 삭제하고 accessToken 정보를 Resource Server 에 남긴다.
- 이제 Client 는 facebook user_id:1 에 대해 B,C scope 을 이용할 수 있는 accessToken 을 확보했다.
API 호출
위에서 확보한 accessToken 을 이용해 Resource Server 에서 제공하는 API 를 사용할 수 있다.
Http request header Authorization 에 accessToken 정보를 넣어 요청한다.
Authorization : Bearer AAAARqmfmHJ8bZ2435wePZA4...