JWT 비대칭 서명 검증 개요
JWT(JSON Web Token)는 인증·인가에 널리 쓰이는 토큰 형식입니다. HMAC-SHA256(HS256)은 같은 비밀키로 서명·검증하지만, RS256·RS384·RS512·PS256·ES256·ES384 같은 비대칭 알고리즘은 개인키로 서명하고 공개키로 검증합니다. OAuth 2.0·OpenID Connect의 ID 토큰은 거의 비대칭 서명을 사용하며, 공개키는 /.well-known/jwks.json에 JWKS 형태로 노출됩니다.
검증 단계
- 토큰을
.로 분리해 header / payload / signature 세 부분을 얻습니다. - header의
alg와kid를 확인합니다. - JWKS에서
kid와 일치하는 키를 찾거나 PEM 공개키를 사용합니다. - Web Crypto API의
crypto.subtle.importKey로 키를 임포트합니다. crypto.subtle.verify로"header.payload"바이트에 대한 서명을 검증합니다.- payload의
exp(만료)·nbf(유효 시작)·iat를 확인합니다.
알고리즘별 차이
RS 계열은 RSASSA-PKCS1-v1_5, PS는 RSA-PSS, ES는 ECDSA입니다. 같은 RSA 키여도 서명 방식이 다르므로 토큰의 alg와 키의 사용 알고리즘이 정확히 매칭되어야 합니다. ECDSA의 경우 JOSE 표준은 R||S 단순 연결 형식이므로 ASN.1 DER 형식이 아님을 주의하세요. 본 도구는 Web Crypto API가 요구하는 형식 그대로(JOSE 형식)을 전달합니다.
보안 주의
JWT 검증 라이브러리들이 과거 가장 많이 당한 취약점은 토큰의 alg를 그대로 신뢰해 "none" 또는 HS256으로 처리해 버린 것입니다. 운영 코드에서는 반드시 서버가 기대하는 알고리즘을 명시적으로 지정해 검증하고, 토큰이 임의로 alg를 바꿔 보내는 것을 거부해야 합니다.
자주 묻는 질문 (FAQ)
Q. 키는 외부 서버로 전송되나요?
A. 아니요. 검증은 전적으로 브라우저의 Web Crypto API로 처리되며 네트워크 통신이 발생하지 않습니다. 새로고침 시 입력 내용도 자동 저장되지 않습니다(localStorage 미사용).
Q. HS256 토큰도 검증되나요?
A. 이 도구는 비대칭 서명 전용입니다. HS256은 비밀키를 노출해야 하므로 별도 도구를 사용하세요.
Q. JWKS URL을 입력하면 안 되나요?
A. CORS 문제로 임의 URL을 가져올 수 없습니다. 발급처 사이트(예: https://accounts.google.com/.well-known/openid-configuration)에서 JWKS JSON을 복사해 직접 붙여넣어 주세요.