banner
홈페이지 / 블로그 / JSON 웹 토큰(JWT): 안전하게 사용하기 위한 키
블로그

JSON 웹 토큰(JWT): 안전하게 사용하기 위한 키

Jul 19, 2023Jul 19, 2023

몇 주 전 일부 개발 동료는 새로운 도구 통합의 일환으로 수행 중인 JSON 웹 토큰(JWT) 생성에 대한 우려를 우리에게 전달했습니다. 그들은 "상당히 많은" 보안 문제에 대해 들었고 발행된 토큰이 정확하고 몇 가지 기본 보안 요구 사항을 충족하는지 검증하는 데 도움을 주기를 원했습니다.

우리는 현재 보안 테스트 자동화에 도움이 되는 프로젝트인 APICheck를 진행 중이며 최근 '오픈 소스'로 공개했습니다. APICheck는 API에 대한 요청에 대한 다양한 테스트 실행을 연결할 수 있도록 파이프를 통해 상호 연결할 수 있는 일련의 작은 도구로 구성됩니다. 따라서 우리는 발행된 토큰의 유효성을 검사할 수 있는 도구인 jwt를 생성하는 작업을 시작했습니다. -검사기에서는 토큰에 대해 설명할 유효성 검사를 통과할 수 있는 가능성을 구현했습니다. 나중에 이 도구를 사용한 테스트의 예를 보여 드리겠습니다.

JWT(JSON 웹 토큰)는 JSON 개체를 사용하여 여러 당사자 간에 안전하게 주제에 대한 주장을 캡슐화하고 공유하기 위한 컴팩트하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519에 게시됨)입니다. 토큰의 내용은 디지털 서명이 완료되면 신뢰할 수 있고 검증될 수 있습니다(JWS, RFC 7515). 서명은 대칭 키(HMAC) 또는 비대칭 키(RSA 또는 ECDSA)를 사용하여 생성할 수 있습니다. 또한 JWT에는 민감한 데이터를 보호하기 위해 암호화된 데이터(JWE, RFC 7516)가 포함될 수도 있지만 이러한 유형의 토큰은 이 연구의 주제가 아닙니다.

기본적으로 토큰은 암호화되지 않으며 우리가 보는 문자열은 단순히 base64url 인코딩을 사용한 직렬화이므로 쉽게 디코딩하여 토큰의 JSON 콘텐츠를 일반 텍스트로 볼 수 있다는 점에 유의하는 것이 중요합니다.

그러면 초기 질문에 대한 대답은 '상황에 따라 다릅니다...'입니다. 다른 많은 기술과 마찬가지로 JWT는 생성에 사용되는 구성과 소비 시 토큰의 적절한 사용 및 유효성 검사에 크게 의존합니다.

JWT(JSON 웹 토큰)는 JSON 개체를 사용하여 여러 당사자 간에 엔터티에 대한 어설션을 안전하게 캡슐화하고 공유하기 위한 컴팩트하고 독립적인 방법을 정의하는 개방형 표준입니다.

먼저 토큰의 주요 유형과 주요 사용 사례가 무엇인지 살펴보겠습니다.

JWT는 크기가 작기 때문에 다른 표준(SAML)보다 더 효율적으로 당사자 간 보안 데이터 교환을 지원하므로 다음 사용 사례에 이상적입니다.

각 사용 사례에는 서로 다른 수신자(클라이언트 애플리케이션 및 API 서비스)가 있지만 두 가지 모두에 대해 동시 제어가 실행되는 경우 두 경우 모두에 단일 토큰을 사용할 수 있습니다.

아래에는 생성 및 검증에만 초점을 맞춰 JWT 작업 시 모범 사례를 나열합니다.

매우 소수의 예외(클라이언트 측에서 세션 정보를 전달하기 위해 사용하고 사용자 인터페이스를 재구축하기 위해 데이터를 사용하는 경우)를 제외하고 토큰은 서명 없이 발행되어서는 안 됩니다. 서명은 토큰 소비자가 이를 신뢰하고 변조되지 않았음을 보장할 수 있는 기본 보호입니다.

서명 알고리즘을 선택할 때 대칭 키 알고리즘은 사용된 키가 충분히 강력하지 않은 경우 무차별 대입 공격에 취약하다는 점을 명심하십시오(애완동물 이름과 생년월일도 이에 유효하지 않습니다.) 따라서 충분한 복잡성이 제공되어야 합니다. 대칭 키 알고리즘을 선택한 경우. 반면 비대칭 키 알고리즘은 토큰을 생성하는 서버 부분에서만 필요하므로 키 보관이 단순화됩니다.

한 번 서명된 토큰은 만료 날짜(클레임 경험)가 없는 경우 영원히 유효합니다. "액세스 토큰"의 경우, 누군가 토큰을 캡처하면 허용된 작업에 영원히 액세스할 수 있습니다. 토큰에 식별자(클레임 jti)를 할당하면 토큰을 취소할 수 있습니다. 토큰이 손상된 경우 이를 취소할 수 있는 옵션을 갖는 것이 매우 바람직합니다.