JWT(JSON Web Token) 알아보기
by rowing0328Intro
최근 웹 애플리케이션에서는 사용자 인증 및 권한 부여를 위해 JSON Web Token (JWT) 이 많이 사용되고 있다.
이번 포스팅에서는 JWT의 기본 개념부터 구조, 동작 원리, 장단점을 살펴본다.
JWT란 무엇인가
JWT는 JSON Web Token의 약자로, JSON 형식의 데이터를 안전하게 전달하기 위해 고안된 토큰이다.
주로 서버와 클라이언트 간에 인증 정보를 전달할 때 사용되며,
자체적으로 검증이 가능한 특징 덕분에 별도의 세션 저장소 없이도 사용자 인증을 구현할 수 있다.
JWT의 기본 구조
JWT는 크게 세 부분으로 구성되어 있으며, 각각 점(.)으로 구분된다.
Header (헤더)
- 토큰의 타입(JWT)과 사용된 서명 알고리즘(예: HS256, RS256 등)을 포함한다.
{
"alg": "HS256",
"typ": "JWT"
}
Payload (페이로드)
- 토큰에 담고자 하는 클레임(Claim)들이 포함된다.
- 클레임은 크게 세 가지 유형으로 구분된다.
- 등록된 클레임 (Registered Claims) : iss(발급자), exp, sub 등 표준화된 클레임.
- 공개 클레임 (Public Claims) : 충돌을 피하기 위해 IANA에 등록하거나 URI를 사용한다.
- 비공개 클레임 (Private Claims) : 발급자와 수신자 간에 합의한 정보.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
Signature (서명)
- 헤더와 페이로드를 인코딩 후, 비밀 키를 사용해 서명 알고리즘으로 생성한 서명이다.
- 이 서명을 통해 토큰의 무결성과 인증이 가능해진다.
- 생성 과정 :
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
JWT의 동작 원리
JWT를 활용한 인증 흐름은 보통 다음과 같다.
1. 사용자 로그인
사용자가 로그인 정보를 서버에 전송한다.
2. 토큰 발급
서버는 로그인 정보를 검증한 후, 사용자 정보를 담은 JWT를 생성하여 클라이언트에 전달한다.
3. 클라이언트 저장
클라이언트는 이 토큰을 로컬 스토리지나 쿠키 등에 저장한다.
4. 요청 시 토큰 포함
이후 클라이언트는 서버에 요청할 때 HTTP 헤더(예: Authorization: Bearer <token>)에 JWT를 포함한다.
5. 서버 검증
서버는 토큰의 서명을 검증하여 요청을 인증한다.
이와 같은 방식으로 JWT는 상태 비저장(stateless) 인증을 가능하게 해주며,
서버의 부하를 줄이고 확장성을 높이는 데 도움이 된다.
[ 장점 ]
- 상태 비저장
서버에 세션을 저장할 필요 없이 토큰 자체에 인증 정보를 담아 전달할 수 있다. - 확장성
분산 시스템 환경에서 중앙 저장소 없이도 사용자 인증이 가능하다. - 다양한 클라이언트 지원
웹, 모바일, IoT 등 다양한 클라이언트 간에 동일한 토큰이 사용 가능하다.
[ 단점 ]
- 토큰 무효화 어려움
한 번 발급된 토큰은 만료 전까지 유효하므로, 즉각적인 로그아웃이나 강제 만료가 어려울 수 있다. - 크기
토큰에 많은 정보를 담으면 HTTP 헤더에 포함되어 전송 시 오버헤드가 발생할 수 있다. - 보안 고려
비밀 키 관리 및 토큰 탈취에 대비한 보안 강화가 필요하다.
JWT 사용 시 고려사항
- 만료 시간 설정
exp 클레임을 적절히 설정하여 토큰이 오랜 시간 유효하지 않도록 관리한다. - 보안 키 관리
비밀 키나 공개/개인 키 쌍을 안전하게 보관하고 주기적으로 갱신한다. - HTTPS 사용
토큰이 전송될 때 중간자 공격 등을 방지하기 위해 HTTPS를 반드시 사용한다. - 토큰 저장
클라이언트 측 저장소(XSS 공격 취약성 고려) 선택 시 주의.
마무리
상태 비저장 인증 방식의 장점을 통해 서버 부하를 줄이고 확장성을 높일 수 있다는 점과,
토큰 관리나 보안 측면에서 신경 써야 할 부분들이 함께 존재한다는 점을 다시 한번 확인할 수 있었다.
개인적으로 JWT를 도입하며 기존의 세션 기반 인증보다 더욱 유연하고 효율적인 인증 시스템을 경험 할 수 있었지만,
동시에 만료 시간, 비밀 키 관리, HTTPS 적용 등 보안에 관한 고민도 함께 했던 기억이 난다.
다음 포스팅에서는 이번 글에서 다룬 JWT 개념이 실제 프로젝트에서 어떻게 활용되었는지,
그리고 그 과정에서 얻은 다양한 인사이트와 경험을 상세하게 공유할 예정이다.
참고 자료 :
RFC 7519 - JSON Web Token (JWT)
RFC 7519: JSON Web Token (JWT)
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JS
datatracker.ietf.org
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
'🪐Server' 카테고리의 다른 글
IaaS, PaaS, SaaS 알아보기 그리고 나의 아하 모먼트 (2) | 2025.02.20 |
---|---|
테스트 컨테이너(Testcontainers) 알아보기 (2) | 2025.01.19 |
로컬 스택(LocalStack) 알아보기 (0) | 2025.01.19 |
프로메테우스(Prometheus) & 그라파나(Grafana) 알아보기 (2) | 2025.01.02 |
블로그의 정보
코드의 여백
rowing0328