1. JWT의 정의와 용도
JWT(JSON Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉, 토큰의 한 종류로, 일반적으로 클라이언트 측에서 로컬 스토리지나 쿠키 저장소를 사용하여 JWT를 저장한다.
여기서 Claim이란, JWT의 페이로드(payload) 부분에 포함되는 정보의 한 '조각'을 의미한다. 각 Claim은 이름-값 쌍(name-value pair)의 형태를 가지며, 토큰에 대한 설명이나 추가적인 데이터를 제공한다.
2. JWT를 사용하는 이유
JWT는 서버의 상태를 유지할 필요 없이 인증 정보를 관리할 수 있는데, 이를 무상태(stateless)라고 한다. 즉, 서버가 사용자의 세션을 기억하지 않아도 된다. 모든 필요한 정보가 JWT에 포함되어 있어서, 서버는 단순히 이 토큰을 받아 검증만 하면 된다. 이 방식 덕분에 서버가 많은 사용자를 동시에 처리해야 할 때 부담이 줄어든다는 장점이 있어 JWT를 사용한다.
3. JWT의 구조 (헤더, 페이로드, 서명)
토큰은 세 가지 파트를 점(.)으로 구분해 이어 붙여서 만들어진다. 서버는 비밀 키로 서명을 확인해 토큰의 유효성을 검사하고, 클라이언트는 해당 정보를 안전하게 전달받을 수 있다.
- Header (헤더): 토큰의 타입과 서명에 사용할 암호화 알고리즘을 정의한다. 이 경우에는 HS256이라는 HMAC SHA256 알고리즘을 사용한다.
- Payload (페이로드): 실제로 전송하려는 데이터를 담고 있다. 페이로드에 들어가는 데이터를 바로 Claim(클레임)이라고 하는 것이다. 여기서는 사용자 정보(예: sub라는 속성에 사용자 ID, name에 사용자 이름, iat는 발행 시간)를 포함한다. 이 정보는 Base64로 인코딩돼서 토큰에 들어가게 된다.
- Signature (서명): 보안성을 더하기 위해 사용하는데, 서버만 알고 있는 비밀 키(secret)를 이용해 서명을 생성한다. 이 서명을 검증함으로써 토큰이 위조되지 않았는지 확인할 수 있다. 여기선 HMACSHA256을 이용해서 헤더와 페이로드를 연결한 뒤 서명한다.
4. JWT vs 세션 기반 인증의 차이점
세션 기반 인증 | 토큰 기반 인증 | |
상태 유지 방식 | 유상태(stateful): 서버가 세션 정보를 저장하고 유지. 클라이언트는 세션 ID만 저장하고 서버에 요청할 때마다 세션을 조회. |
무상태(stateless): 서버가 인증 상태를 유지하지 않음. 모든 인증 정보는 토큰에 포함되어 클라이언트에 저장됨. |
저장 위치 | 서버 측 (세션 저장소에 세션 데이터 저장) | 클라이언트 측 (로컬 스토리지, 쿠키 등) |
스케일링 | 서버 확장에 불리: 세션 저장소를 여러 서버에 동기화해야 해서 복잡해짐. | 서버 확장에 유리: 상태를 유지할 필요가 없기 때문에 여러 서버에 쉽게 확장 가능. |
토큰 정보 포함 | 서버에 정보가 저장되어 있음. 클라이언트는 세션 ID만 가지고 있음. |
모든 사용자 정보(클레임)가 토큰 안에 포함되어 전송됨. |
토큰 크기 | 세션 ID는 작고, 최소한의 정보만 클라이언트에 저장됨. | 일반적으로 크기가 크며, 서버 요청 시마다 포함됨. |
보안 | 세션 ID만 유출되면 공격이 가능하지만, 서버 측에서 세션 만료나 무효화 가능. | 서명으로 무결성을 보장하지만, 토큰 탈취 시 위험함. 만료 시간 필요. |
만료 관리 | 서버에서 세션 만료 시간 관리. 서버에서 세션을 종료하거나 삭제 가능. |
토큰 자체에 만료 시간 포함 (exp 클레임). 만료 후 재발급 필요. |
재인증 | 서버에서 세션을 유지하는 한 유효. 세션이 만료되면 재인증 필요. |
만료되기 전까지는 계속 유효하며, 토큰이 만료되면 다시 로그인 필요. |
주요 사용처 | 전통적인 웹 애플리케이션, 서버 중심 구조 | 분산 시스템, 마이크로서비스, API 인증, SPA |
서버 자원 사용 | 서버에 세션 정보를 저장해야 하므로 자원 소모가 있음. | 서버 자원을 거의 사용하지 않음 (토큰 검증만 필요). |
5. JWT의 장단점
장점
- 자체 포함: JWT는 사용자 정보와 권한을 포함하고 있어서 별도의 데이터베이스 조회 >없이 인증할 수 있다.
- 보안: 서명을 통해 데이터의 무결성을 보장하며, 필요한 경우 암호화하여 기밀성을 유
지할 수 있다. - 유연성: 다양한 플랫폼과 언어에서 쉽게 사용할 수 있고, RESTful API와 잘 어울린다.
- 상태 비저장: 서버가 세션 정보를 저장할 필요가 없어 확장성이 뛰어나다.
단점:
- 토큰 크기: JWT는 다른 인증 방식에 비해 크기가 클 수 있어 네트워크 대역폭을 더 소
모할 수 있다. - 만료 관리: 만료된 토큰을 강제로 폐기하기 어려워 보안 취약점이 발생할 수 있다.
- 서명 알고리즘: 취약한 알고리즘을 사용할 경우 보안에 문제가 생길 수 있다.
- 초기 설정: JWT를 구현하고 설정하는 과정이 복잡할 수 있다.