JWT

dkdud5135·2022년 1월 11일
0

wecode

목록 보기
14/16

JSON Web Token(JWT)이란?

: JSON Web Token(JWT)은 웹 표준(RFC 7519)으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가 수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달

수많은 프로그래밍 언어 지원

  • JWT는 C, Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 등 대부분의 주류 프로그래밍 언어에서 지원

자가 수용적 (self-contained)

  • JWT는 필요한 모든 정보를 자체적으로 지니고 있음. JWT 시스템에서 발급된 토큰은, 토큰에 대한 기본 정보, 전달할 정보(로그인 시스템에서는 유저 정보) 그리고 토큰이 검증됐다는 것을 증명해 주는 signature를 포함하고 있음

쉽게 전달함

  • JWT는 자가 수용적이므로, 두 개체 사이에서 손쉽게 전달될 수 있음. 웹서버의 경우 HTTP의 헤더에 넣어서 전달할 수도 있고, URL의 파라미터로 전달할 수도 있음.

JWT는 어떤 상황에서 사용되나?

1. 회원 인증
: 유저가 로그인을 하면, 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달.
그 후, 유저가 서버에 요청을 할 때마다 JWT를 포함하여 전달함. 서버가 클라이언트에게서 요청을 받을 때마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리함.
서버 측에서는 유저가 로그인 되어있는지 안 되어있는지 신경 쓸 필요가 없고, 유저가 요청을 했을 때 토큰만 확인하면 되니, 세션 관리가 필요 없어서 서버 자원을 많이 아낄 수 있음.

2. 정보 교류
: JWT는 두 개체 사이에서 안정성 있게 정보를 교환하기 좋은 방법
그 이유는, 정보가 sign이 되어있기 때문에 정보를 보낸 이가 바뀌지 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있음.

  • JWT는 . 을 구분자로 3가지의 문자열로 되어있음

: Header는 두가지의 정보를 가지고 있음

  • typ : 토큰의 타입을 지정. (JWT)
  • alg : 해싱 알고리즘을 지정. 해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA가 사용되며, 이 알고리즘은 토큰을 검증할 때 사용되는 signature 부분에서 사용

Payload

: Payload 부분에는 토큰을 담을 정보를 가지고 있음
여기에 담는 정보의 한 '조각'을 claim(클레임)이라고 부르며, 토큰에는 여러게의 claim을 넣을 수 있음

claim의 종류

  • registered claim(등록된 클레임)
  • public claim(공개 클레임)
  • private claim(비공개 클레임)

registered claim

: 등록된 클레임은 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임. 등록된 클레임의 사용은 모두 선택적(optional)

  • iss : 토큰 발급자(issuer)
  • sub : 토큰 제목(subject)
  • aud : 토큰 대상자(audience)
  • exp : 토큰의 만료시간(expiration), 시간은 NumericDate 형식으로 되어있어야 하며(ex. 1480849147370) 언제나 현재 시간보다 이후로 설정되어 있어야 함
  • nbf : 토큰의 활성 날짜. NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않음
  • iat : 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단할 수 있음
  • jti : JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용. 일회용 토큰에 사용하면 유용함

public claim

: 공개 클레임은 충돌이 방지된(collision-resistant) 이름을 가지고 있어야 하며, 충돌을 방지하기 위해서는 클레임 이름을 URI 형식으로 만듦

{
"https://youngs.com/jwt_claims/is_admin": true
}

private claim

: 비공개 클레임은 양 측간에(보통 클라이언트 <-> 서버) 협의하에 사용되는 클레임 이름. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할 때 유의해야 함

{
"username": "youngs"
}

Signature

: 헤더의 인코딩 값과, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬하여 생성

profile
🐿 개발중...

0개의 댓글