Json Web Token (JWT)

정미·2022년 7월 10일
0

Computer Science

목록 보기
22/81

Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token

  • Claim: 토큰에서 사용할 정보의 조각
  • https://jwt.io/ 에서 JWT 토큰을 인코딩/디코딩 할 수 있다.
  • 토큰 자체를 정보로 사용하는 Self-Contained 방식
  • 회원 인증, 정보 전달에 사용됨

로그인시 토큰 처리 과정

  • HTTP 요청
    • HTTP 통신을 할 때 HTTP 헤더에 JWT를 담아서 요청한다.
    • Authorization이라는 key의 value로 JWT를 사용한다. 토큰 값 앞에는 일반적으로 Bearer가 prefix로 붙는다.
      {
      	"Authorization": "Bearer {token}"
      }
  • static 변수에 저장
    • 요청을 보낼 때마다 로컬 스토리지에서 계속 JWT를 불러오면 오버헤드가 발생한다.
  • 로그아웃
    • 로컬 스트로지에 저장된 JWT 제거한다.
    • blacklist라는 db table에 토큰을 추가하여 해당 토큰의 접근을 막는다.

구성

. 구분자를 사용하여 3부분으로 나누어주며, 각 부분은 json을 Base64URL로 인코딩하여 표현된다.

1. Header

: Algorithm & Token Type

  1. alg: Signature를 hashing하기 위한 알고리즘 방식
    • HS256, SHA256, RSA
  2. typ: token type
    • JWT

2. Payload

: Data

  1. Registered Claim (등록된 클레임)

    • 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
    • key는 모두 길이 3의 String
    • 선택적으로 작성 가능 (사용 권장)
    • 종류
      • iss: 토큰 발급자 (issuer)
      • sub: 토큰 제목 (subject), unique 값 사용 (주로 사용자 이메일)
      • aud: 토큰 대상자 (audience)
      • exp: 토큰 만료 시간 (expiration), NumericDate 형식 (ex> 1480849147370)
      • nbf: 토큰 활성 날짜 (not before)
      • iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간
      • jti: JWT 토큰 식별자 (jwt id), 중복 방지, 일회용 토큰(access token) 등에 사용
  2. Public Claim (공개 클레임)

    • 사용자 정의 클레임
    • 공개용 정보
    • 충돌 방지를 위해 URI 포맷 사용
    • 예시
      {
      	"https://velog.io/@jummi10": true
      }
  1. Private Claim (비공개 클레임)
    • 사용자 정의 클레임
    • 서버와 클라이언트 사이에 임의로 지정한 정보
    • 예시
      {
      	"name": "John Doe"
      }

3. Signature

  • 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드
  • 서명 만드는 방법
    1. 헤더와 페이로드의 값을 각각 Base64URL로 인코딩
    2. 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱
    3. 다시 Base64URL로 인코딩

장점

  1. 인증에 필요한 모든 정보를 토큰 자체가 포함하기 때문에 별도의 인증 저장소가 필요 없다.
  2. 쿠키를 전달하지 않아도 되므로 쿠키를 사용해서 발생하는 취약점이 사라진다.
  3. REST 서비스로 제공 가능하다.
  4. URL 파라미터와 헤더로 사용된다.

단점

  1. Self-Contained
    • 토큰 자체가 정보를 담고 있어서 양날의 검이 될 수 있다.
  2. 토큰 길이
    • 정보가 많아질수록 토큰의 길이가 늘어나고 네트워크에 부하를 줄 수 있다.
  3. Payload Encoding
    • 페이로드는 Base64URL로 인코딩만 되고 암호화되지 않았기 때문에 탈취되면 제 3자가 데이터를 디코딩하여 볼 수 있다.
    • JWE(Json Web Encryption)로 암호화하거나 중요 데이터를 넣지 말아야 한다.
  4. Stateless
    • 상태를 저장하지 않기 때문에 한 번 만들어지만 제어가 불가능하다.
    • 임의 삭제가 불가능하기 때문에 토큰 만료 시간을 반드시 넣어주어야 한다.

출처

0개의 댓글