JWT RS256→HS256 키 컨퓨전 공격 (WEB-49)

WEB-49 JWT Key Confusion

JWT RS256→HS256 키 컨퓨전:
서버가 RS256 (RSA 공개키)을 사용하지만, 클라이언트가 보낸 alg 헤더를 신뢰하면, 공격자가 RS256을 HS256으로 변경하고 공개키를 secret으로 사용하여 유효한 서명을 생성할 수 있습니다. 공개키는 공개되어 있으므로 누구나 이 공격을 수행할 수 있습니다.

공격 메커니즘

Step 1: 원본 토큰 (RS256)
Header: {"alg":"RS256","typ":"JWT"}
Payload: {"user_id":1,"role":"user"}
Signature: RSA-sign(header.payload, private_key)

Step 2: 공격자가 토큰 변조
Header: {"alg":"HS256","typ":"JWT"} ← alg 변경
Payload: {"user_id":999,"role":"admin"} ← role 변경
Signature: HMAC-SHA256(header.payload, public_key) ← 공개키로 서명

Step 3: 서버가 검증
서버는 헤더의 alg: HS256을 보고 HMAC 검증 수행
공개키를 secret으로 사용하여 검증
서명이 일치하므로 ✓ 검증 성공!

서버의 공개키

UlNBLTIwNDgtUFVCTElDLUtFWS1EQVRBLVNJTVVMQVRJT04=

1단계: 정상 RS256 토큰 (공개용)

현재 RS256 토큰:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InVzZXIxIiwicm9sZSI6InVzZXIifQ.4NpvUUTqkNxbQAPW0GbmkPSO68VTFZtZk5jT403r7Hs

2단계: 공격자가 HS256으로 변조한 토큰

공개키를 secret으로 사용하여 HS256 서명된 admin 토큰을 생성합니다.

3단계: 변조된 토큰 검증