PKCE란 그리고 Web Crypto API란

김민주·2025년 2월 21일

PKCE(Proof Key for Code Exchange)란?

Oauth2.0의 Authorization Code Grant flow에서 코드교환의 보안이 강화된 방식.
기존 흐름에서는 Authorization code를 받는데 공격자가 이를 code를 탈취해서 access_token을 발급할수 있기 때문에 2.1버전에서 PKCE라는 추가 보안방식을 채택함

public client에서 client secret 없이 안전하게 authorization code를 쓰기 위한 방법
기존 파라미터에서 code verifier와 code challenge가 추가됨.

  • code verifier: 랜덤스트링값
  • code challenge: hash 알고리즘(code_challenge_method)으로 code verifier을 해싱한 후 base64로 인코딩한 값
    키클락 콘솔에서 PKCE 알고리즘 지정 가능

PKCE 흐름

  1. 클라이언트가 code verifier를 생성하면
  2. code_challenge_method를 통해 code_challenge로 변환
  3. 클라이언트가 로그인요청(/auth) 이때 verifier와 challenge 두개의 값을 같이 담아서 보내야함
  4. 로그인 시 keycloak이 authorization code를 응답으로 반환
  5. 클라이언트가 code_verifier를 포함해서 authorization code를 키클락에게 전송함
  6. 인증서버(키클락)가 code_verifier를 검증해서 access_token 발급함

해커가 중간에서 인증코드를 가로채도 code_verifier가 없으면 토큰을 발급할 수 없는 방식
토큰 갱신시에는 영향이 없지만 로그인시에 보안 강화된 방식




keycloak 버전 26.0.0 업그레이드 시 keycloak.js의 버전 업그레이드도 필요.
keycloak.js의

function createUUID() {
        if (typeof crypto === "undefined" || typeof crypto.randomUUID === "undefined") {
            throw new Error("Web Crypto API is not available.");
        }

        return crypto.randomUUID();
    }

UUID를 만들기 위해서는 Web Crypto API를 사용하여야함

Web Crypto API란?

웹 브라우저에서 암호화와 보안 기능을 구현할 수 있도록 해주는 자바스크립트 API로 W3C에서 정의한 오픈 표준임.

하지만, Web Crypto API는 SecureContext에서만 사용할 수 있기 때문에 localhost 또는 https로 접속한 사이트에서만 사용 가능
즉, http 환경에서 사용이 불가하고 사용하려면 localhost환경이어야함
http 환경에서 내 ip 또는 도메인주소에서는 동작하지않음.

Web Crypto API에서 중요한 기능인 crypto.subtle(SubtleCrypto)은 브라우저가 강력한 보안이 적용된 환경(HTTPS)에서만 사용되며, crypto.subtle(SubtleCrypto)은 비대칭 암호화, AES, SHA-256 해시 등 중요한 보안 기능을 제공함

Web Crypto API가 사용되는 경우, SHA-256 해싱 연산을 위해 crypto.subtle.digest()를 사용
예를들면 PKCE처리할 때 crypto.subtle.digest("SHA-256")를 사용하여 code_verifier를 code_challenge로 변환함

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글