JWT(Json Web Token)

Kichang Kwon·2022년 4월 23일
0

ETC

목록 보기
1/1

JWT(Json Web Token) 이란?

JWT는 정보를 JSON 포맷으로 안전하게 전송하기 위한 방법(compact and self-contained)을 정의하는 표준(RFC 7519)이다.

이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있으며, 비밀키(HMAC 알고리즘) 또는 Public key/Private key 쌍(RSA or ECDSA)을 사용해서 서명할 수 있다.

언제 사용 하는가?

JWT 사용에 유용한 몇 가지 상황 예시

  • 회원 인증:
    사용자가 로그인을 하면 서버는 토큰을 발급한다. 이후 사용자는 각 요청에는 JWT를 포함하여 전달한다. SSO는 오버헤드가 적고 여러 도메인에서 쉽게 사용할 수 있기 때문에 JWT를 널리 사용하는 기능이다.

    SSO(Single Sign-On):
    여러 개의 사이트에서 한번의 로그인으로 여러가지 다른 사이트들을 자동적으로 접속하여 이용하는 방법)

  • 정보 교류:
    JWT는 정보를 안전하게 전송하기에 좋은 방법이다. 예를 들어 공개/개인 키 쌍을 사용하여 서명할 수 있기 때문에 발신자가 누구인지 확인할 수 있다. 서명을 이용하여 콘텐츠가 변조되지 않았는지 확인할 수도 있다.

JWT의 구조

JWT는 Header, Payload, Signature 세 부분으로 구성되어 있으며 점(.)으로 구분된다. 각 부분은 HTML과 HTTP 환경에서 사용에 무리가 없도록 URLBase64URL 인코딩하여 표현된다.

일반적으로 토큰의 타입과 HMAC SHA256이나 RSA와 같은 서명 알고리즘 2개로 구성되어 있다.

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

Payload

클레임(Claims)으로 구성되어 있으며, 이 클레임은 객체(주로 사용자)나 추가적인 정보를 설명한다. 클레임은 세 가지 유형이 있다.

  • 등록된 클레임(Registered Claims)
    미리 정의되어 있으며, 유용하고 상호 운용 가능한 클레임으로 필수는 아니지만 사용하기를 권장한다.

    keyvalue
    issidentifies the principal that issued the JWT.
    subidentifies the principal that is the subject of the JWT.
    audidentifies the recipients that the JWT is intended for.
    expidentifies the expiration time on or after which the JWT MUST NOT be accepted for processing.
    nbfidentifies the time before which the JWT MUST NOT be accepted for processing.
    iatidentifies the time at which the JWT was issued.
    jtiprovides a unique identifier for the JWT.
  • 공개 클레임(Public Claims)
    사용자 정의 클레임으로 공개용 정보를 위해 사용된다. 충동 방지를 위해 IANA JSON Web Token Registry에서 정의하거나 충돌 방지 네임스페이스를 호함하는 URI 포맷으로 정의해야 한다.

  • 비공개 클레임(Private Claims)
    등록된 클레임이나 공개 클레임이 아니며, 이용 당사자 간 정보 공유를 위해 사용하는 클레임이다.

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

Signature

각각 인코딩된 Header와 Payload, secret key를 Header에서 정의한 알고리즘으로 암호화 하여 생성한다.

HMACSHA256(
	base64UrlEncode(header) + "." + base64UrlEncode(payload),
	secret
)

서명을 메시지가 도중에 변경되지 않았는지 확인하는 데 사용되며 개인 키로 서명된 토큰의 경우 보낸 사람이 누구인지 확인할 수도 있다.

JWT의 동작

사용자가 성공적으로 로그인을 하면 JWT가 발급된다. 이때 토큰은 인정 정보이므로 보안 문제를 방지하기 위해서 세심한 주의를 기울여야 하며, 필요 이상으로 오래 보관되지 않도록 한다. 또한 보안이 취약하기 때문에 민감한 세션 데이터를 브라우저 저장소에 저장해서는 안된다.

사용자는 이후 리소스에 엑세스하려고 할 때마다 일반적으로 Authorization 헤더에 Bearer 스키마를 사용해서 전달한다.

Authorization: Bearer <token>

서버는 Authorization 헤더에 유효한 JWT가 있는지 확인하고 사용자는 보호된 리소스에 엑세스할 수 있다. 또한 토큰이 Authorization 헤더로 전송되면 쿠키를 사용하지 않으므로 CORS(Cross-Origin Resource Sharing) 문제가 생기지 않는다.

장단점

장점

  • 사용자 인증에 필요한 정보가 토큰 자체에 포함되어 있기 때문에 별도의 인증 저장소(세션 스토리지 등)가 필요하지 않다.
  • 보안성 쿠키를 사용하지 않아도 되므로 쿠키로 인한 취약점이 사라진다.
  • 어플리케이션의 규모가 커져도 여러 플랫폼 및 도메인에서 호환이 가능하다.

단점

  • 필드가 추가될 수록 토큰이 커질 수 있으며, 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있다.
  • 한번 발행된 토큰은 서버에서 정보가 바뀌어도 토큰에 직접 적용을 할 수 없다.
  • 기본적으로 Payload 영역은 Base64Url 인코딩만 하기에 중간에서 토큰을 취득해 정보를 확인할 수 있다. 중요 데이터를 넣지 말아야 하며 JWE(Json Web Encryption)를 통해 암호화도 고려해볼 수 있다.
profile
한 줄 소개

0개의 댓글