JWT(JSON Web Token)란?

JSON 형식의 정보(클레임)를 서명을 붙여 주고받기 위한 형식. '헤더.페이로드.서명'의 세 부분을 각각 Base64URL로 인코딩하여 '.'으로 연결한다. 서명으로 변조 여부와 발행자를 확인할 수 있지만, 일반적인 서명된 JWT에서는 페이로드가 암호화되어 있지 않으므로 비밀 정보는 넣지 않는다. API 인증에 사용하는 액세스 토큰이나 OpenID Connect의 ID 토큰 등에 사용되며, 유효 기간(exp)을 짧게 하여 사용하는 경우가 많다.

일본어 명칭: JWT(JSON Web Token)

JWT(JSON Web Token)은(는) 웹 기술 기초 등 1개 분야의 연습 문제 2개에 나와요.

분야: 웹 기술 기초

세 부분

헤더에는 서명 방식(예를 들어 HS256)과 종류가 들어가며, {"alg":"HS256","typ":"JWT"}를 Base64URL로 인코딩하면 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9가 됩니다. 페이로드에는 이용자의 식별자(sub), 발행자(iss), 유효 기간(exp) 등의 클레임이 들어갑니다. 서명은 인코딩한 헤더와 페이로드를 '.'으로 연결한 것에 대해, 공유 비밀 키에 의한 HMAC이나 공개 키 암호의 개인 키로 만듭니다.

서버에서 확인하는 방법

JWT를 받은 서버는 서명이 올바른지 키로 확인하고, 유효 기간이나 대상(aud) 등의 클레임이 조건에 맞는지 조사합니다. 헤더의 alg 값을 그대로 신용하지 말고, 서버 쪽에서 정한 방식만 받아들이는 것이 중요합니다. 서명을 확인하면 서버는 세션 정보를 저장하고 있지 않아도 누구에게 발행한 것인지 판단할 수 있습니다.

사용할 때의 주의점

JWT는 발행한 후에 취소하기 어려우므로, 유효 기간을 짧게 하고 오래 사용할 때는 갱신용 별도 값을 사용하여 다시 발행하는 사용법이 일반적입니다. 페이로드는 누구나 읽을 수 있으므로 비밀 정보는 넣지 않습니다. 브라우저 안의 저장 위치에 따라서는 XSS로 도둑맞을 우려가 있습니다.

도전해 보기: JWT(JSON Web Token) 관련 문제

서명을 붙인 일반적인 JWT(JSON Web Token)에 대한 설명으로 올바른 것은?

  1. A페이로드는 서명 키로 암호화되어 있으므로, 비밀번호나 신용카드 번호를 넣어 보내도 도중에 읽힐 일은 없다
  2. B유효 기간이 지난 토큰이라도 서명이 올바르면 변조되지 않은 것이므로, 서버는 받아들여야 한다
  3. C헤더, 페이로드, 서명을 Base64URL로 인코딩하여 '.'으로 연결한 것으로, 서명으로 변조를 검출할 수 있지만 내용은 암호화되어 있지 않다
정답과 해설 보기

정답: C. 헤더, 페이로드, 서명을 Base64URL로 인코딩하여 '.'으로 연결한 것으로, 서명으로 변조를 검출할 수 있지만 내용은 암호화되어 있지 않다

JWT는 '헤더.페이로드.서명'의 세 부분으로 이루어지며, 헤더에는 서명 방식(예를 들어 HS256), 페이로드에는 이용자의 식별자나 유효 기간(exp) 등의 정보(클레임)가 들어갑니다. 서명은 헤더와 페이로드로부터 비밀 키를 사용하여 만들므로, 받은 서버는 내용이 변조되지 않았다는 것과 발행자를 확인할 수 있습니다. 다만 Base64URL은 암호가 아니며 누구나 원래대로 되돌려 읽을 수 있으므로, 비밀 정보는 넣지 않습니다. API로 보낼 때는 일반적으로 Authorization: Bearer 뒤에 토큰을 붙여 보냅니다.

자주 묻는 질문

JWT와 세션 ID 중 어느 쪽을 사용해야 하나요?

세션 ID는 서버에 저장한 정보를 찾는 단서에 지나지 않으므로, 로그아웃이나 무효화를 서버 쪽에서 즉시 반영할 수 있습니다. JWT는 서버에 정보를 저장하지 않아도 내용을 확인할 수 있어 여러 서비스 사이에서 주고받는 데 적합하지만, 취소하기 어렵다는 약점이 있습니다. 하나의 웹사이트 로그인에서는 세션 ID 쪽이 다루기 쉬운 경우도 많습니다.

Base64URL과 Base64는 무엇이 다른가요?

Base64URL은 URL 안에서 특별한 의미를 가진 '+'와 '/'를 '-'와 '_'로 바꾸고, 끝의 '='를 생략하는 경우가 많은 Base64의 변형입니다. JWT는 URL이나 HTTP 헤더에 그대로 넣을 수 있도록 이 형식을 사용합니다. 둘 다 암호가 아니며, 누구나 원래대로 되돌릴 수 있습니다.

해설 속 JWT(JSON Web Token)

JWT(JSON Web Token)이(가) 나오는 문제 (2)

  1. 서명을 붙인 일반적인 JWT(JSON Web Token)에 대한 설명으로 올바른 것은?
  2. OAuth 2.0과 OpenID Connect의 관계에 대한 설명으로 올바른 것은?

관련 용어

OAuth 동일 출처 정책(Same-origin Policy) 리버스 프록시(Reverse Proxy) 서버 사이드 렌더링(SSR) 웹소켓(WebSocket) 이벤트 루프(Event Loop) 쿠키(Cookie) CORS(교차 출처 리소스 공유) DOM(문서 객체 모델) HTTP 메서드(HTTP Method)

용어집으로 돌아가기