ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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://oauth.net/2/pkce/

    https://www.oauth.com/playground/authorization-code-with-pkce.html에서 PKCE의 과정을 체험 해보실 수 있습니다.

    댓글

Designed by Tistory.