본문 바로가기
Develop/Spring

JWT 개요

by jaeyoungb 2022. 11. 24.

JWT(Json Web Token)

  • 데이터를 안전하고 간결하게 전송하기 위해 고안된 토큰 인증 방식
  • JSON 포맷의 토큰 정보를 인코딩 후, 인코딩된 토큰 정보를 Secret Key로 서명한 메시지를 Web Token으로써 인증 과정에 사용
  • JWT : https://jwt.io/

 

JWT 종류

  1. Access Token
    - 보호된 정보들(사용자의 연락처, 사진 등)에 접근할 수 있는 권한을 부여받는 데에 사용된다.
    - 비교적 짧은 유효기간
  2. Refresh Token
    - Access Token의 유효기간이 만료되면, Refresh Token을 사용해 새로운 Access Token을 발급받는다.
    - 비교적 긴 유효기간

 

JWT 구조

 

https://medium.com/@sureshdsk/how-json-web-token-jwt-authentication-works-585c4f076033

 

- header

어떤 종류의 토큰이고 어떤 알고리즘으로 Sign할지 JSON 포맷 형태로 정의하고, base64 방식으로 인코딩

- payload

사용자의 정보, 어떤 정보에 접근 가능한지에 대한 권한 정보를 JSON 포맷 형태로 정의하고, base64 방식으로 인코딩

* 토큰이 탈취되어, 디코딩될 수 있으므로 민감한 정보는 담지 않는 것이 좋다.

- Signature

원하는 비밀키와 Header에서 지정한 알고리즘을 이용해 Header와 Payload에 대해 단방향 암호화를 수행

 

토큰 기반의 인증 절차

  1. 클라이언트가 서버에 id, password를 담아 로그인 요청
  2. 서버가 id, password가 일치하는지 확인 후, 암호화된 토큰을 생성
    - Access Token, Refresh Token을 모두 생성(두 토큰이 같은 정보를 담을 필요는 없음)
  3. 토큰을 클라이언트에게 전송하고, 클라이언트는 토큰을 저장
    - 저장 위치는 Local Storage, Session Storage, Cookie 등
  4. 클라이언트가 HTTP Header(Authorization Header) 또는 Cookie에 토큰을 담아 Request 전송
    - Bearer authentication 이용
    https://learning.postman.com/docs/sending-requests/authorization/#bearer-token
    https://tools.ietf.org/html/rfc6750
  5. 서버가 토큰을 검증한 후, 클라이언트의 Request 처리하고 Response 전송

 

장점

  • 상태를 유지하지 않고, 확장에 용이한 애플리케이션을 구현하기 좋음(Stateless, Scalable)
  • 클라이언트가 Request를 전송할 때마다 자격 증명 정보를 전송할 필요가 없음
  • 인증 담당 시스템을 다른 플랫폼으로 분리하는 것이 용이
  • 권한 부여에 용이

단점

  • 토큰이 탈취되어, Payload가 디코딩될 수 있음
  • 토큰 길이가 길어지면, 네트워크에 부하를 줄 수 있음
  • 토큰은 자동으로 삭제되지 않음

 

JWT 생성 및 검증 테스트

https://github.com/bangjaeyoung/jwt-practice