본문 바로가기
MSA

Proof Key for Code Exchange (PKCE, 픽시)

by xogns93 2024. 12. 17.

Proof Key for Code Exchange (PKCE, 픽시)OAuth 2.0의 Authorization Code Grant 흐름에서 발생할 수 있는 인증 코드 탈취 공격을 방지하기 위해 만들어진 보안 강화 메커니즘입니다.

주로 공개 클라이언트(Public Clients) 환경에서 사용되며, 예를 들어 모바일 앱, SPA(Single Page Application), 데스크탑 애플리케이션과 같이 클라이언트 비밀키를 안전하게 저장할 수 없는 환경에서 필요합니다.


1. PKCE(픽시)가 필요한 이유

인증 코드 탈취 공격

OAuth 2.0의 Authorization Code Grant 흐름에서 인증 코드(Authorization Code)는 클라이언트가 액세스 토큰을 요청할 때 사용됩니다. 하지만 이 코드가 중간자 공격이나 악의적인 애플리케이션에 의해 탈취될 경우, 액세스 토큰이 불법적으로 발급될 수 있습니다.

  • 문제:
    클라이언트가 클라이언트 비밀키를 저장할 수 없는 환경(예: 모바일 앱, JavaScript 클라이언트 등)에서 이 코드 탈취를 방지하기 어렵습니다.

  • 해결책:
    PKCE인증 코드 요청과 액세스 토큰 요청을 연결하는 암호화된 검증값을 사용하여 인증 코드 탈취를 방지합니다.


2. PKCE의 동작 원리

PKCE는 Code VerifierCode Challenge라는 두 가지 값을 사용합니다.

2.1 단계별 흐름

  1. 클라이언트: Code Verifier 생성

    • 클라이언트가 임의의 문자열(랜덤 문자열)을 생성합니다. 이를 Code Verifier라고 합니다.
  2. 클라이언트: Code Challenge 생성

    • Code Verifier를 SHA256 해시 알고리즘을 이용해 Code Challenge를 생성합니다.
    • 또는 해시 없이 그대로 사용(Plain 방식)도 가능합니다.
  3. 인증 코드 요청

    • 클라이언트가 Code Challenge와 함께 Authorization Server에 인증 코드 요청을 보냅니다.
  4. 인증 서버: Code Challenge 저장

    • 인증 서버는 Code Challenge를 저장하고 사용자 인증 후 인증 코드를 반환합니다.
  5. 액세스 토큰 요청

    • 클라이언트가 인증 코드와 함께 원래의 Code Verifier를 인증 서버에 전달합니다.
  6. Code Challenge 검증

    • 인증 서버는 전달받은 Code Verifier로 Code Challenge를 검증합니다.
      (해시를 다시 계산하여 원래의 Code Challenge와 일치하는지 확인)
  7. 액세스 토큰 발급

    • 검증에 성공하면 액세스 토큰을 발급합니다.

3. PKCE 흐름 예시

1. Code Verifier와 Code Challenge 생성 (클라이언트)

클라이언트가 랜덤 문자열(Code Verifier)을 생성한 후, 이를 SHA256 해시를 사용해 Code Challenge로 변환합니다.

Code Verifier: abcd1234efgh5678ijkl9012mnop3456qrstuv7890
Code Challenge: SHA256(Code Verifier) => sS6Zx3Kxj5N7wGhS3Kz3Z==

2. 인증 코드 요청

클라이언트가 인증 요청 시 Code Challenge를 함께 전달합니다.

GET /authorize?
   response_type=code&
   client_id=example_client&
   redirect_uri=https://example.com/callback&
   code_challenge=sS6Zx3Kxj5N7wGhS3Kz3Z==&
   code_challenge_method=S256

3. 인증 코드 발급

인증 서버는 Code Challenge를 저장하고 인증 후 인증 코드를 반환합니다.


4. 액세스 토큰 요청

클라이언트가 Code Verifier와 함께 액세스 토큰을 요청합니다.

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&
code=AUTH_CODE_FROM_SERVER&
redirect_uri=https://example.com/callback&
code_verifier=abcd1234efgh5678ijkl9012mnop3456qrstuv7890

5. 검증 후 액세스 토큰 발급

  • 인증 서버는 받은 Code Verifier로 Code Challenge를 검증합니다.
  • 검증이 성공하면 액세스 토큰을 발급합니다.

4. PKCE의 장점

  1. 인증 코드 탈취 방지

    • Code Verifier와 Code Challenge의 검증 과정을 통해 탈취된 인증 코드를 악용할 수 없습니다.
  2. 보안 강화

    • 클라이언트 비밀키를 저장할 수 없는 환경(모바일 앱, SPA)에서도 안전하게 사용할 수 있습니다.
  3. 간단한 구현

    • 서버와 클라이언트 간에 추가적인 값만 검증하면 되므로 구현이 복잡하지 않습니다.

5. PKCE 사용 환경

  • 공개 클라이언트(Public Clients)

    • 클라이언트 비밀키를 저장할 수 없는 환경
    • 모바일 애플리케이션, SPA(React, Vue.js 등), 데스크탑 애플리케이션
  • 보안이 강화된 OAuth 2.0 인증

    • OAuth 2.1에서는 PKCE를 모든 클라이언트에 필수로 요구합니다.

6. 결론

PKCE (Proof Key for Code Exchange)는 인증 코드 탈취를 방지하기 위해 만들어진 보안 강화 메커니즘입니다.

  • Authorization Code Grant를 보완하여 클라이언트 비밀키 없이도 안전하게 액세스 토큰을 요청할 수 있습니다.
  • 특히 모바일 앱이나 SPA와 같이 공개 클라이언트 환경에서 필수적으로 사용됩니다.

OAuth 2.1에서는 PKCE 사용이 표준이기 때문에 꼭 적용해야 하는 중요한 보안 메커니즘입니다.