JWT란
JSON Web Token
인증에 필요한 정보들을 암호화 시킨 JSON 토큰을 의미한다.
JSON 데이터를 Base64 URL -safe Encode를 통해 인코딩하여 직렬화한 것으로 토큰 내부에 위변조 방지를 위한 전자서명을 포함한다.
무상태성 통신을 가능하게 하며 세션 기반 인증 시스템의 일부 한계를 극복할 수 있다.
구조

JWT는 .을 기준으로 Header Payload Signature로 나눠진 문자열의 조합이다.
Ex)

토큰 타입과 서명 암호화 알고리즘이 정의되어있다.

Payload
서버와 클라이언트가 실제로 주고받는 데이터가 담겨있다.

Signature
Signature는 Header에서 정의한 알고리즘 방식을 활용하여 Header + Payload + 서버가 갖고 있는 유일한 key 값을 합쳐 암호화한 정보를 담고 있다.

인증 방식
JWT 토큰을 HTTP 헤더에 담아 전송하고, 서버가 클라이언트를 식별하는 방식이다.

특징
- 데이터 무결성 보장
- 토큰을 발급한 이후에는 토큰 정보 변경이 불가하기 때문에 무결성을 유지할 수 있다.
- 인증 정보가 담긴 토큰을 서버에 저장할 필요가 없다.
- 서버는 세션 상태를 유지할 필요가 없기 때문에 서버의 부하가 감소하고 확장성이 향상된다.
- 여러 서비스와 시스템간의 통합에 용이하다.
- 토큰 기반 인증은 다양한 플랫폼과 어플리케이션에서 쉽게 구현 가능하다
- 여러 서버 간 요청 처리 용이
- 서버가 여러개일 경우 사용자 세션이 한 서버에 묶이지 않기 때문에 로드 밸런싱과 서버 간 요청 처리가 용이하다.
- 단일 로그인(SSO) 구현 용이
- 한 번의 로그인으로 여러 시스템이나 서비스에 접근할 수 있어 UX가 향상된다.
장점
- 사용자 인증에 필요한 모든 정보가 토큰에 있어 별도의 인증 저장소가 필요하지 않다.
- 분산 마이크로 버시스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는다.
- 토큰 서명을 확인하는 작업에 CPU를 사용하여 I/O 또는 네트워크 엑세스가 필요하지 않아 웹 서버 하드웨어에서 확장이 용이하다.
단점
- 토큰은 클라이언트에 저장되기 때문에 데이터베이스에서 사용자 정보를 조작해도 토큰에 직접 적용 불가
- 더 많은 필드가 추가되면 토큰의 크기가 커질 수 있다.
- 토큰은 대부분의 요청에 포함되기 때문에 데이터 트래픽 크기에 영향을 미칠 수 있다.
세션 인증과 JWT의 차이
| 항목 | Session | JWT |
|---|
| 정의 | 서버가 사용자의 인증 상태를 세션으로 관리 | 서버가 인증 상태를 저장하지 않고 각 요청마다 토큰을 이용 |
| 특징 | 서버는 세션 정보를 저장 클라이언트는 세션 ID 이용 | 인증 토큰은 권한 관련은 권한 관련 정보를 소유하고 매 요청에 포함된다. |
| 장점 | 사용자 별 맞춤형 상호작용 가능 | 서버 부하 감소, 시스템 확장성 향상 |
| 단점 | 서버 부하 증가, 확장성 제한 | 토큰 관리 및 보안에 주의 필요 |
토큰 인증 방식의 보안 측면 고려사항
1. 토큰의 안전한 생성
- 강력한 암호화 알고리즘 사용
- 토큰 생성 시 충분한 엔트로피를 확보하고 강력한 암호화 알고리즘을 사용하여 토큰을 생성하도록 한다.
- 민감 정보 포함 주의
- 토큰에 민감한 정보(비밀번호, 개인 식별 정보 등)를 직접 포함시키지 않아야 한다.
2. 토큰의 전송 보안
- HTTPS 사용
- 모든 토큰 전송은 HTTPS를 통해 이루어져한다.
- HTTPS 프로토콜을 통해 중간자 공격(Main-in-the Middle Attack)으로 부터 토큰을 보호할 수 있다.
- 헤더를 통한 토큰 전송
- 토큰은 HTTP 헤더를 통해 전송되어야 하며 URL 파라밐터를 통한 전송은 피해야한다.
3. 토큰의 저장 방법
- 클라이언트 측 보안
- 토큰은 쿠키, 로컬 스토로지, 세션 스트로지 중 보안의 측면에서 가장 적합한 곳에 저장해야한다.
- 쿠키에 저장할 경우 Secure, HttpOnly 옵션을 통해 XSS 공격으로부터의 보호를 해야한다.
- 모바일 어플리케이션
- 보안이 강화된 저장소(KeyChain, KeyStore)등에 토큰을 저장한다.
4. 토큰의 유효기간 관리
- 긴 유효 기간 지양
- 토큰은 탈취 되었을 경우를 대비해 가능한 짧은 유효 기간을 설정한다.
- 만료된 토큰 처리
- 시스템은 만료된 토큰을 적절히 처리할 수 있어야 하며 사용자에게 새 토큰을 발급하거나 재인증을 요구할 수 있어야 한다.
5. 접근 제어와 관리
- 세밀한 권한 설정
- 토큰에는 사용자 권한 수준이 명시되어야 한다.
- 서버는 사용자 권한을 기반으로 사용자가 요청하는 리소스나 작업에 대한 접근을 제어한다.
- 권한 변경 시 토큰 재발급
- 사용자의 권한 수준이 변경되었을 경우, 해당 변경 사항을 반영하기 위해 새로운 토큰을 발급한다.
6. 토큰 갱신 및 폐기
- 토큰 갱신 매커니즘 구현
- 사용자가 계속 활동 중일 때 서비스 중단 없이 보안을 유지하기 위한 토큰 갱신 매커니즘을 구현한다.
- 토큰 폐기
- 사용자가 로그아웃하거나 토큰 탈취가 의심될 경우 해당 토큰을 즉시 폐기하고 접근을 차단해야 한다.