1. 서론
웹 애플리케이션에서 사용자 인증은 매우 중요한 역할을 합니다. 특히 RESTful API 기반의 시스템에서는 세션 방식이 아닌 토큰 기반 인증 방식이 많이 사용되며, 그 중심에는 JWT(Json Web Token)가 있습니다.
세션 방식은 서버가 사용자 상태를 저장해야 하므로 확장성에 제약이 생기지만, JWT는 클라이언트가 상태를 유지하므로 SPA, 모바일 앱, 마이크로서비스 아키텍처 환경에서 유용합니다. 이번 글에서는 JWT의 개념과 특징, 동작 방식, 장단점에 대해 쉽고 명확하게 정리해보겠습니다.

2. JWT란?
JWT(JSON Web Token)는 사용자 인증과 정보 전달을 위해 사용되는 토큰 기반 인증 방식입니다. 서버가 상태를 저장하지 않는 Stateless 인증을 지원하며, 클라이언트가 토큰을 저장하고 요청 시 전달하는 방식으로 동작합니다.

JWT는 크게 세 부분으로 구성됩니다.
2.1. Header (헤더)
- 토큰 타입(JWT)과 서명 알고리즘(HS256, RS256 등) 포함
<code />
{
"alg": "HS256",
"typ": "JWT"
}
2.2. Payload (페이로드)
- 사용자 정보(예: userId, role) 및 만료 시간(exp) 등 포함
- Base64로 인코딩되지만, 암호화되지 않음(디코딩 가능)
<code />
{
"userId": "12345",
"role": "admin",
"exp": 1719914000
}
2.3. Signature (서명)
- 토큰 변조 방지를 위한 서명
- 서버의 비밀키(Secret Key) 또는 공개/개인키로 생성됨
<code />
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
3. JWT의 특징
✅ 장점
- Stateless: 서버가 세션을 저장할 필요 없음 → 확장성(Scalability) 증가
- 빠른 인증: DB 조회 없이 토큰만 검증하면 됨
- 다양한 환경에서 사용 가능: REST API, 모바일, 마이크로서비스
❌ 단점
- 토큰 탈취 시 보안 위험 (만료 전까지 유효)
- 토큰 크기가 커질 수 있음 (Base64 인코딩 + 서명 포함)
- 만료 후 재발급(Refresh Token)이 필요함
4. 동작 과정
JWT 기반 인증은 다음과 같은 흐름으로 진행됩니다:
4.1. 사용자가 로그인 요청
- 클라이언트(웹/앱)가 아이디와 비밀번호를 서버에 전송
4.2. 서버가 사용자 인증 후 JWT 발급
- 서버는 Access Token(엑세스 토큰)과 Refresh Token(리프레시 토큰)을 생성
- Access Token: 짧은 기간(예: 15~30분) 유효한 토큰
- Refresh Token: 더 긴 기간(예: 7~30일) 유효한 토큰
4.3. 클라이언트가 JWT 저장
- Access Token: 메모리, 쿠키, 세션 스토리지 등에 저장
- Refresh Token: 보안 강화를 위해 보통 HttpOnly 쿠키에 저장
4.4. API 요청 시 Access Token 포함
- Authorization: Bearer <Access Token> 형태로 요청 전송
- 서버는 Access Token을 검증 후 요청 처리
4.5. Access Token 만료 시 Refresh Token 사용
- 클라이언트가 Access Token이 만료되면 Refresh Token을 서버에 전송
- 서버가 Refresh Token을 검증 후 새로운 Access Token 발급
4.6. Refresh Token도 만료되면 재로그인 요구
- Refresh Token이 만료되거나 유효하지 않으면 사용자는 다시 로그인해야 함

5. JWT 사용 시 주의할 점
JWT를 사용할 때는 다음과 같은 보안 및 운영상의 사항들을 고려해야 합니다:
- 민감한 정보는 Payload에 담지 않습니다. Base64 인코딩은 암호화가 아니기 때문에 누구나 디코딩이 가능합니다.
- HTTPS 사용은 필수입니다. 토큰이 네트워크 상에서 탈취되는 것을 방지하기 위해 모든 통신은 HTTPS로 암호화해야 합니다.
- Access Token은 짧은 만료 시간으로 설정합니다. 유출 시 피해를 최소화하기 위해 수 분 단위로 설정하는 것이 일반적입니다.
- Refresh Token은 HttpOnly 쿠키에 보관하고, 클라이언트에서 접근 불가능하도록 관리합니다. XSS 공격을 예방할 수 있습니다.
- 재발급 및 만료 처리 로직을 구현합니다. 토큰 탈취나 위조에 대비해 Refresh Token 사용 시 서버 측 만료 처리 및 재발급 API를 안전하게 설계해야 합니다.
6. 마무리
JWT는 인증이 필요한 다양한 환경에서 유용하게 활용될 수 있는 토큰 기반 인증 방식입니다. 세션 저장이 필요 없는 구조 덕분에 확장성과 성능 면에서 장점이 크며, 모바일 앱이나 SPA, 마이크로서비스와 같은 아키텍처에서 자주 선택됩니다.
하지만 토큰 탈취, 만료 처리, 재발급 등 보안과 관련된 고려사항도 많기 때문에, 충분한 이해를 바탕으로 설계하고 도입하는 것이 중요합니다. 이 글에서 다룬 개념과 주의사항들을 바탕으로, 상황에 맞게 JWT를 도입해보는 것도 좋은 방법입니다.
'FrontEnd' 카테고리의 다른 글
gRPC와 RESTful API, 언제 어떤 걸 사용 할까? (0) | 2025.04.01 |
---|---|
HTTPS는 왜 사용할까? (0) | 2025.03.31 |
웹 페이지 요청부터 렌더링까지의 흐름 (0) | 2025.03.29 |
FSD 아키텍처 적용하기 (0) | 2025.03.28 |
프론트엔드에 SOLID 적용하기 (0) | 2025.03.27 |