[ETC] Jwt 구성, 헤더, 페이로드

1 분 소요

출저 및 참고 사이트 :

https://mangkyu.tistory.com/56



JWT (Json Web Token)

  • Session DB를 사용하지 않고, 오로직 토큰을 주고받는 식으로만 유저의 인증을 처리한다.



JWT 구성

  • JWT의 큰 틀은 다음과 같이 구성된다.
    • 헤더 (HEADER)
    • 페이로드 (PAYLOAD)
    • 서명 (SIGNATURE)


헤더 (HEADER)

  • 헤더의 구성요소
    • typ : 토큰의 타입을 지정
    • alg : Sginature를 해싱하기 위한 알고리즘을 지정 예시)
      \{
        "alg':"HS256",
        "typ":JWT
      }
      


페이로드 (PAYLOAD)

  • 토큰에서 사용할 정보의 조각들인 클레임이 담겨있다.
  • 클레임은 총 3가지로 나뉘어지며 Key : Value 형태로 다수의 정보를 넣을 수 있다.
    • iss : 토큰 발급자
    • sub : 토큰 제목
    • aud : 토큰 대상자
    • exp : 토큰 만료 시간
    • nbf : 토큰 활성 날짜
    • iat : 토큰 발급 시간
    • jti : JWT 토큰 식별자 (JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Toekn)등에 사용

서명(Sginature)

  • 서명은 토큰을 인코딩 하거나 유효성을 검증 할때 사용하는 고유한 암호화 코드이다.
  • 헤더와 페이로드의 값을 각각 Base64로 인코딩하고, 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱을하고, 이 값을 다시 Base64로 인코딩해서 생성한다.
  • 생성된 토큰은 다음과 같이 HTTP 통신을 할때 Authorization 이라는 key의 value 로 사용된다.
    \{
      "Authorization" : "Bearer {생성된 토큰 값}",
    }
    

JWT Process

  1. 사용자가 id와 password를 통해 로그인을 시도
  2. 서버는 요청을 확인하고, 시크릿 키를 통해 액세스 토큰을 생성후 클라이언트에게 전달
  3. 클라이언트는 토큰을 브라우저에 저장, 이후 API 요청을 할때 Header 에 Access tokken을 담아서 서버로 보낸다.
  4. 서버는 토큰의 유효성을 검사하고 유저의 정보와 권환을 확인 후 서비스를 제공

주의점

  • 페이로드 자체는 암호화 된것이 아니여서 중간자 어택으로 payload 를 탈취해 인코딩하면 데이터를 볼수 있기 때문에 토큰에는 중요 데이터는 넣지 않아야 한다.
  • JWT는 한먼 만들어지면 제어가 불가능하다. 토큰을 임의로 삭제할 수가 없으니 꼭 만료 시간을 넣어줘야 한다.
  • 정보가 많아 질수록 토큰의 길이가 늘어나서 네트워크에 부하를 줄 수 있다.