-
OAuth2 PKCE 정리Web/Auth 2020. 7. 5. 00:30
POST https://authorization-server.com/token grant_type=authorization_code &client_id=CKw2bkLjI-6Bs3wwgl7OBUgz &client_secret=F3n7fXMtVwGJ5lXqTmwUHoNUp6O0qN1YYjkRkrQ7ZD6Kbnvt &redirect_uri=https://www.oauth.com/playground/authorization-code-with-pkce.html &code=Uyz9EU-QeRfW4Kt-nUnq4s7NxMuFjJLhT3DVHD6VyLn8Mc5Q &code_verifier=EAp91aanXdoMcoOc2Il55H3UDDIV909k9olEEcl6L24J6_9X
Proof Key for Code Exchange
PKCE는 OAuth2의 Authorization Code Grant flow에서 좀 더 강화된 보안을 제공해주는 Authorization Code Grant flow의 확장 버전입니다.
Authorization Code를 먼저 정리하고 PKCE를 정리해보도록 하겠습니다.
Authorization Code Grant Flow
위 그림은 Authorization Code Flow를 나타내는 그림입니다.
용어 정리
- Client: Resource를 요청하는 주체입니다. 예를들어, 디바이스나 WAS 등이 있습니다.
- Resource Owner: Client가 요청하고자 하는 리소스의 소유자입니다. 예를들어, Client 서비스를 이용하는 사용자가 있습니다.
- User-Agent: Authorizaiton Code Grant Flow는 http redirection 베이스로 Authorization을 진행하기 때문에 Resoure-Owner의 User-Agent와 상호작용합니다. 예를 들어, 웹 브라우저가 있습니다.
- Authorization Server: OAuth2를 제공하는 서버입니다.
A. Client가 Resource Owner의 Authorization를 요청하기 위해 Authorization Server로 redirect를 시킵니다.
User-Agent -> Authorization Server 요청
https://authorization-server.com/authorize? response_type=code &client_id=CKw2bkLjI-6Bs3wwgl7OBUgz &redirect_uri=https://www.oauth.com/playground/authorization-code-with-pkce.html &scope=photo+offline_access &state=w7pneFNa8aF2i5f_
B. 유저가 인증을 합니다.
C. 인증이 성공하면 Redirect Url로 Authorization Code와 state를 전달합니다.
A단계에서 전달했던 redirect_url로 Code와 State가 전달됩니다.
https://www.oauth.com/playground/authorization-code-with-pkce.html? state=w7pneFNa8aF2i5f_ &code=Uyz9EU-QeRfW4Kt-nUnq4s7NxMuFjJLhT3DVHD6VyLn8Mc5Q
D ~ E. Client는 전달받은 Authorization Code로 Access Token을 요청합니다.
POST https://authorization-server.com/token grant_type=authorization_code &client_id=CKw2bkLjI-6Bs3wwgl7OBUgz &client_secret=F3n7fXMtVwGJ5lXqTmwUHoNUp6O0qN1YYjkRkrQ7ZD6Kbnvt &redirect_uri=https://www.oauth.com/playground/authorization-code-with-pkce.html &code=Uyz9EU-QeRfW4Kt-nUnq4s7NxMuFjJLhT3DVHD6VyLn8Mc5Q
PKCE
PKCE는 위에서 정리한 flow에 Code Verifier와 Code Challenge를 추가하여 Authorization Code Grant Flow에서 Authrozization Code가 탈취당했을 때 Access Token을 발급하지 못하도록 막아줄 수 있습니다.
Code Verifier와 Code Challenge는 Client가 생성합니다.
Code Verifier 생성 규칙
48 ~ 128 글자수를 가진 Random String.
A-Z a-z 0-9 -._~ 문자들로만 구성됨
Code Challenge 생성 규칙
선택한 Hash 알고리즘으로 Code Verifier를 Hashing 한 후 Base64 인코딩을 한 값
ex) Base64Encode(Sha256(Code Verifier))1. 위의 A 단계에서 Code Challenge와 hash 함수 종류를 쿼리 파라미터에 추가
https://authorization-server.com/authorize? response_type=code &client_id=CKw2bkLjI-6Bs3wwgl7OBUgz &redirect_uri=https://www.oauth.com/playground/authorization-code-with-pkce.html &scope=photo+offline_access &state=w7pneFNa8aF2i5f_ &code_challenge=HVoKJYs8JruAxs7hKcG4oLpJXCP-z1jJQtXpQte6GyA &code_challenge_method=S256
2. 위의 D ~ E 단계에서 Code Verifier를 전달
POST https://authorization-server.com/token grant_type=authorization_code &client_id=CKw2bkLjI-6Bs3wwgl7OBUgz &client_secret=F3n7fXMtVwGJ5lXqTmwUHoNUp6O0qN1YYjkRkrQ7ZD6Kbnvt &redirect_uri=https://www.oauth.com/playground/authorization-code-with-pkce.html &code=Uyz9EU-QeRfW4Kt-nUnq4s7NxMuFjJLhT3DVHD6VyLn8Mc5Q &code_verifier=EAp91aanXdoMcoOc2Il55H3UDDIV909k9olEEcl6L24J6_9X
3. Authorization Server가 A단계에서 전달했던 code_challenge와 D ~ E 단계에서 전달한 code_verifier를 해싱하고 base64 인코딩하여 비교.
4. 검증이 되면 Access Token 발급
참고
https://tools.ietf.org/html/rfc6749#section-4.1
https://www.oauth.com/playground/authorization-code-with-pkce.html에서 PKCE의 과정을 체험 해보실 수 있습니다.