[TIL] JWT (Json Web Token)

·2023년 6월 12일
0

TIL

목록 보기
5/7
post-thumbnail

JWT

Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.

✔️JWT 특징

  • 가볍고 자가 수용적
  • HTTP header / URI 파라미터를 이용해 전달 가능
  • 다양한 프로그래밍 언어에서 지원

✔️JWT 구조

3가지로 구성 - Header, Payload, Signature
Json 형태인 각 부분은 Base64Url로 인코딩 되어 표현된다. 중간엔 .구분자를 사용하여 각각의 부분을 이어준다.

✏️Header

토큰의 헤더: typ + alg

  • typ: 토큰의 타입 지정
  • alg: 해싱 알고리즘을 지정 (보통 HMAC SHA256 / RSA 사용)
    - HMAC(해시 메시지 인증코드): 송신자와 수신자만이 공유하고 있는 키와 메시지를 혼합해 해시 값 생성
    • RSA: 공개키 암호 알고리즘 중 하나. 암호화나 전자서명의 용도로 사용됨
{
	"alg": "HS256",
	"typ": "JWT"
}

✏️Payload

토큰에서 사용할 정보의 조각들인 Claim이 담겨있다.
Key-Value 형태로 다수의 정보를 넣을 수 있다.

  1. 등록된 클레임 (Registerd Claim)
    토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
  • iss: 토큰 발급자(issuer)
  • sub: 토큰 제목(subject)
  • aud: 토큰 대상자(audience)
  • exp: 토큰 만료 시간(expiration), NumericDate 형식으로 되어 있어야 함 ex) 1480849147370
  • nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
  • iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
  • jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용
  1. 공개 클레임 (Public Claim)
    사용자 정의 클레임으로, 공개적 정보를 위해 사용됨
    충돌 방지를 위해 URI 포맷 이용
{
	"https://velog.io/@minz-cha": true
}
  1. 비공개 클레임 (Private Claim)
    클라이언트와 서버 간 합의하에 사용되는 이름들 (데이터)
{
	"user_id": "ming",
	"user_name": "minz",
	"age": 23,
}

✏️Verify Signature (서명)

토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드.
header + payload 정보를 비밀키로 해쉬를 하여 생성.


✔️JWT 동작원리

  1. 사용자가 id와 password를 입력하여 로그인 요청
  2. 해당 요청을 받은 서버는 회원 DB에 접근하여 사용자 정보가 있는지 확인
  3. 확인이 되면 서버는 로그인 요청을 확인하고, 토큰 발급
  4. 이를 클라이언트에 전달
  5. 클라이언트는 HTTP 요청 헤더에 JWT를 넣어 요청
  6. 서버는 별도의 인증과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증
  7. 클라이언트 요청에 대한 응답과 요청 데이터 전달

0개의 댓글