JWT 에 대해 알아보자

Seunghee Lee·2024년 2월 9일

캡스톤

목록 보기
3/10
post-thumbnail

✓ JWT 란 ?

JWT 는 JSON 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Web Token 이다.
JSON Web Token 의 약어로, 사용자의 정보를 JSON 객체로 안전하게 전송하기 위한 독립적인 방법을 정의한 개방형 표준이다. JWT 는 디지털 서명이 되어 신뢰할 수 있다. 이때 HMAC 또는 RSA, ECDSA 를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있다.


✓ JWT 는 언제 사용해야 할까 ?

1. 인증이 필요할 때

사용자가 로그인을 하면 이때 JWT 가 포함되어 해당 토큰으로 허용되는 경로나 서비스 및 리소스에 액세스할 수 있는 정보가 포함된다. SSO(Single Sign On) 은 작은 오버헤드와 다른 도메인에서 쉽게 사용할 수 있기 때문에 JWT 를 사용하는 것이 좋다.


2. 정보를 교환할 때

공개/개인 키 쌍을 사용하여 JWT 에 서명할 수 있기 때문에 당사자 간에 정보를 안전하게 전송할 수 있다. 또한, 서명은 헤더와 페이로드를 사용하여 저장되기 때문에 변조되지 않았는지 확인할 수도 있다.


✓ JWT 구조는 어떻게 될까 ?

JWT 는 Header / Payload / Signature 3개의 부분으로 구성되어 있다. 이때 3개의 부분은 점(. ) 으로 구분된다.
ex) xxxxx.yyyyy.zzzzzHeader.Payload.Signature

Header 는 Signature 를 해싱하기 위한 정보를 담고 있다.

  • JWT 의 첫 번째 부분
  • HS256(HMAC SHA256) 또는 RSA 서명 알고리즘을 사용한다.
    {
    	"alg": "HS256",  //서명 알고리즘
    	"typ": "JWT"     //토큰의 타입
    }

※ 보통 JWT 의 크기를 줄이기 위해 자주 사용되는 필드들은 세 글자로 표현한다.

Payload 는 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보를 담고 있다.
→ 헤더와 페이로드를 base64Url 로 인코딩하여 저장한다.

Signature 는 토큰의 유효성을 검증하기 위한 문자열이다.

  • 서버는 이 문자열을 통해 토큰이 유효한지 판별한다.
  • 예를 들어, HS256 알고리즘을 사용한다면 서명은 다음과 같은 방식으로 생성된다.
    HMACSHA256(
    	base64UrlEncode(header) + "." +
    	base64UrlEncode(payload),
    	secret
    )

만약, JWT 를 생성 또는 확인하고 싶다면 jwt.io 를 사용하면 된다.


✓ JWT 의 동작 과정은 어떻게 될까 ?

사용자가 성공적으로 로그인을 하면 JWT 이 반환된다. 이때 보안상 토큰을 오랫동안 보관하면 안된다. 또한 브라우저 저장소에 세션 데이터를 저장해서도 안된다.


따라서 사용자가 보호된 경로나 리소스에 액세스하고자 할 때마다, 일반적으로 Bearer 스키마를 헤더에 담아 보내야 한다. 이때 헤더의 내용은 다음과 같아야 한다.

Authorization: Bearer <token>

서버는 헤더에서 유효한 토큰이 담겼는지 확인하고 접근을 허용한다. 토큰에 필요한 데이터가 포함되어 있다면, 특정 작업에 대한 DB 쿼리가 줄어들 수 있다. (그렇다고 항상 그런 것은 아니다.)


아래는 JWT 를 이용한 API 또는 리소스 접근 과정에 대한 다이어그램이다.

  1. 클라이언트가 서버에게 권한을 요청한다. 이때 권한 부여 요청은 엔드포인트를 통해 진행된다.
  2. 요청한 권한이 부여되면, 서버는 액세스 토큰을 클라이언트에게 반환한다.
  3. 클라이언트는 액세스 토큰을 사용하여 API 에 접근한다.

✓ 왜 JWT 를 사용해야 할까 ?

  • JSON 은 XML 보다 덜 장황하기도 하고 무엇보다 인코딩될 때 크기도 작아서 JWT 를 HTML 과 HTTP 환경에서 유연하게 사용할 수 있다.

  • 사용 측면에서, JWT 는 인터넷 규모로 사용된다. 즉, 여러 플랫폼, 특히 모바일에서 JWT 의 클라이언트 측 처리가 용이하다.

  • 보안 측면에서, SWT(Simple Web Token) 는 HAMC 알고리즘을 사용하여 공유 비밀로만 대칭적으로 서명할 수 있다. 하지만 JWT 는 SAML(Security Assertion Markup Language) 토큰은 X.509 인증서 형식의 공개/개인 키 쌍을 사용하여 서명할 수 있어 간소하다.

보다시피 인코딩된 JWT 와 인코딩된 SMAL 의 길이를 비교할 때 확연히 JWT 가 간소함을 알 수 있다.

profile
자라나라 개발개발 ~..₩

0개의 댓글