JWT란?

유동근 - 2024년 06월 28일

infomation

JWT(Json Web Token)란?

클라이언트와 서버 간에 통신할 때 사용자 인증과 권한 부여를 위해 사용된다. 웹 상에서 정보를 Json 형태로 주고 받기 위해 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장돼있다.

JWT의 구성 요소

jwt 구성 요소

헤더(Header)

{
  "alg": "HS256",
  "typ": "JWT"
}

페이로드(Payload)

{
  "sub": "1234567890",
  "name": "DongGeun",
  "admin": true
}

클레임의 유형 3가지

  1. 등록된 클레임

    • 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들
    • 모두 선택적으로 작성 가능
    iss 토큰 발급자
    sub 토큰 제목
    aud 토큰 대상자
    exp 토큰 만료 시간
    nbf 토큰 활성 날짜
    iat 토큰 발급 시간
    jti JWT 토큰 식별자
  2. 공개 클레임
    • 사용자 정의 클레임
    • 공개용 정보를 위해 사용
    • URI 포맷 사용 ⇒ 충돌 방지 위함
  3. 비공개 클레임
    • 사용자 정의 클레임
    • 서버와 클라이언트 사이에 임의로 지정한 정보 저장

서명(signature)

작동 원리

  1. 사용자가 로그인하면 서버는 사용자의 신원을 확인하고 JWT 생성해서 클라이언트에게 전달
  2. 클라이언트는 이후 요청에서 이 JWT를 HTTP 헤더에 포함시켜 서버로 보낸다.
  3. 서버는 전달된 JWT의 서명을 검증해 토큰을 확인하고 페이로드의 클레임을 통해 사용자의 권한을 확인

장점과 단점

장점

  1. 서버측 부하를 낮출 수 있고 독립적이라서 능률적으로 접근 권한 관리 가능하다.
  2. 별도의 인증 저장소가 필요하지 않아서 인증서버와 db에 의존하지 않아도 된다.

단점

  1. 서버로부터 받은 토큰이 쿠키, 로컬스토리지, 세션스토리지에 저장되므로 탈취당할 위험이 있다. ⇒ token에 중요 정보 넣으면 안됨.
  2. 토큰에 넣는 데이터 많아질수록 토큰 길어짐. ⇒ API 호출할 때마다 토큰 데이터 서버에 전달해야하므로 네트워크 대역폭 낭비가 심할 수 있다.