현대 웹 아키텍처의 정교한 영역에서는 JSON 웹 서명(JWS) 는 OAuth 2.0 및 OpenID Connect와 같은 인증 프로토콜의 암호화 백본 역할을 합니다. 보안 엔지니어, 레드팀원, AI 연구자에게는 원시 인증 프로토콜을 JSON 웹 서명 디코딩 는 암호화 구현 결함 및 논리적 취약점으로 이루어진 복잡한 매트릭스의 진입점에 불과합니다.
개발자는 JWS를 신뢰할 수 있는 토큰 캐리어로 간주하지만, 보안 전문가들은 이를 주요 공격 표면으로 인식하고 있습니다. 토큰은 검증 로직만큼만 안전합니다. 토큰을 해독할 수 있다면 분석할 수 있고, 분석할 수 있다면 조작할 수 있습니다.
이 종합 가이드는 기본적인 온라인 디코더를 뛰어넘는 내용을 담고 있습니다. RFC 7515 사양을 자세히 분석하고, '심령 시그니처(CVE-2022-21449)'와 같은 중요한 취약점을 분석하며, 다음과 같은 차세대 AI 플랫폼이 어떻게 작동하는지 살펴봅니다. 펜리전트 는 JWS 논리 결함의 악용을 자동화하고 있습니다.

