[FE] JWT(Json Web Token)이란?

.DS_Store·2023년 3월 15일
0

FrontEnd

목록 보기
3/26
post-thumbnail

Intro

웹개발을 개발하면서 로그인 처리하면 꼭 한 번은 들어봤을 JWT. 이전 프로젝트도 팀원이 JWT 방식으로 로그인을 구현했다는데 명확히 개념을 짚고 넘어가지 못해, 이참에 정리해본다.


(오늘도 정리할 것을 정말 아주 대단히 간략히 요약하면 위와 같다.)

JWT란?

JWT는 Json Web Token의 약자로, 웹 어플리케이션에서 사용자 인증 정보를 안전하게 전송하기 위한 토큰 기반의 인증 방식 중 하나이다.

서버의 클라이언트 식별
서버가 클라이언트를 알아보는 방식은 JWT만 있는 것이 아니라 여러가지(쿠키, IP주소 등)가 있다.
크게 서버 기반 인증과 토큰 기반 인증으로 나뉜다.

✅ 서버가 클라이언트를 식별하고자 하는 예를 들자면,
로그인을 하는 것은 요청1,
내가 구매한 목록을 받아오는 게 요청2 라고 할 수 있고,
이 요청들은 별개이기 때문에 인증 정보를 보내지 않으면 서버는 두 요청의 주체가 같은지 아닌지 식별하지 못한다

✅ session storage vs session login
클라이언트 식별에 대해 찾아보다 보면 세션 로그인에 관한 이야기를 많이 발견할 수 있다. 웹 스토리지를 공부하면서 나오는 session storage와 무슨 사이인지 궁금했는데 (세션 스토리지는 분명 브라우저에 저장하는 건데 세션 로그인은 서버에 저장한다고 하니까...)
두 개는 별개의 개념으로 이해하면 된다!

토큰 인증 방식


※ 기존에 토큰을 보유하지 않은 경우
(1) 클라이언트가 로그인 요청을 서버에 보낸다
(2) 서버는 인증 정보를 검증하고, 정확하다면 사용자 정보를 기반으로 (유일한) 토큰을 생성
-- 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장해 둔다.
(3) 저장해둔 토큰을 HTTP 요청 헤더에 포함시켜 전달한다
(4) 서버는 전달받은 토큰을 검증하고, 응답한다.

※ 기존에 토큰을 보유한 경우, 위의 1번부터 토큰을 포함하고, 2번에서 토큰을 검증한다.

JWT 구조

JWT는 JSON 형식으로 인코딩된 토큰을 사용한다.
JWT는 .을 구분자로 나누어 Header(헤더), Payload(내용), Signature(서명) 총 세 가지 영역으로 구성되어있다.

(이미지 출처: https://jwt.io/)

토큰의 유형과 해싱 알고리즘 정보를 담고 있ek.

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

위에서
alg 필드는 토큰의 서명 알고리즘을 지정하며, 서명 및 토큰 검증에 사용한다.
typ 필드는 토큰의 유형을 지정한다.

Payload

토큰에 담을 정보를 포함한다.

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

위에서,
sub필드는 토큰이 제공하는 주제를 식별하는 고유 식별자이다.
name필드는 주제의 이름, iat필드는 토큰이 발급된 시간을 지정한다.
(이는 Registered Claim에 해당한다.)

  • 클레임의 종류는 크게 세가지로 나뉜다.
    • Registered Claim(등록된 클레임)
      :토큰 정보를 표현하기 위해 이름이 이미 정해져 있다.
    • Public Claim(공개 클레임)
      :사용자 정의 클레임, 충돌 방지를 위해 URI 포맷을 이용한다.
    • Private Claim(비공개 클레임)
      :사용자 정의 클레임, 클라이언트와 서버가 지정한 정보를 저장한다.

Signature

토큰을 발급한 서버나 발급자가 서명한 값
헤더와 페이로드를 조합하여 생성됨

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
your-256-bit-secret
)

secret이라는 서버나 발급자가 가지고 있는 비밀키이다.
서명은 토큰의 무결성을 보장하기 위해 사용된다.

JWT의 장단점

장점

  • Stateless
    JWT는 상태를 저장하지 않기 때문에, 서버에 부하를 줄이고 확장성이 높은 시스템을 구성할 수 있다.

  • 안전성
    JWT는 서명(signature)을 통해 인증되므로, 변조가 불가능하며, 기밀성도 보장된다.

  • 다양한 플랫폼 지원
    JWT는 JSON 형식이기 때문에, 다양한 프로그래밍 언어와 플랫폼에서 사용이 가능하다.

  • 사용 용도의 다양성
    JWT는 권한, 인증, 정보 교환 등 다양한 용도로 사용이 가능하다.

단점

  • 크기
    JWT는 정보를 저장하기 위해 필요한 정보를 모두 포함하기 때문에, 토큰의 크기가 커질 수 있다.

  • 보안성
    JWT는 서명(signature)을 통해 인증되기 때문에, 키 관리가 중요합니다. 만약 비밀 키가 유출될 경우, 보안성이 저하될 수 있다.

  • 만료 시간 관리
    JWT는 만료 시간을 포함하고 있기 때문에, 만료 시간 관리가 필요하다. 만료 시간을 적절히 설정하지 않으면, 보안성이 저하될 수 있다.

  • 토큰 갱신
    JWT는 한번 발급된 토큰은 만료 시간이 지나면 갱신이 불가능하다. 따라서, 토큰 갱신 관리가 필요하다.

0개의 댓글