JWT
기술노트
🎟️ JWT (JSON Web Token)
JWT는 웹 표준(RFC 7519)으로서, 두 개체 사이에서 JSON 객체를 사용하여 가볍고 자가수용적인(self-contained) 방식으로 정보를 안전하게 전달하기 위한 토큰입니다. 주로 인증(Authentication) 및 정보 교환에 사용됩니다.
세션 방식과 달리, JWT는 필요한 모든 정보를 자체적으로 가지고 있어 서버가 별도의 저장소에서 상태를 관리할 필요가 없습니다.
🧱 JWT의 구조
JWT는 `.`을 구분자로 하여 세 부분으로 나뉩니다: `aaaaa.bbbbb.ccccc`
- 헤더 (Header) : 토큰의 타입(typ)과 서명에 사용된 해싱 알고리즘(alg) 정보를 담습니다.
- 페이로드 (Payload) : 전달하려는 실제 정보(데이터)를 담습니다. 페이로드에 담긴 정보 조각을 '클레임(Claim)'이라고 부릅니다. (예: 사용자 ID, 이름, 만료 시간 등)
- 서명 (Signature) : 헤더와 페이로드를 합친 후, 서버만이 알고 있는 비밀 키(Secret Key)로 암호화한 값입니다. 이 서명을 통해 토큰의 위변조 여부를 검증할 수 있습니다.
헤더와 페이로드는 단순히 Base64로 인코딩될 뿐, 암호화되지 않습니다. 따라서 페이로드에는 비밀번호와 같은 민감한 정보를 담아서는 안 됩니다.
⚙️ JWT 인증 과정
1. 사용자가 아이디와 비밀번호로 로그인합니다. 2. 서버는 로그인 정보를 확인하고, 사용자 정보를 담은 JWT를 생성하여 클라이언트에게 전달합니다. 3. 클라이언트는 이 JWT를 로컬 스토리지나 쿠키에 저장합니다. 4. 이후 클라이언트는 API를 요청할 때마다, HTTP 헤더(Authorization 헤더)에 이 JWT를 포함하여 보냅니다. 5. 서버는 전달받은 JWT의 서명을 검증하여, 유효한 토큰인지 확인하고 요청을 처리합니다.
💡 개발자 핵심 Point
- JWT는 Stateless(무상태) 인증을 가능하게 합니다. 서버는 토큰만 검증하면 되므로, 세션 저장소가 필요 없어 서버의 확장성(Scalability)에 유리합니다.
- 마이크로서비스 아키텍처(MSA)나 모바일 앱 환경에서 중앙 인증 서버 없이도 여러 서비스 간의 인증을 쉽게 처리할 수 있습니다.
- 한 번 발급된 토큰은 만료되기 전까지 유효하므로, 토큰이 탈취될 경우 보안에 취약할 수 있습니다. 이를 보완하기 위해 만료 시간을 짧게 설정하고, 리프레시 토큰(Refresh Token)을 함께 사용하는 방식이 널리 쓰입니다.