본문 바로가기

IT Knowledge

[토큰 기반 인증] JWT (JSON Web Token)

[토큰 기반 인증] JWT (JSON Web Token)


1. JWT?

: JSON 기반의 인증 토큰을 생성/관리하는 공개 웹 표준(RFC 7519) 기술이며, dot(.)을 구분자로 하여 Header / Payload / Signature 3개의 영역으로 구성되어 있다※ JWT는 JWS(JSON Web Signature) 와 JWE(JSON Web Encryption)에 의존적이다. 



2. JWT 구조

    • JWT header

: JWT header는 서명할 해시 알고리즘과 토큰 타입을 나타내는 2가지 필드로 구성되어 있으며 하나의 속성값에 하나의 Value 값이 사용된다.


    • JWT Payload

: jwt PayloadJWT 토큰의 데이터 및 관련 정보를 다루는 영역으로 Claim이라는 Payload 내 정보를 나타내는 값을 사용하며 Name / Value 형태로 구성되어 있다.


    • JWT Signature

: jwt Signature는 헤더와 페이로드의 인코드 된 값을 비밀키로 해쉬하여 생성된 값이며, 전달된 토큰이 중간에 변경되지 않았는지 보장해주는 값이다. 



※ Header 및 Claim의 필드에 대한 상세 설명은 해당 URL 참조 (https://en.wikipedia.org/wiki/JSON_Web_Token#Standard_fields)


[그림 1] JWT 토큰 구조



3. JWT 사용 이유

    • 사용자 인증
: 세션을 대신 하여 stateless (무상태)의 토큰을 발급 함으로써 서버에 사용자 정보를 저장하지 않아 서버에 부하가 줄면서
사용자 인증시 발급되는 Token을 통해 사용자를 확인할 수 있다. 
    • 데이터 검증
: JWT 토큰의 경우 서버에서 해시 알고리즘을 통해 서명되었기 때문에 토큰에 대한 무결성 검증을 해 토큰 변조 등에 안전하다.
    • 서버 확장의 용이성 
: 토큰은 세션과 달리 서버에 독립적으로 사용할 수 있어 서로 다른 어플리케이션 간의 인증 확인을 해줄수 있다.

4. 보안 고려사항
    • 토큰 내 주요 정보 저장
: JWT 토큰의 경우 요청 되는 값에 주요정보(개인정보 및 민감정보 등) 전송 시 JWT 토큰이 복호화 되지 않아야하며 식별되지 않도록 전송해야 합니다.
    • 토큰 안전성
: JWT 토큰에 대한 안전성 (재사용 / 파기 / 사용횟수 / 만료시간)을 고려해야 합니다.
관련 Registerd Field 로는 iat / exp 등이 있다.
    • 토큰 Scope 설정
: 토큰 인증을 요청한 사용자에게 올바른 인증 및 권한이 부여 되는지 서버 단에서 체크 해야합니다.
    • 통신구간 안전성 (SSL/TLS) 적용
: JWT 토큰을 통한 사용자 인증 및 권한 부여시 SSL / TLS 등의 암호화 프로토콜에서 토큰 전송이 이루어져야 합니다.
    • 서명키 보관
: JWT를 암/복호화 하는 키는 Web Storage 등과 같은 Client 단에 보관하지 말고 서버에 보관 / 관리 되어져야합니다.

5. Reference

: https://tools.ietf.org/html/rfc7519

: https://auth0.com/docs/jwt

: https://backend-intro.vlpt.us/4/01.html