JWT(Json Web Token)

배세훈·2021년 6월 16일
0

Etc/용어

목록 보기
5/16
post-thumbnail

JWT(Json Web Token) 이란?

  • 전자 서명 된 URL-safe (URL로 이용할 수 있는 문자만 구성된)의 Json 입니다.
  • JWT는 서버와 클라이언트 간 정보를 주고 받을 때 Http Request Header에 Json Token을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다.
  • JWT는 HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/Private Key 쌍으로 서명할 수 있습니다.

JWS Vs JWE

JWS와 JWE는 JWT와 관련된 표준입니다. JWS(Json Web Signature)는 "Json으로 전자 서명을 하여 URL-safe 문자열로 표현한 것"입니다. JWE(Json Web Encryption)는 "Json을 암호화하여 URL-safe 문자열로 표현한 것"입니다.
  • URL-safe는 URL에 포함 할 수 있는 문자만 포함하는 것입니다.

JWT Token 구성

JWT는 .(점)을 기준으로 세 파트로 나누어집니다.
순서대로 헤더(Header), 페이로드 (Payload), 서명(Sinature)로 구성합니다.
Base64 인코딩의 경우 "+", "/", "="이 포함되지만 JWT는 URI에서 파라미터로 사용할 수 있도록 URL-safe한 Base64url 인코딩을 사용합니다.

1. 헤더(Header)

  • 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.

  • 첫째는 토큰의 유형(JWT)을 나타내고, 두 번째는 HMAC, SHA256 도는 RSA와 같은 해시 알고리즘을 나타내는 부분입니다.
    ex) Header 예시

    {
    "typ": "JWT",
    "lag": "HS256"
    }

    type: type, 여기에서 토큰 유형이 JWT임을 나타낸다.
    alg: 토큰 서명 생성을 위한 해시 알고리즘인 algorithm을 의미한다. HS256은 HMAC-SHA256으로, 비밀 키를 사용하는 알고리즘

2. 페이로드(Payload)

  • 토큰에 담을 클레임(claim) 정보를 포함하고 있습니다.
  • Payload에 담는 정보의 한 '조각'을 클레임이라고 부르고 name / value의 한 쌍으로 이루어져 있습니다.
  • 토큰에는 여러개의 클레임을 넣을 수 있습니다.
  • 클레임의 정보는 등록된 (registered) 클레임, 공개(public) 클레임, 비공개 (private) 클레임으로 세 종류가 있습니다.
    ex) Payload 예시

    {
    "userId": "abcd1111",
    "username": "test1111",
    "email": "test@test.com",
    "iss": "testissu",
    "iat": 1515232545,
    "exp": 1517889808
    }

userId, username, email에는 원하는 값을 저장할 수 있다.
Standard Fields (선택 사항)

  • iss: Issuer. JWT 발행자/발급자
  • iat: Issued at. JWT가 발행된 시간
  • exp: Expiration Time. JWT 만료 시간

3. 서명(Signature)

  • secret key를 포함하여 암호화되어 있습니다.
    ex) Signature 예시

    const data = Base64UrlEncode(header) + '.' + Base64UrlEncode(payload);
    const hashedData = Hash(data, secret);
    const signature = Base64UrlEncode(hashedData);

  • 먼저 Heder와 Payload를 인코딩하고 점(.)으로 결합한다.

  • 해시 알고리즘(Header에서 정의)을 사용하여 데이터를 해시한다.

  • 해싱 결과를 인코딩하여 Signature를 얻는다.

계정 인증

  1. 사용자가 로그인 정보를 서버로 전송한다.
  2. 서버는 사용자로부터 받은 데이터로 JWT Token을 생성한다.
  3. 서버에서 생성된 JWT Token을 사용자에게 전송하고 사용자측에서 JWT Token을 저장한다.(일반적으로 header에 있음)
  4. 사용자가 인증이 필요한 요청과 저장한 JWT Token을 서버로 전송한다.
  5. 서버가 사용자로부터 받은 JWT Token 유효성을 검사하고 응답을 전송한다.
profile
성장형 인간

0개의 댓글