JWT 토큰의 발급, 사용, 관리 방식 총정리
JWT (JSON Web Token) 토큰 기반 인증은 웹 API와 클라이언트 간의 안전한 통신을 위한 인증 방식입니다. 이 방식의 일반적인 생명주기와 베스트 프랙티스는 다음과 같습니다:
1. 토큰 발급 (Sign In)
- 사용자는 로그인을 위해 자격 증명 (예: 이메일과 비밀번호)을 API 서버에 전송합니다.
- 서버는 자격 증명을 검증하고, 성공 시 JWT를 생성하여 클라이언트에 반환합니다.
- 이 JWT에는 사용자를 식별할 수 있는 정보 (
sub,username등)와 토큰의 유효 기간 (exp) 등이 포함됩니다.
2. 토큰 사용 (Authenticating Requests)
- 클라이언트는 서버로 요청을 보낼 때 HTTP 요청의
Authorization헤더에Bearer {Token}형식으로 JWT를 포함시켜 서버에 전송합니다. - 서버는 JWT의 유효성을 검증하고, 유효하다면 요청을 처리합니다.
3. 토큰 갱신 (Token Refreshing)
- 토큰이 만료되기 전에 클라이언트는 ‘토큰 갱신(refresh token)’을 요청할 수 있습니다.
- ‘토큰 갱신’은 토큰을 새로 발급받는 것으로, 이를 위해 종종
refresh_token이 함께 발급되고 이를 이용해 새access_token을 받습니다. - 클라이언트는 이
refresh_token을 안전하게 저장해야 하며,access_token만료 시 서버에 새 토큰을 요청합니다.
4. 토큰 삭제 (Sign Out)
- 사용자가 로그아웃을 요청하면, 클라이언트는 저장된 JWT를 삭제합니다.
- 서버 측에서는
refresh_token을 무효화합니다. 즉, 해당 토큰으로 더 이상 새access_token을 발급받을 수 없도록 합니다.
클라이언트 측 토큰 관리
저장
- 웹 애플리케이션:
localStorage또는sessionStorage에 토큰을 저장할 수 있습니다.httpOnly쿠키도 사용될 수 있지만, CSRF 공격에 취약할 수 있습니다. - 모바일 애플리케이션: 안전한 스토리지 옵션을 사용해야 하며, 예를 들면 iOS의 Keychain이나 Android의 Keystore System입니다.
보안
- 클라이언트 측에서 토큰을 안전하게 보관하고,
XSS와 같은 보안 위협으로부터 보호해야 합니다. - 서버와의 모든 통신은
HTTPS를 통해 암호화되어야 합니다.
자동 재발급
- 클라이언트는 토큰의 유효기간을 체크하고, 만료가 임박하면 자동으로 갱신 요청을 해야 합니다.
- 이러한 갱신 요청은 보통 백그라운드에서 자동으로 이루어집니다.
세션 연장
- 일부 애플리케이션은 사용자의 활동이 있을 때만 세션을 유지합니다. 이를 위해 사용자의 인터랙션에 따라 갱신 요청을 보낼 수 있습니다.
- 무한한 세션 연장은 보안상 좋지 않으므로, 최대 세션 시간을 설정하는 것이 중요합니다.
서버 측 토큰 관리
검증
- 서버는 JWT의 서명을 검증하고, 필요한 클레임 (
exp,nbf,aud,iss등)이 유효한지 확인해야 합니다.
무효화
refresh_token이 노출되거나 사용자가 로그아웃한 경우, 해당 토큰을 무효화해야 합니다.- 토큰 무효화는 데이터베이스에 무효 토큰 목록을 유지하거나,
jti(JWT ID) 클레임을 사용하여 토큰을 추적함으로써 이루어질 수 있습니다.
총론
토큰 기반 인증 시스템은 강력하지만, 올바르게 구현되지 않으면 보안 취약점을 일으킬 수 있습니다. 따라서, 토큰을 안전하게 관리하고, 필요한 경우 적절히 갱신하며, 사용자의 로그아웃 요청에 응답하여 토큰을 무효화하는 것이 중요합니다. 클라이언트와 서버 모두에서 보안을 철저히 유지해야 하며, 적절한 보안 조치를 통해 JWT 인증 시스템의 안전성을 보장해야 합니다.