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가 없으면 토큰을 발급할 수 없는 방식
토큰 갱신시에는 영향이 없지만 로그인시에 보안 강화된 방식
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를 사용하여야함
웹 브라우저에서 암호화와 보안 기능을 구현할 수 있도록 해주는 자바스크립트 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로 변환함