Posts JWT란 무엇인가
Post
Cancel

JWT란 무엇인가

JWT란?

JWT(Json Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다.

Claim: 데이터 정보. key-value 형태의 객체

특징

  • Self-contained
    • 필요한 정보를 자체적으로 지니고 있음.
    • 토큰 검증에 필요한 signature를 포함하여 JSON의 변조를 체크할 수 있음.
  • Stateless & Scalablity
    • 토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless, 클라이언트와 서버간 연결고리가 없기 때문에 확장에 유리함.
  • Authority & Extensibility
    • 클라이언트가 Header에 넣어 보내주는 JWT 정보를 통해 인증 처리를 할 수 있음.
  • Deliverability & Security
    • 두 개체(서버와 클라이언트) 사이에서 손쉽게 전달될 수 있음.
    • 쿠키를 사용하지 않아도 됨.

탄생 배경

  • 기존: Client ↔︎ API Server ↔︎ Database
    • 클라이언트가 요청을 보내고 클라이언트 정보를 가져오기 위해서는 무조건 Database를 거쳐야 했다.
  • JWT 이후: Client ↔︎ API ServerDatabase
    • Database를 거치지 않더라도 JWT 자체적으로 지니고 있는 정보를 사용하면 된다.

세션 vs 토큰

  • 세션: 서버 한대당 세션 스토리지 하나가 있어 정합성 이슈가 있다.
  • 토큰: access token을 발급하고 이를 요청할 때마다 클라이언트가 보내면 이를 검증하여 응답한다. 서버에 저장할 필요가 딱히 없다.

JWT를 사용하는 상황

회원 인증, 정보 교류

JWT 구조

  • header
    • alg: Hashing Algorithm (HMAC SHA-256 or RSA)
    • typ: Token Type
  • payload
    • registered claim
      • issuer, subject, audience, expiration, issued at, jwt id
    • public claim
      • URL
    • private claim
      • 실제 사용될 정보
  • signature

한계점

  • 토큰 만료 시 복잡한 절차가 필요함.
  • 토큰이 탈취될 우려가 있음.

보완 전략

  • Symmetric-key cryptography (대칭키 암호화)
    • Server-side: Server can read and write
    • Client-side: user can only read
  • Refresh Token
    • 서버가 Access Token과 Refresh Token을 함께 발급해준다.
    • 요청할 때 Access Token이 만료되었다면 Refresh Token 확인 후 새로운 Access Token과 Refresh Token을 발급해준다 (Refresh Token은 이때 새로 발급해줄 수도 있고 아닐 수도 있음)

MSA 환경에서의 JWT 사용

  • MSA 환경에서 Access Token을 사용하여 인증 처리를 한다면 회원 정보를 가져오기 위해 각 서버마다 Access Token과 함께 Authorization 서버에 요청해야 한다는 문제가 있다.
  • 하지만 Access Token으로 JWT를 사용한다면 토큰 안에 원하는 정보가 이미 토큰 안에 들어 있기 때문에 그때마다 Authorization 서버에 요청하지 않아도 된다. 또한 MSA에서 클라이언트와 서버들 사이에 API Gateway가 있다면, Authorization Server를 제외한 모든 서버는 API Gateway 뒤로 감춰지고 클라이언트와 직접적으로 소통하지 않는다. Authorization 서버가 Client에 access token을 발급해주고, 클라이언트는 Access Token을 가지고 요청을 하면 API 게이트웨이가 이를 받아 Authorization 서버에 요청하고, Authorization 서버는 JWT payload에 있는 정보를 요청 header에 담는다. 그럼 다른 서버는 요청 헤더 값을 꺼내 사용하기만 하면 된다.
This post is licensed under CC BY 4.0 by the author.

React 자습서 따라하기: #1 React 시작하기

🐥 주니어 성장일기: 2021.04.25

Loading comments from Disqus ...