본문 바로가기
개발 지식/정리

JWT (Json Web Token)

by 꾸준함 2023. 3. 11.

JWT

  • JWT는 header, payload, signature로 구성되어 있으며 header는 signature를 해싱하기 위한 알고리즘 정보가 담겨있고 payload는 실제로 사용될 데이터들이 담겨 있습니다. signature는 토큰의 유효성 검증을 위한 문자열로 이 문자열을 통해 이 토큰이 유효한 토큰인지 검증 가능.
  • JSON 객체를 사용해서 토큰 자체에 정보를 저장하는 Web Toekn 입니다.
  • Header, Payload, Signature 3개의 부분으로 구성 되어있고, 쿠키나 세션을 이용한 인증보다 안전하고 효율적입니다
  • 일반적으로 Authroiztion: <type><credentials> 형태로 Request Header에 담겨져 오기 때문에 Header 값을 확인해서 가져올 수 있습니다.

Token 구성요소

  • Header
    • alg : Signature 를 해싱하기 위한 알고리즘 정보를 갖고 있음
    • type : 토큰의 타입을 나타낸다 . 보통 JWT 를 사용
  • Payload
    • 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있음
    • JWT 가 기본적으로 가지고 있는 키워드가 존재
    • 원한다면 추가할 수도 있음
      • iss: 토큰 발급자
      • sub: 토큰 제목
      • aud: 토큰 대상
      • exp: 토큰의 만료시간
      • nbf: Not Before
      • iat: 토큰이 발급된 시간
      • jti: JWT의 고유 식별자
  • Signature
    • 서버에서 토큰이 유효한지 검증하기 위한 문자열
    • Header + Payload + Secret Key 로 값을 생성하므로 데이터 변조 여부를 판단 가능
    • Secret Key 는 노출되지 않도록 서버에서 잘 관리 필요

토큰 인증 타입

Authorization: <type> <credentials> 형태에서 <type> 부분에 들어갈 값입니다.

엄격한 규칙이 있는건 아니고 일반적으로 많이 사용되는 형태라고 생각하면 됩니다.

  • Basic
    • 사용자 아이디와 암호를 Base64 로 인코딩한 값을 토큰으로 사용
  • Bearer
    • JWT 또는 OAuth 에 대한 토큰을 사용
  • Digest
    • 서버에서 난수 데이터 문자열을 클라이언트에 보냄
    • 클라이언트는 사용자 정보와 nonce 를 포함하는 해시값을 사용하여 응답
  • HOBA
    • 전자 서명 기반 인증
  • Mutual
    • 암호를 이용한 클라이언트-서버 상호 인증
  • AWS4-HMAC-SHA256
    • AWS 전자 서명 기반 인증

JWT 장단점

  • 장점
    • 중앙 인증 서버, 저장소에 대한 의존성이 없어서 수평 확장에 유리
    • Base64 URL Safe Encoding 이라 URL, Cookie, Header 어떤 형태로도 사용 가능
    • Stateless 한 서버 구현 가능
    • 웹, 모바일에서 사용 가능
    • 인증 정보를 다른 곳에서 사용 가능 (OAuth)
  • 단점
    • Payload의 정보가 많으면 네트워크의 사용량 증가
    • 다른 사람이 토큰을 decode하여 데이터 확인 가능
    • 토큰을 탈취당한 경우 대처하기 어렵다
      • 기본적으로는 서버에서 관리하는게 아니다보니 탈취당한 경우 강제 로그아웃 처리가 불가능
      • 토큰 유효시간이 만료되기 전까지 탈취자는 자유롭게 인증 가능
      • 그래서 유효시간을 짧게 가져가고 refresh token 을 발급하는 방식으로 많이 사용

참고자료 : https://github.com/ParkJiwoon/PrivateStudy/blob/master/web/jwt.md

 

 

'개발 지식 > 정리' 카테고리의 다른 글

AWS EC2 배포 이슈사항(mysql, jar파일 빌드)  (0) 2023.04.01
Swagger 기본 사용법  (0) 2023.03.20
Redis (레디스)  (0) 2023.03.18
REST API란? (REST, RESTFUL)  (0) 2023.03.12
최대공약수(GCD) 와 최소공배수 (LCM)  (0) 2023.01.02