JWT

Jinhyeon Son·2020년 6월 30일
0

개념

목록 보기
21/26

JWT란?

JSON Web Token의 약자, 웹표준 RFC 7519에 정의되어 있다
서버와 클라이언트 사이의 통신에서 인증 여부를 판단하고
클라이언트의 권한을 파악하기 위해 사용하는 액세스 토큰의 한 구현체
Claim(사용자의 속성 정보)를 JSON형태로 갖는 Claim기반의 Web token이다

JWT 용도

  • 회원 인증 : 로그인 시 토큰을 발급하고 이 후 요청 시 토큰을 포함하여
    HTTP request함으로서 유저가 요청한 작업에 권한이 있는지 확인

  • 정보 교류 : 토큰 생성자의 signature를 포함하므로 양자간 데이터 교환에
    있어서 무결성을 검증할 수 있다

JWT의 특징

  • Self-Contained방식으로 토큰이 생성될 때 모든 정보가 토큰에 담긴다
  • URL-safe JSON (URL로 이용할 수 있는 문자로만 구성)
  • HMAC에 사용되는 signature에 비밀키, 공개키를 모두 사용할 수 있다
  • JSON에는 \n등의 개행 문자가 존재하므로 BASE64인코딩을 통해
    하나의 문자열로 변환한다

장점

  • stateless 적합 : 토큰은 클라이언트사이드에 저장되므로 stateless 기반 서비스에 적합하다
  • scalability : 서버기반 인증시스템에 비해서 서버의 scalability(확장성)이 높음
  • 보안성 : 세션 인증을 위한 쿠키 전달이 필요 없으므로 보안성 향상
  • extensibility : scalability와는 조금 다른 확장성, 서버의 확장성이 아닌
    로그인이 사용되는 분야, 토큰에 포함되는 정보의 종류 등에 대한 확장성이 높다
  • CORS : 어떤 디바이스와 도메인에서도 토큰이 유효하면 정상적으로 처리됨
  • 다양한 환경과 언어를 지원

단점

  • 클라이언트 사이드에 저장되므로 DB에서 사용자 정보가 조작되더라도 토큰에
    직접 적용하기가 불가능하며 토큰을 새로 발행해야만 한다
  • 서비스가 커지면 토큰이 필요로하는 데이터가 커져 토큰이 커지고
    이에 따라 매 HTTP요청의 트래픽 양에 영향을 미칠 수 있다
  • Header와 Payload가 단순히 BASE64로 인코딩되어있기 때문에
    클라이언트 사이드에 토큰 내부의 정보가 노출된다

JWT의 동작 원리

JWT 구조

JWT는 Header, Payload, Signature 세 부분으로 나뉘며 
Header와 Payload의 경우 BASE64 Encoding, Signature의 경우
Header에서 지정한 알고리즘으로 생성된 HMAC을 BASE64 Encoding한다
{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg : HMAC에 사용될 해시 알고리즘을 지정한다 ex) RSA, SHA256 등
  • typ : 토큰의 타입 ex) JWT

Payload

Payload 부분에는 토큰에 담을 정보가 위치한다
각 정보는 Claim이라고 부르며 key:value 쌍으로 존재한다
Claim은 크게 세 분류로 나뉜다
  • registered claim
    토큰의 속성을 정의하기 위하여 이름이 이미 정해진 클레임
    registerd claim의 사용은 모두 선택적이다
    • iss : 토큰 발급자 (issuer)
    • sub : 토큰 제목 (subject)
    • aud : 토큰 대상서비스 (audience)
    • exp : 토큰 만료시간 (expiration)
    • nbf : 토큰 활성시간 (NOT BEFORE)
    • iat : 토큰이 발급된 시간 (issued at)
    • jti : JWT의 고유 식별자
  • public claim
    해당 토큰이 사용되는 엔드포인트 또는 웹페이지를 명시하는 클레임
    토큰의 충돌을 방지하기 위해 클레임의 키를 URI 형식으로 짓는다
	ex) "https://velog.io/jwt_claims/is_admin"
  • private claim
    토큰을 통해 전달하기로 협의된 커스텀 클레임
{
    "iss": "velopert.com",  // registered claim
    "exp": "148527000000", // registered claim
    "https://velog.io/jwt_claims/is_admin": true, // public claim
    "userId": "11028373727102", // private claim
    "username": "velopert"		// private claim
}

Signature

Signature 부분에는 {Header(Base64).Payload(Base64)} 형태를
Header의 alg에 명시된 해시 알고리즘으로 해시한 HMAC을 BASE64로 인코딩한 값

0개의 댓글