JWT
- JWT 란?
토큰 기반의 인증 시스템중 하나로, Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.
JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. → 주로 회원 인증이나 정보 전달에 사용된다.
- JWT 구조
JWT 토큰 구조는 HEADER.PAYLOAD.VERIFY_SIGNATURE 로 이루어져 있으며, 각 데이터는 온점(.)으로 구분 된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1) Header : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
2) payload : eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
3) VERIFY_SIGNATURE : SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1) HEADER :
JWT를 검증하는데 필요한 정보를 가진 데이터이다. VERIFY_SIGNATURE 에 사용한 암호화 알고리즘과 토큰 타입, key 의 id 등의 정보를 가지고 있습니다. 난해한 문자열처럼 보이지만 암호화된 값은 아닙니다.
# 헤더 값 해석하면
HEADER 정보
{
"typ": "JWT",# 토큰 타입"alg": "HS256"# 알고리즘
}
2) PAYLOAD :
실질적으로 인증에 필요한 데이터를 저장한다.
데이터 각각의 필드를 클레임(claim) 이라고 하고, 대부분의 경우 클레임에 username 또는 user_id 를 포함합니다.
인증시에 payload에 있는 username을 가져와서 사용자의 정보를 인증할 때 사용해야 하기 때문니다.
또한 payload에서 중요하게 살펴보아야 할 정보는 토큰 발행시간(iat)과 토큰 만료시간(exp) 입니다. 토큰의 만료 시간이 지나면 새로운 토큰을 발급받아야 하기 때문에
# 사용자를 인증하는 정보를 가지고 있어 payload 정보를 기준으로 로그인한다.
PAYLOAD 정보
{
"token_type": "access",# 토큰의 종류. 여기서는 access 토큰입니다."exp": 1656293275,# 토큰의 만료시간입니다. (Numeric Date)"iat": 1656293095,# 토큰의 발행시간입니다. (Numeric Date)"jti": "2b45ec59cb1e4da591f9f647cbb9f6a3",# json token id 입니다."user_id": 1# 실제 사용자의 id값이 들어있습니다.
}
3) VERIFY_SIGNATURE :
VERIFY SIGNATURE 는 토큰 자체의 진위여부를 판단하는 용도로 사용한다.
VERIFY SIGNATURE 는 Base64UrlEncoding 된 header 와 payload 의 정보를 합친 뒤 SECRET_KEY 를 이용하여 Hash 를 생성하여 암호화 합니다.
→ Header, payload가 서류라면 VERIFY_SIGNATURE는 서류에 찍는 도장과 같다. 아무리 서류가 진짜라고 해도 인증된 도장이 없으면 서류가 효력이 없는거 처럼 VERIFY_SIGNATURE도 도장과 같은 역할을 한다.
- JWT 인증 방식

→ 애플리케이션 실행 후 로컬 스토리지에 토큰 값의 존재의 유무로 판단
[인증 과정]
- 클라이언트에서 사용자의 인증 정보를 서버에 전달합니다.
- 서버는 인증 정보로 인증을 처리하고 JWT를 생성하여 클라이언트에 전달합니다.
- 클라이언트는 JWT를 브라우저에 저장합니다.
- 클라이언트는 이후 이루어지는 요청에 JWT를 이용합니다.
- 서버는 JWT를 검증하여 인증을 처리합니다.
- JWT가 만료되면 토큰을 refresh 합니다
[JWT 내부 관점 | 인증 과정]
- 사용자 로그인 시 서버는 사용자 인증을 완료하고 외부에 노출되어도 문제가 없는 인증관련 정보(사용자 ID, 권한 등)를 JSON 형태로 만든다. → Payload
- JSON 형태의 Payload를 base64 인코딩을 해서 문자열을 만들고, 미리 정한 시스템의 SecretKey(전체 시스템에서 사용하는 암호라고 이해하면 됨)를 이용하여 서명 문자열을 생성한다. → VERIFY_SIGNATURE
- Header정보, 인증정보(Payload), 서명 문자열을 하나의 문자열로 합친 후 클라이언트로 전송한다.
- 서버는 인증 요청에 대한 응답으로 이 인코딩된 문자열을 클라이언트로 전달한다.
- 클라이언트는 서버로부터 받은 토큰을 클라이언트의 저장공간(브라우저의 경우 쿠키나 브라우저내 로컬 스토리지 등)에 저장한다.
- 클라이언트는 매번 요청 시 이 토큰을 서버로 같이 전달한다.
- 서버는 클라이언트의 요청에서 받은 토큰 값을 이용하여 어떤 사용자의 요청인지 등을 확인한다.
'woncoding > TIL' 카테고리의 다른 글
| TIL | 2.8.수 [TDD | Test Code] (0) | 2023.02.09 |
|---|---|
| TIL | 2.7.화 [Rest API / Fast API] (0) | 2023.02.09 |
| TIL | 2.3.금 [CS 기초지식 | Django ORM] (0) | 2023.02.06 |
| TIL | 2.2.목 [CS 기초지식 | 동시성과 병렬성] (0) | 2023.02.06 |
| TIL | 2.1.수 [CS 기초지식 | 쿠키와 세션] (0) | 2023.02.06 |