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/)

트러블슈팅)
파이썬 JWT와 PyJWT 같이 설치하면 JWT가 실행되어 에러발생!
'크래프톤 정글 > TIL' 카테고리의 다른 글
| [1주차] 재귀함수의 장단점 (+stack overflow/ 재귀 한계) (0) | 2023.10.20 |
|---|---|
| [1주차] 파이썬 sort, sorted (0) | 2023.10.16 |
| [1주차] 알고리즘을 위한 파이썬 기본 문법 (0) | 2023.10.16 |
| [1주차] 배열과 리스트의 차이 (0) | 2023.10.14 |
| [0주차] jinja2 (+ SSR과 CSR의 비교) (0) | 2023.10.14 |