JWT(JSON Web Token)

·2024년 7월 21일

Web

목록 보기
1/6
post-thumbnail

JWT(JSON Web Token)는 당사자 간 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이 표준은 정보를 JSON 객체 형태로 인코딩하여 전달한다.

  1. 무결성 보장 : 디지털 서명을 통해 정보의 변조 여부를 검증할 수 있다.
  2. 신뢰성 : 정보의 출처를 신뢰할 수 있다.
  3. 다양한 암호화 알고리즘 지원 : 비밀(HMAC 알고리즘 사용) 또는 공개/개인 키 쌍(RSA 또는 ECDSA 사용)을 이용해 서명될 수 있다.

그럼 이런 특징을 가진 JWT가 보통 어디에서 쓰일까?

JSON Web Token 사용

인가(Authorization)

JWT는 주로 인가 목적으로 사용된다. 그렇다면 인가란 뭘까?

인가(Authorization) : 인증된 사용자가 특정 자원에 접근할 수 있는 권한을 가지고 있는지 확인하는 과정

인증과 인가를 헷갈리기 쉬운데, 인증(Authentication)은 사용자가 자신이 주장하는 사람이 맞는지 확인하는 과정이다.

사용자가 로그인하면 서버는 JWT를 생성하여 반환한다. 이후 사용자는 각 요청에 JWT를 포함시켜 보내며, 서버는 JWT를 검증하여 사용자의 접근을 허용한다.

정보 교환(Information Exchange)

JWT는 정보 교환에도 사용된다. 당사자 간에 정보를 안전하게 전송할 수 있는 좋은 방법이다. JWT는 서명될 수 있기 때문에 발신자가 자신이 주장하는 사람임을 확신할 수 있다.

JSON Web Token의 구조

세 부분으로 구성되며 점(.)으로 구분된다.

xxxxx.yyyyy.zzzzz

  • 헤더(Header) 일반적으로 두 부분으로 구성된다. 토큰 유형(JWT)과 서명 알고리즘(HMAC SHA256 또는 RSA)이다.
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    JSON은 Base64Url로 인코딩되어 JWT의 첫 번째 부분이 된다.
  • 페이로드(Payload) 토큰의 두 번째 부분은 클레임을 포함하는 페이로드이다. 클레임은 엔티티(일반적으로 사용자)에 대한 정보와 추가 데이터를 포함하며, 세 가지 유형이 있다.
    • Registered claims(등록된 클레임): 이는 미리 정의된 클레임 집합으로, 필수는 아니지만 여러 시스템에서 공통으로 이해하고 사용되는 정보를 담고 있어 사용이 권장된다. 예를 들어 iss(발행자), exp(만료 시간), sub(주제), aud(대상) 등이 있다.
      클레임 이름이 단 세 글자인 이유는 JWT가 간결성을 목표로 하기 때문이다.

    • Public claims(공개 클레임): JWT를 사용하는 사람들이 자유롭게 정의할 수 있다. 하지만 충돌을 피하기 위해 IANA JSON Web Token Registry에 정의되어 있거나, URI을 사용해 정의해야 한다.

    • Private claims(비공개 클레임): 이는 당사자들 간에 정보를 공유하기 위해 만든 사용자 지정 클레임으로, '등록된 클레임'이나 '공개 클레임'에 해당하지 않는다.

      {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
      }

      페이로드는 Base64Url로 인코딩되어 JWT의 두 번째 부분이 된다.

      💡 서명된 토큰의 경우, 정보가 변조로부터 보호되지만 누구나 읽을 수 있다. 따라서 암호화되지 않은 JWT의 페이로드나 헤더에는 민감한 정보를 넣으면 안된다.
  • 서명(Signature) 서명 부분을 만들려면 인코딩된 헤더, 인코딩된 페이로드, 비밀, 헤더에 지정된 알고리즘을 결합해 서명해야 한다. 예를 들어 HMAC SHA256 알고리즘을 사용하려면 서명은 다음과 같이 생성된다.
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret
    )
    서명은 메시지가 도중에 변경되지 않았음을 검증하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT 발신자가 실제로 그 사람이 맞음을 인증할 수 있다.

JSON Web Token의 작동 방식

사용자가 성공적으로 로그인하면 JWT이 반환된다. 토큰은 자격 증명이므로 보안 문제를 방지하기 위해 주의가 필요하다. 일반적으로 토큰은 필요한 기간 이상 유지하지 않는 것이 좋다.

사용자가 보호된 루트나 리소스에 접근하려면 사용자 에이전트는 JWT를 Authorization 헤더에 Bearer 스키마를 사용해 보내야한다.

Authorization: Bearer <token>

JWT 토큰을 HTTP 헤더를 통해 전송할 경우, 크기가 너무 커지지 않도록 주의해야 한다.

  1. 애플리케이션(또는 클라이언트)가 권한 서버에 요청
  2. 권한이 부여되면 애플리케이션에 Access Token을 반환한다.
  3. 애플리케이션은 Access Token을 사용해 보호된 리소스에 접근한다.

참고

Get Started with JSON Web Tokens

JWT.IO - JSON Web Tokens Introduction

Authentication - OWASP Cheat Sheet Series

Authorization - OWASP Cheat Sheet Series

profile
개발블로그👩🏻‍💻

0개의 댓글