JWT는 요즘 웹/모바일 API에서 인증 방식으로 자주 쓰입니다.
이번 글에서는 JWT가 무엇인지, 어떻게 동작하는지, 그리고 장단점과 보안 이슈를 간단히 정리해보겠습니다.
■ JWT란?
JWT는 Json Web Token의 줄임말입니다.
인증 정보를 JSON 형태로 담아서 서명(Signed Token) 처리한 문자열입니다.
토큰은 아래처럼 세 부분으로 구성됩니다.
- Header: 토큰 타입과 서명 알고리즘 정보 (예: HS256)
- Payload: 실제 데이터 (예: userId, role, 만료시간 등)
- Signature: 위 두 개를 비밀키로 서명한 값
각 부분은 Base64로 인코딩되어 .으로 연결됩니다.
브라우저 콘솔이나 https://jwt.io/ 에서 쉽게 디코딩해서 내용을 확인할 수 있습니다.
예시 토큰을 한번 보시면 이해가 더 쉬울 것 같습니다. (jwt.io에서 제공하는 내용입니다.)
■ JWT 동작 원리
JWT는 주로 로그인 이후 사용자 인증을 위해 사용됩니다.
- 사용자가 로그인하면 서버는 JWT를 생성해 클라이언트에 전달합니다.
- 클라이언트는 이 토큰을 저장해두고, 이후 요청할 때마다 HTTP 헤더에 붙여 보냅니다.
- 서버는 이 토큰의 서명을 검증해 사용자를 식별합니다.
이 구조는 Stateless하다는 특징이 있습니다.
즉, 서버가 세션을 별도로 저장하지 않아도 됩니다.
■ JWT 장점과 단점
* 장점
- 서버 상태 관리 불필요 (세션 저장 X)
- 수평 확장이 쉬움 (무상태 인증)
- 모바일 앱, SPA 등 다양한 환경에 잘 어울림
- 토큰에 원하는 정보를 담을 수 있어 유연함
* 단점
- 토큰이 길다 → 네트워크 트래픽 부담
- 만료 전까지는 무조건 유효 → 탈취 시 대처 어려움
- Payload는 암호화되지 않음 → 민감 정보 담으면 안 됨
■ 보안 관련 고려사항
JWT는 편리하지만 보안 측면에서 주의가 필요합니다.
- HTTPS는 필수입니다. 토큰이 평문으로 전송되기 때문입니다.
- 토큰 저장 위치는 상황에 따라 선택해야 합니다.
- 브라우저: HttpOnly Cookie 권장
- 앱: Secure Storage
- IP, 디바이스 정보 등을 함께 기록해 토큰 도용을 감지하는 방법도 있습니다.
- User-Agent 등을 함께 저장하여 사용자 (접속 디바이스) 식별 등
- refreshToken 전략을 함께 쓰는 것이 안전합니다.
- accessToken은 만료주기를 짧게, 클라이언트에서 관리
- refreshToken은 만료주기를 길게, 서버에서 관리 (Blacklisting 등 가능)
accessToken과 refreshToken 을 어떻게 같이 사용하는지 그 흐름을 간단히 설명하겠습니다.
[1] 사용자가 ID/PW로 로그인 요청
→ 예: ID: user1234 / PW: password1234
[2] 서버가 로그인 정보를 확인 후
→ accessToken + refreshToken 발급
[3] 클라이언트는 accessToken을 가지고 API 요청
→ Authorization: Bearer {accessToken}
[4] 서버는 accessToken을 검증하고, 유효하면 응답 반환
[5] accessToken이 만료된 경우,
→ 클라이언트는 refreshToken으로 accessToken 재발급 요청
[6] 서버가 refreshToken 검증 후 새로운 accessToken을 발급
위와 같은 흐름으로
accessToken은 짧은 유효기간으로 보안성을 확보하고, refreshToken은 로그인 상태 유지를 위한 수단으로 함께 사용하는 구조입니다.
accessToken이 탈취되더라도 일정 시간 후 자동 만료되고, refreshToken은 서버에서 관리하거나 무효화할 수 있어 보다 안전한 인증이 가능합니다.
JWT(Json Web Token) 라는 개념 자체가 어려울 수는 있지만, 한 번 이해하면 매우 간단합니다.
JWT는 단순하면서도 강력한 인증 수단이지만, 단점도 분명히 있으므로, 서비스 특성과 규모에 맞게 사용하는 것이 중요합니다.
그럼 JWT 간단 정리 글을 마치도록 하겠습니다.
'Backend Engineering' 카테고리의 다른 글
OAuth 2.0 정리 (1) | 2025.06.05 |
---|