JWT란?
JWT(JSON WEB TOKEN)은, JSON 데이터 구조로 표현한 토큰으로써, 네트워크를 통해서 서로 다른 장치끼리 안전하게 전송하기 위해 설계된 토큰이다.
구성 요소
JWT는 크게 세 파트로 나누어지며, 각 파트는 점을 이용해서 구분된다.
Header
해시 암호화 알고리즘과 토큰의 타입으로 구성된 섹션이다.
첫 번째는 HMAC, SHA256 또는 RSA와 같은 서명 생성에 사용된 해시 알고리즘이며,
두 번째는 토큰의 유형(JWT)을 말한다.
Payload
Payload에 담는 정보의 한 조각을 클레임이라고 부르며, name / value의 한 쌍으로 이루어진다.
토큰에는 여러 개의 클레임들을 넣을 수 있으며, 클레임의 정보는 등록된 클레임, 공개 클레임, 비공개 클레임으로 세 종류가 존재한다. -> 실제로 사용될 정보에 대한 내용을 담고 있는 섹션이라고 할 수 있겠다.
signature
Header, Payload, Secret Key를 합쳐서 암호화한 결과값을 말한다.
인증 과정

1. 사용자가 ID, PW를 입력해서 서버에 로그인 인증을 요청한다.
2. 서버에서 클라이언트로부터 인증 요청을 받게 되면, Header, Payload, Signature를 정의한다.
3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다.
4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고, 아니라면 통과시키지 않으면 된다.
5. 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프레시 토큰을 이용해서
6. 서버로부터 새로운 액세스 토큰을 발급받는다.
JWT 취약점
Alg none 공격
서버가 JWT 헤더의 alg 필드를 검증하지 않고, 신뢰할 때 발생하는 고전적인 취약점이다.
공격방법은 아래와 같다.
1. 헤더를 {"alg" : "none"}으로 수정한다.
2. 페이로드에서 admin 값을 true로 변경한다.
3. 서명 부분을 지우고 토큰을 보낸다.
이렇게 되면, 서버에서는 alg가 none인 것을 보고 서명이 없는 토큰이라고 판단하여 검증 과정을 건너뛰고 페이로드를 그대로 수용하게 된다.
알고리즘 혼동 공격
서버가 RS256을 사용하도록 설정되어 있을 때, 공격자가 이를 HS256으로 강제 전환하여 발생하는 공격이다.
공격방법은 아래와 같다.
1. RS256은 검증에 공개키를 사용하는데, 이 공개키는 보통 외부로 노출되어 있다.
2. 공격자는 JWT 헤더를 HS256으로 바꾸게 된다.
3. 서버의 공개키를 HMAC의 비밀키로 사용하여 서명을 생성한다.
이렇게 되면, 서버에서는 라이브러리에 입력된 검증용 키를 HS256 알고리즘의 대칭 키로 사용하여 서명을 검증하게 되며, 공격자가 공개키로 서명했으므로 검증이 통과되게 된다.
'웹해킹 > 개념' 카테고리의 다른 글
| SQL Injection 심화(Blind, Error based ...) (0) | 2025.07.03 |
|---|---|
| 웹해킹 개념 복습 (1) | 2025.07.01 |
| [Dreamhack-web] Exploit Tech: XS-Search (1) | 2024.12.12 |
| [Dreamhack-web] Exploit Tech: Document Object Model Vulnerability (1) | 2024.12.12 |
| [Dreamhack-web] Exploit Tech: Relative Path Overwrite (1) | 2024.12.12 |