JWT란?
JWT (JSON Web Token) 는 JSON 포맷을 이용해 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식입니다. 주로 사용자의 인증 상태를 유지하거나 권한 검증을 위해 사용됩니다.
JWT는 총 3개의 파트로 구성되며, . 으로 구분됩니다. (헤더(header), 페이로드(payload), 서명(signature) 세 파트)
ex) xxxxx.yyyyy.zzzzz
Header (헤더)
{
"alg": "HS256",
"typ": "JWT"
}
Payload (페이로드)
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Signature (서명)
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
JWT 문자열 최종 결과) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
부분 | 설명 |
Header | 어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보 |
Payload | 실제 담고 싶은 정보 (sub, exp, 사용자 정보 등). Payload에 있는 내용은 수정이 가능하여 더 많은 정보를 추가할 수 있다. 그러나 노출과 수정이 가능한 지점이기 때문에 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야한다. |
Signature | Header와 Payload를 비밀키로 서명한 값, 위조 방지용. 가장 중요한 부분으로 헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만들어준다. |
예시) 토큰이 발급된 후 누군가가 Payload의 정보를 수정하면 Payload에는 다른 누군가가 조작된 정보가 들어가 있지만 Signature에는 수정되기 전의 Payload의 내용을 기반으로 이미 암호화 되어있는 결과가 저장되어 있기 때문에 조작되어있는 Payload와는 다른 결과값이 나오게 된다. 이러한 방식으로 비교하면 서버는 토큰이 조작되었는지 아닌지를 쉽게 알 수 있고, 다른 누군가는 조작된 토큰을 악용하기가 어려워진다.
사용 흐름
- 사용자 로그인 → 서버에서 JWT 생성(발급)(사용자 식별 정보(ID), 만료 시간 등의 정보) 후 클라이언트에게 전달
- 클라이언트 저장 → 보통 LocalStorage나 Cookie에 저장
- 요청 시 사용 → API 요청 시 HTTP Header에 JWT 포함 (Authorization: Bearer <token>)
- 서버 검증 → 서버는 서명(Signature)과 만료 시간 등을 검증하여 요청 처리
장점
- 세션 저장소 필요 없음 (Stateless): 서버가 상태를 기억할 필요가 없어서 확장성이 뛰어남
- 다양한 플랫폼 간 통신에 유리: 모바일, 웹 등 다양한 클라이언트에서 통신 가능
- 정보 자체를 담고 있어서 인증/권한을 동시에 처리 가능
단점
- Payload가 인코딩되어 있을 뿐 암호화되진 않음 → 민감한 정보 저장 금지
- 한 번 발급된 토큰은 중간에 무효화가 어려움 → 재발급(RT) 구조 필요
- 토큰 탈취 시 보안 문제 → HTTPS, 짧은 만료 시간, Refresh Token과 함께 사용해야 안전
JWT vs 세션 기반 인증
항목 | 세션 기반 | JWT |
저장 위치 | 서버 (메모리, DB) | 클라이언트 |
확장성 | 낮음 | 높음 |
보안 | 상대적으로 안전 | 토큰 탈취 시 위험 |
사용 사례 | 내부 서비스 | API 서버, 모바일, SPA |
'멋쟁이사자처럼_부트캠프 > 개념STUDY' 카테고리의 다른 글
TDD와 테스트 전략 (0) | 2025.06.22 |
---|---|
OAuth2 (0) | 2025.06.03 |
기본 웹 아키텍처 개념 (0) | 2025.05.13 |
RabbitMQ란 (0) | 2025.05.06 |
CI/CD 개념 정리 (0) | 2025.04.25 |