설명
JWT를 디코딩할 때 서명 검증을 비활성화하면 공격자가 임의로 만든 토큰도 애플리케이션이 신뢰할 수 있습니다. PyJWT의 jwt.decode(..., options={"verify_signature": False}) 같은 설정은 인증 우회나 권한 상승으로 이어질 수 있습니다.
잠재적 영향
- 공격자가 임의의 사용자 ID, 역할, 권한 클레임을 포함한 토큰을 만들 수 있습니다.
- 만료, audience, issuer 검증도 함께 우회될 가능성이 커집니다.
- 인증 경계가 토큰 내용 조작만으로 무너질 수 있습니다.
해결 방법
- 운영 코드에서
verify_signature=False를 사용하지 않습니다. jwt.decode()호출에 검증 키와 허용 알고리즘을 명시합니다.exp,iss,aud같은 핵심 클레임도 함께 검증합니다.- 테스트 전용 디코딩 로직은 운영 경로와 분리합니다.
예시
변경 전
python
import jwt
def bad_decode(token):
return jwt.decode(token, options={"verify_signature": False})
변경 후
python
import jwt
def safe_decode(token, key):
return jwt.decode(token, key, algorithms=["HS256"], audience="api")
설명:
- 변경 전: 토큰 서명을 검증하지 않습니다.
- 변경 후: 키, 알고리즘, audience를 명시해 토큰 무결성과 대상 서비스를 검증합니다.