_won_
wonprogrammer
_won_
전체 방문자
오늘
어제
  • 분류 전체보기
    • woncoding
      • TIL
      • WIL
    • source Code
      • Python
      • Programmers
      • BAEKJOON

블로그 메뉴

  • 방명록

티스토리

Github · Wonprogrammer
hELLO · Designed By 정상우.
_won_

wonprogrammer

TIL | 2.6.월 [CS 기초지식 | JWT]
woncoding/TIL

TIL | 2.6.월 [CS 기초지식 | JWT]

2023. 2. 7. 12:29

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 인증 방식

 

→ 애플리케이션 실행 후 로컬 스토리지에 토큰 값의 존재의 유무로 판단

 

[인증 과정]

  1. 클라이언트에서 사용자의 인증 정보를 서버에 전달합니다.
  2. 서버는 인증 정보로 인증을 처리하고 JWT를 생성하여 클라이언트에 전달합니다.
  3. 클라이언트는 JWT를 브라우저에 저장합니다.
  4. 클라이언트는 이후 이루어지는 요청에 JWT를 이용합니다.
  5. 서버는 JWT를 검증하여 인증을 처리합니다.
  6. JWT가 만료되면 토큰을 refresh 합니다

 

[JWT 내부 관점 | 인증 과정]

  1. 사용자 로그인 시 서버는 사용자 인증을 완료하고 외부에 노출되어도 문제가 없는 인증관련 정보(사용자 ID, 권한 등)를 JSON 형태로 만든다. → Payload
  2. JSON 형태의 Payload를 base64 인코딩을 해서 문자열을 만들고, 미리 정한 시스템의 SecretKey(전체 시스템에서 사용하는 암호라고 이해하면 됨)를 이용하여 서명 문자열을 생성한다. → VERIFY_SIGNATURE
  3. Header정보, 인증정보(Payload), 서명 문자열을 하나의 문자열로 합친 후 클라이언트로 전송한다.
  4. 서버는 인증 요청에 대한 응답으로 이 인코딩된 문자열을 클라이언트로 전달한다.
  5. 클라이언트는 서버로부터 받은 토큰을 클라이언트의 저장공간(브라우저의 경우 쿠키나 브라우저내 로컬 스토리지 등)에 저장한다.
  6. 클라이언트는 매번 요청 시 이 토큰을 서버로 같이 전달한다.
  7. 서버는 클라이언트의 요청에서 받은 토큰 값을 이용하여 어떤 사용자의 요청인지 등을 확인한다.
저작자표시 비영리 변경금지 (새창열림)

'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
    'woncoding/TIL' 카테고리의 다른 글
    • TIL | 2.8.수 [TDD | Test Code]
    • TIL | 2.7.화 [Rest API / Fast API]
    • TIL | 2.3.금 [CS 기초지식 | Django ORM]
    • TIL | 2.2.목 [CS 기초지식 | 동시성과 병렬성]
    _won_
    _won_
    Coding Practice blog

    티스토리툴바