문자열 뒤에 숨겨진 엔지니어링: Base64Url 해체하기
수행 시 JSON 웹 서명 디코딩 작업을 수행하면 기술적으로는 Base64Url 인코딩을 사용합니다. 표준 Base64와 달리 JWS는 URL 안전 알파벳( + 와 함께 - 그리고 / 와 함께 _)를 생략하고 패딩 문자(=).
이러한 차이점을 이해하는 것은 사용자 지정 보안 도구를 구축하는 데 매우 중요합니다. 표준 Base64 디코더는 JWS 서명을 차단합니다.
구조
JWS는 다음과 같이 구성됩니다: BASE64URL(UTF8(JWS 헤더)) || '.' || BASE64URL(JWS 페이로드) || '.' || BASE64URL(JWS 서명)
공격자에게는 헤더 가 가장 흥미로운 부분입니다. 이는 다음을 지시합니다. 어떻게 로 설정하면 서버가 토큰을 처리해야 합니다.
| 필드 | 설명 | 보안 위험 |
|---|---|---|
alg | 알고리즘(예: HS256, RS256) | 중요. 다음과 같이 조작할 수 있습니다. 없음 또는 혼란스러울 수 있습니다(HMAC과 RSA). |
kid | 키 ID | 키를 조회하는 데 사용되는 경우 SQL 인젝션 또는 경로 탐색에 취약합니다. |
jku | JWK 설정 URL | 서버 측 요청 위조(SSRF) 및 키 인젝션에 취약합니다. |
cty | 콘텐츠 유형 | 중첩된 토큰에 사용되어 구문 분석의 복잡성을 추가합니다. |
강력한 도구 구축하기: Python 구현
웹 기반 디버거에 의존하는 것은 전문적인 작업 중에 운영 보안(OpSec)에 대한 자살 행위입니다. 오프라인의 스크립트 가능한 도구가 필요합니다. 아래는 다음을 위해 설계된 프로덕션 등급 Python 스크립트입니다. JSON 웹 서명 디코딩 토큰에 대한 패딩 오류를 정상적으로 처리하는 동시에 캡처된 트래픽에서 흔히 발생하는 문제입니다.
Python
`import json import base64 import sys
클래스 JWSDecoder: def init(self, token): self.token = token self.parts = token.split('.')
def _pad_base64(self, data):
"""Base64Url 디코딩에 올바른 패딩을 보장합니다."""
missing_padding = len(data) % 4
만약 missing_padding:
data += '=' * (4 - missing_padding)
데이터 반환
def decode_segment(self, segment):
try:
# URL 안전 문자를 표준 Base64 문자로 바꾸기
segment = segment.replace('-', '+').replace('_', '/')
padded = self._pad_base64(segment)
decoded_bytes = base64.b64decode(padded)
return json.loads(decoded_bytes)
예외를 e로 제외합니다:
반환 {"error": f"디코딩에 실패했습니다: {str(e)}", "raw": segment}
def analyze(self):
if len(self.parts) != 3:
반환 "잘못된 JWS 형식입니다. 3개의 별개의 파트를 예상했습니다."
header = self.decode_segment(self.parts[0])
payload = self.decode_segment(self.parts[1])
서명_헥스 = self.parts[2] # 서명은 바이너리이며, 원시 16진수/스트링으로 유지하는 것이 유용할 때가 많습니다.
반환 {
"Header": 헤더,
"Payload": 페이로드,
"Signature_Sample": signature_hex[:10] + "..."
}

사용법
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWRtaW4iOmZhbHNlfQ.InvalidSignatureForDemo" decoder = JWSDecoder(token) print(json.dumps(decoder.analyze(), indent=2))`
중요한 차이: 디코딩 대 검증
JWT 구현에서 가장 널리 퍼져 있는 보안 오류는 디코딩과 검증을 혼동하는 것입니다.
- 디코딩 은 Base64Url 문자열을 읽기 가능한 JSON으로 변환합니다. 누구나 이 작업을 수행할 수 있습니다.
- 인증 를 사용하여 서명을 다시 계산합니다.
alg헤더에 지정된 값과 서버의 비밀 키를 입력합니다.
애플리케이션이 JSON 웹 서명 디코딩 를 읽으려면 user_id 전에 서명을 확인하면 공격자는 페이로드를 수정하고 무단 액세스를 얻을 수 있습니다. 로직에서 이러한 "TOCTOU(Time-of-Check to Time-of-Use)" 스타일의 경쟁 조건은 미묘하지만 치명적입니다.
고급 익스플로잇: 그 너머 Alg: 없음
동안 Alg: 없음 공격은 잘 문서화되어 있으며, 최신 라이브러리는 기본적으로 이를 차단합니다. 하드코어 보안 엔지니어는 암호화 구현 결함 및 복잡한 로직 우회에 중점을 둡니다.
1. "심령 시그니처"(CVE-2022-21449)
2022년, Java의 타원 곡선 디지털 서명 알고리즘(ECDSA) 구현에서 치명적인 취약점이 발견되었습니다.
수학:
ECDSA 서명 검증에는 수학 방정식이 사용됩니다:
$$v = r^{-1}(zG + rQ) \mod n$$
여기서 $(r, s)$는 서명 쌍입니다.
결함:
구현에서 $r$ 또는 $s$가 0인지 확인하지 못했습니다. 공격자가 서명 값이 $r=0$ 및 $s=0$인 토큰을 수동으로 생성한 경우:
- 이 방정식은 $0 = 0$로 축소됩니다.
- 확인 결과가 반환됩니다. TRUE 에 대한 any 페이로드 및 any 공개 키.
공격자는 서명을 무효화하는 것만으로 모든 Java 15-18 시스템에서 인증을 완전히 우회할 수 있었습니다. 이는 수동 분석 및 디코딩이 중요한 이유를 강조합니다. 표준 라이브러리는 토큰을 거부하지만 보안 연구자는 다음을 확인해야 합니다. 왜 로직을 유지합니다.
2. 키 혼동 공격(HMAC 대 RSA)
이 공격은 서버의 신뢰를 악용하여 alg 헤더.
- 서버 기대치: 서버는 공개 키(RS256 확인용)와 개인 키(서명용)를 보유하고 있습니다.
- 공격: 공격자는 서버의 공개 키(다음에서 사용 가능)를 가져옵니다.
/jwks.json). - 위조: 공격자는 헤더를 다음과 같이 수정합니다.
HS256(대칭형 HMAC). - 실행: 공격자가 악성 토큰에 서명합니다. 공개 키 를 HMAC의 비밀로 사용합니다.
- 실패: 서버는 다음을 확인합니다.
HS256를 클릭하고 알려진 '키'(공개 키 파일)를 가져온 다음 해당 파일을 사용하여 HMAC 서명을 확인합니다. 검증이 통과됩니다.
3. JKU 헤더 주입
JWS 헤더에 다음이 포함된 경우 "jku": ""를 입력하고 서버가 이 URL에서 키를 가져와 서명을 확인하면 공격자가 확인 프로세스를 제어합니다. 공격자는 자신의 개인 키로 토큰에 서명하고 서버에 일치하는 공개 키를 찾을 수 있는 위치를 알려줍니다.
불가능을 자동화하기: 펜리전트를 통한 AI 기반 JWS 펜테스팅
인간 펜테스터의 경우 이러한 공격의 모든 순열을 검사하는 것은 매우 힘든 일입니다. 반드시 테스트해야 합니다:
- 알고리즘 혼동(RSA -> HMAC, ECDSA -> HMAC)
kid주입(SQLi, 디렉토리 탐색)jku화이트리스트 바이패스- 수백 개의 알려진 CVE(예: CVE-2022-21449)
여기에서 Penligent.ai 는 패러다임의 전환을 의미합니다.
컨텍스트 인식 퍼징
맹목적으로 페이로드를 발사하는 기존 스캐너와 달리 Penligent의 AI 에이전트는 "추론 루프"를 활용합니다.
- 심층 시맨틱 분석: AI가 JWS를 만나면 다음을 수행합니다. JSON 웹 서명 디코딩 를 사용하여 애플리케이션의 컨텍스트를 이해합니다. 애플리케이션에
역할필드를 사용하시나요? 필드에tenant_id? - 논리 추론: AI는 백엔드 기술 스택을 추론합니다(예: Java 헤더를 감지하면 CVE-2022-21449 취약점이 있을 가능성이 높다는 것을 의미).
- 적응형 페이로드 생성:
- 특정 페이로드(예: 변경된
역할: 사용자에역할: 관리자). - 서명을 지능적으로 조작합니다(예: "심령 서명" 0값 익스플로잇 시도).
- 이는 성공 위조된 토큰으로 보호된 엔드포인트에 액세스를 시도하여 공격에 성공할 수 있습니다.
- 특정 페이로드(예: 변경된
펜리전트 어드밴티지: 이 플랫폼은 지루한 "디코딩 -> 수정 -> 서명 -> 테스트" 루프를 자동화하여 보안 엔지니어가 스크립트 유지 관리가 아닌 높은 수준의 아키텍처에 집중할 수 있도록 합니다. 본질적으로 특정 CVE 점검을 잊지 않는 24시간 연중무휴 레드팀원 역할을 합니다.
아키텍트를 위한 강화 전략
이러한 정교한 벡터를 방어하려면 엔지니어는 심층적인 방어 접근 방식을 채택해야 합니다:
- 하드코드 알고리즘: 신뢰할 수 없는
alg헤더를 추가합니다. 확인 기능을 명시적으로 정의합니다. 만 수락RS256(또는 선택한 알고리즘).Python `# 나쁜 jwt.decode(토큰, 키) 좋은 jwt.decode(토큰, 키, 알고리즘=["RS256"])`. - 키 ID(어린이)를 확인합니다: 다음 사항을 확인하십시오.
kid헤더는 키 관리 서비스(KMS)에서 엄격하게 정의된 키 화이트리스트에 매핑됩니다. 절대로kid를 데이터베이스 쿼리 또는 파일 경로에 직접 입력합니다. - 키 회전 적용: 서명 키를 정기적으로 교체하여 손상된 개인 키의 영향을 완화하세요.
- 패딩 이상 징후를 모니터링합니다: 로그에 디코딩 오류(잘못된 Base64Url 패딩으로 인한)가 많다는 것은 종종 퍼징 시도가 활발히 이루어지고 있음을 나타냅니다.
결론
다음 명령은 JSON 웹 서명 디코딩 는 결승선이 아니라 출발선입니다. 엘리트 보안 엔지니어에게 JWS는 암호화 기본 요소와 구현 로직으로 이루어진 역동적인 전쟁터와도 같습니다.
ECDSA 0값의 수학적 공백이든 키 혼동의 논리 함정이든, 취약점은 실제적이고 치명적입니다. 다음과 같은 AI 기반 자동화 도구와 결합된 심층 수동 분석을 활용하면 다음과 같은 문제를 해결할 수 있습니다. 펜리전트를 통해 보안 팀은 2025년에도 진화하는 위협 환경에 영향을 받지 않는 인증 계층을 유지할 수 있습니다.

