동기
OAuth 2.0의 절차를 글로 정리해 두자. 다음 글은 생활코딩 에서 알려주신 OAuth 2.0 을 정리한 것입니다.
역할
- Resource Owner : User 사용자 - 우리의 서비스를 이용하는 사용자 및 구글,페이스북 등의 서비스도 함께 이용하는 사용자.
- Client : 우리의 서비스
- Resource Server(Authorization Server) : 우리의 서비스가 제어하고자 하는 자원, 우리의 서비스가 연동하려는 User의 서비스들 (ex. google, facebook)
Resource Server 등록
- Client는 Resource Server에 우리 Client를 등록하게 됩니다. 이때 service 이름과 redirect_url을 입력 후 등록을 하면 Resource Server는 client_id, client_secret, redirect_url을 알려줍니다.
Access Token의 발급
- Resource Owner 는 Client 인 우리 서비스에 접속합니다. (이때, 우리 서비스는 Resource Server를 연동하는 서비스입니다.) 사용자가 나의 서비스에 와서 글을 남겼다. -> 구글 캘린더에 표시를 하던가 페이스북에 "글을 썼다" 또는 "글을 보았다" 등을 공유
- Client 는 "Login with Facebook, Login with Google" 등의 버튼을 보여줍니다. 이때, Resource Server의 B,C 기능을 이용하겠다고 가정합니다. 이 버튼의 링크는 다음과 같습니다.
https://resource.server/?client_id=1&scope=B,C&redirect_url=http://client/callback
여기서 redirect_url은 Client 에서 미리 구축해두고 있어야 합니다. - 위 버튼을 눌러 Resource Server에 접속이 되면 Resource Server은 Resource Owner에게 로그인 하라는 페이지를 보여주게 됩니다.
- Resource Owner가 로그인을 하게 됩니다.
- Resource Server는 이제 아까 url의 쿼리스트링과 Resource Server가 보유한 client_id와 redirect_url이 같은지 비교합니다.
- 같다면 다시 Resource Server는 Resource Owner 에게 해당 Client 서비스에게 B,C 기능을 열어주겠냐는 페이지를 보여줍니다.
- Resource Owner가 허용을 하게 되면 Resource Server는 authorization code(3 이라 칩시다)를 만들어 Resource Owner의 브라우저에게 다음과 같은 주소로 redirection 합니다.
응답할때 헤더에
Location: https://client/callback?code=3
값을 주면 웹브라우저에게https://client/callback?code=3
주소로 이동하세요 라고 명령하는 것이다. - Client에서
code=3
이라는 정보를 받게 되면authorization code=3
을 생성하게 됩니다. - Client에서는 다음과 같은 url로 Resource Server에 작접 Access Token 을 요청 하게 됩니다.
https://resource.server/token?grant_type=authorization_code&code=3&redirect_url=https://client/callback&client_id=1&client_secret=2
- Resource Server는 임시 비밀번호인 authorization code 와 client_id, client_secret, redirect_url을 확인해서 accesss_token을 만들어서 Client에 발급시켜 줍니다.
Refresh Token의 발급
- accesstoken 에게는 수명이 있습니다. 이때 손쉽게 accesstoken을 다시 발급 받을 수 있는 방법이 refresh_token 입니다.
- 보통은 accesstoken을 발급할때, refreshtoken을 발급해 줍니다.
- 수명이 끝난 access_token으로 API를 호출하게 되면 invalid 한 응답을 주게 됩니다.
- accesstoken이 수명이 다하면 Authorization Server에 전달하면 access\token을 다시 발급해 주게 됩니다.
- 예를 들어 구글의 경우에는 구글 API의 post 방식으로
client_id
,client_secret
,refresh_token
,grant_type=refresh_token
정보를 넘겨주면 다시 access_token을 발급 해 주게 됩니다.
API 활용
- 쿼리 스트링 : <API주소>/?accesstoken=<access\token>
- request header : Authorization: Bearer <access_token>
참고
https://www.youtube.com/playlist?list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-