본문 바로가기

크래프톤 정글/TIL

[0주차] JWT 란?

JWT(Json Web Token)란?

- 토큰 관련된 인증은 대부분 로그인에 사용

- 웹표준을 따름

- JSON 객체를 사용하여 정보를 전달

- 필요한 모든 정보를 한 객체에 담아서 전달하기에, JWT 한가지로 인증을 마칠 수 있음.

 

JWT의 구조

Head(헤더)    .   Payload(내용)   .   Signature(서명)

- 헤더, 내용, 서명이 .(dot) 구분자로 하여 JWT 토큰 1개를 이룸

 

해더 (Header)

- 두가지 정보를 지님.

- 해시 알고리즘 + 토큰 타입

- 토큰 타입으로는 JWT

- 해싱 알고리즘으로는 보통 HMAC SHA256, RSA가 사용/ 이 알고리즘은 토큰 검증할 떄, 사용되는 signature 부분에서 사용.

 

 + kid: Private key ID (구글 API에서는 필수 사항)

내용 (Payload)

- 토큰에 담을 정보

- 정보의 한 조각 단위를 클레임(claim)이라 부르고, name/ value의 한 쌍으로 이루어짐.

- 토큰의 여러개의 클레임 넣을 수 있음.

 

- 클레임의 종류 (등록된(registered)/공개(public)/비공개(private))

클레임의 종류: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1

 

등록된 클레임

- 3글자(iss/exp...)로 정의

- 필수는 아니나 사용이 권장.

- 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보를 담기위해 미리 정해진 클레임.

 

iss (issuer): 토큰 발급자, 구글의 서비스 계정을 입력

exp (expiration time): 토큰 만료시간, 시간은 NumericDate 형식으로 날짜를 지정. 언제나 현재 시간(datetime.utcnow())보다 이후로 설정. (인증 요청 시간 + 1시간 ) 아래는 등록된 클레임 중 하나인 exp의 예시

'exp': datetime.utcnow() + timedelta(seconds=60)

sub (subject): 토큰 제목 (optional)

aud (audience): 토큰 대상자. 

jti: jwt의 고유식별자로서, 주로 중복적인 처리를 방지하기 위해 사용. 일회용 토큰에 사용하면 유용.

iat: 인증 요청 시간(Numeric date 형식으로 표시)

 

공개 클레임:

충돌이 방지된 이름을 가지고 있어야 함. -> 클레임 이름 형식이 URI인 이유.

아래는 공개클레임의 예시

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

 

비공개 클레임:

양 측간의 (보통 클라이언트 <-> 서버) 협의하에 사용되는 클레임/ 이름 중복에 유의. 충돌일어날 수 있음.

{
    'user_id': id_recieve
}
서명 (signature)

- 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후, 주어진 비밀키로 해쉬(헤더의 해쉬 알고리즘 사용)를 하여 생성.

- 서명 부분을 만드는 슈도코드(pseudocode)의 종류는 

해쉬 알고리즘 { 해더 . 내용 . 시크릿 키} 

이 슈도코드를 secret key로 해싱하고 base64로 인코딩하면 signature값 나옴.

 

JWT 토큰을 검증, 생성하고 싶으신 분들은 JWT.IO 브라우저를 사용해보자. (https://jwt.io/)

 

https://jwt.io/

트러블슈팅)

파이썬 JWT와 PyJWT 같이 설치하면 JWT가 실행되어 에러발생!