안녕하세요.
오늘은 서버와 클라이언트 간에 인증 정보를 안전하게 주고받기 위해 사용되는 JWT(JSON Web Token)에 대해 공부해보겠습니다.
JWT의 개념
JWT(JSON Web Token)는 인증에 필요한 정보들을 JSON 객체에 담아 인코딩하고, 이를 기반으로 서명을 생성하여 토큰 형태로 사용하는 인증 방식입니다.
기존의 세션 방식과 달리 서버가 사용자의 상태를 저장하지 않는 Stateless(무상태) 구조를 가집니다.
클라이언트가 직접 토큰을 보유하고 있다가 요청 시마다 서버에 전달하여 인증을 처리하는 것이 특징입니다.
JWT의 구조
JWT는 점(.)을 구분자로 하여 세 가지 부분으로 구성됩니다
| 구성 요소 | 설명 | 주요 내용 |
| Header | 토큰의 타입과 알고리즘 정보 | 토큰 타입(JWT), 해싱 알고리즘(HS256 등) |
| Payload | 실제 담을 데이터(Claim) | 사용자 ID, 권한, 만료 시간(exp) 등 |
| Signature | 위변조 검증을 위한 서명 | Header+Payload와 서버 비밀키를 조합해 생성 |
⚠️ 주의: Payload는 암호화가 아닌 단순 인코딩입니다.
누구나 내용을 확인할 수 있으므로 비밀번호와 같은 민감한 정보는 절대 포함해서는 안 됩니다.
JWT의 동작 방식
JWT 인증은 일반적으로 다음과 같은 흐름으로 진행됩니다.
- 로그인 : 사용자가 로그인을 요청합니다.
- 토큰 발급 : 서버는 인증 완료 후 정보를 담은 JWT를 생성해 클라이언트에게 보냅니다.
- 토큰 저장 : 클라이언트는 받은 토큰을 저장(LocalStorage, Cookie 등)합니다.
- 요청 시 전달 : 인증이 필요한 API 호출 시 헤더(Authorization: Bearer <JWT>)에 토큰을 실어 보냅니다.
- 검증 : 서버는 자신의 비밀 키로 Signature를 검증하여 신뢰할 수 있는 토큰인지 확인합니다.
JWT의 특징
| 특징 | 설명 |
| Stateless | 서버가 세션을 유지할 필요가 없어 서버 부하가 적고 확장이 용이합니다. |
| 이식성 | HTTP 헤더를 통해 전달되므로 어떤 플랫폼(Web, iOS, Android)에서도 사용 가능합니다. |
| 분산 환경 | 여러 서버가 운영되는 환경(MSA)에서도 공통 키만 있다면 인증 정보 공유가 쉽습니다. |
| 효율성 | 토큰 자체에 정보를 담고 있어 DB 조회 횟수를 줄일 수 있습니다. |
JWT의 장점
| 장점 | 설명 |
| 서버 부하 감소 | 서버가 사용자 세션 정보를 메모리나 DB에 저장할 필요가 없습니다. 서버는 토큰의 유효성 검증(Signature 확인)만 수행하면 되므로 리소스 소모가 훨씬 적습니다. |
| 확장성(Scalability) | 세션 방식은 여러 대의 서버 운영 시 세션 동기화 문제가 발생하지만, JWT는 어떤 서버로 요청이 가더라도 동일한 비밀키만 있다면 인증이 가능하여 수평 확장에 유리합니다. |
| 무상태성(Stateless) | 클라이언트와 서버 간의 연결 상태를 유지할 필요가 없습니다. 이는 REST API의 원칙에도 부합하며, 서버를 유연하게 관리할 수 있게 해줍니다. |
| 멀티 플랫폼 지원 | 쿠키를 사용하지 않아도 되므로 CORS(Cross-Origin Resource Sharing) 문제에서 비교적 자유롭고, 모바일 앱(iOS/Android)과의 연동이 매우 간편합니다. |
| 권한 제어의 용이성 | Payload에 사용자의 권한(Role)이나 접근 가능한 범위(Scope)를 미리 담아둘 수 있어, 별도의 DB 조회 없이도 즉각적인 권한 체크가 가능합니다. |
JWT 단점
| 단점 | 설명 |
| 무효화 어려움 | 서버가 토큰 상태를 저장하지 않기 때문에 로그아웃이나 강제 만료 처리가 어려워, 별도의 블랙리스트나 Refresh Token 전략이 필요합니다. |
| 보안 탈취 | 토큰이 탈취되면 만료 전까지 누구나 사용 가능하므로, 유효기간을 짧게 설정하고 HTTPS 사용이 필수입니다. |
| 암호화 없음 | Payload는 암호화가 아닌 인코딩만 되어 있어 누구나 내용을 확인할 수 있으므로, 비밀번호 같은 민감 정보는 절대 담으면 안 됩니다. |
| 토큰 크기 부담 | 세션 ID보다 크기가 커서 매 요청마다 전송되는 네트워크 비용이 누적될 수 있습니다. |
JWT 보안을 위한 필수 전략
| 전략 | 설명 |
| Access Token | 유효기간을 짧게(보통 15~30분) 설정하여 토큰이 탈취되더라도 피해를 최소화합니다. |
| Refresh Token | 상대적으로 긴 만료 기간을 가지며, 서버(DB)에 저장하여 관리합니다. Access Token이 만료되었을 때만 새로운 토큰을 재발급하는 데 사용됩니다. |
| HTTPS 사용 | 네트워크 중간에서 토큰이 탈취되는 것을 방지하기 위해 반드시 HTTPS 환경에서 통신해야 합니다. |
마무리 정리
이번 글에서는 JWT의 개념과 구조, 특징에 대해 공부하였습니다.
JWT는 서버 상태 없이 인증을 처리할 수 있는 효율적인 방식이지만 데이터 노출 위험이 있는 만큼 보안 관리에 유의하며 사용해야 합니다.
복잡한 세션 관리 없이 독립적인 인증 환경을 구축하고 싶을 때 매우 유용한 기술입니다.
읽어주셔서 감사합니다!
참조
'Web' 카테고리의 다른 글
| Nginx (0) | 2026.05.07 |
|---|---|
| Proxy Server (0) | 2026.04.30 |
| WAS(Web Application Server) (0) | 2026.04.29 |
