웹 개발에서 사용되는 JWT(JSON Web Token)는 정보를 안전하게 전달하고 인증을 처리하는 강력한 방식입니다. 이 글에서는 JWT의 핵심인 RFC7519에 대해 쉽게 이해할 수 있는 내용으로 알아보겠습니다.
RFC7519는 JWT의 표준 스펙을 정의한 문서입니다. 이 문서는 JWT의 구조, 특성, 사용 방법 등을 상세하게 설명하고 있습니다. 이해하기 쉬운 방식으로 살펴보겠습니다.
JWT(JSON 웹 토큰)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준( RFC 7519 )입니다. 이 정보는 디지털 서명이 되어 있으므로 확인하고 신뢰할 수 있습니다. JWT는 비밀( HMAC 알고리즘 사용) 또는 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다 .
JWT를 암호화하여 당사자 간 보안을 제공할 수도 있지만 우리는 서명된 토큰에 중점을 둘 것입니다. 서명된 토큰은 그 안에 포함된 청구의 무결성을 확인할 수 있는 반면, 암호화된 토큰은 이러한 청구를 다른 당사자로부터 숨깁니다 . 공개/개인 키 쌍을 사용하여 토큰에 서명하는 경우 서명은 개인 키를 보유하고 있는 당사자만이 서명한 사람임을 인증합니다.
JSON 웹 토큰이 유용한 몇 가지 시나리오는 다음과 같습니다.
승인 : JWT를 사용하는 가장 일반적인 시나리오입니다. 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로, 서비스 및 리소스에 액세스할 수 있습니다. Single Sign On은 오버헤드가 적고 다양한 도메인에서 쉽게 사용할 수 있다는 점 때문에 현재 JWT를 널리 사용하는 기능입니다.
정보 교환 : JSON 웹 토큰은 당사자 간에 정보를 안전하게 전송하는 좋은 방법입니다. 예를 들어 공개/개인 키 쌍을 사용하여 JWT에 서명할 수 있으므로 보낸 사람이 누구인지 확인할 수 있습니다. 또한 헤더와 페이로드를 사용해 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.
자체 수용적(JSON 기반):
JWT는 JSON 포맷을 사용하므로 데이터의 표현이 간결하고 가독성이 좋습니다. 토큰에 필요한 모든 정보를 자체적으로 포함하고 있어 서버 상태나 데이터베이스 조회와 같은 추가적인 처리 없이도 필요한 정보를 전달할 수 있습니다.
분산 시스템 지원:
기존 방식에서는 세션을 서버에 저장해야 했기 때문에 여러 서버 간의 인증 정보 공유가 어려웠습니다. 하지만 JWT는 클라이언트 쪽에서 토큰을 관리하므로 여러 서비스 간에도 인증 정보를 공유하기 용이합니다.
확장 가능한 클레임:
JWT는 클레임(claim)이라는 이름-값 쌍을 페이로드에 담아 추가 정보를 포함할 수 있습니다. 이로써 사용자 정의 데이터를 포함하여 확장성 있는 인증 체계를 구축할 수 있습니다. 기존의 세션 기반 방식보다 유연한 확장이 가능합니다.
디지털 서명을 통한 보안성:
JWT는 헤더와 페이로드, 그리고 시그니처로 구성되어 있습니다. 시그니처는 헤더와 페이로드의 내용을 기반으로 생성되며, 비밀 키를 사용하여 생성됩니다. 이를 통해 토큰이 변조되지 않았는지, 위조되지 않았는지를 검증할 수 있습니다.
성능 및 확장성:
JWT는 서버에 저장할 필요가 없기 때문에 세션 저장소에 대한 부담이 줄어듭니다. 이로써 서버의 성능이 향상되고, 수평 확장성도 더 용이해집니다.
권한 부여 및 자격 증명 분리:
JWT를 사용하면 권한 부여 정보를 토큰에 포함시켜 요청마다 권한 검사를 용이하게 할 수 있습니다. 또한, 사용자의 자격 증명을 매 요청마다 서버에 보내지 않고 토큰으로 처리함으로써 보안성을 높일 수 있습니다.
개방성과 표준화:
JWT는 개방적인 표준이며, 다양한 라이브러리와 플랫폼에서 지원됩니다. 이로 인해 다양한 환경에서 일관된 방식으로 인증과 데이터 교환을 할 수 있습니다.
헤더(Header): JWT의 헤더는 두 가지 정보를 포함합니다. 첫 번째로, 이 토큰이 JWT임을 나타내는 "typ" 필드가 있습니다. 두 번째로, 어떤 알고리즘을 사용하여 토큰을 서명하는지를 나타내는 "alg" 필드가 있습니다.
페이로드(Payload): 페이로드는 실제로 전달하려는 정보를 담고 있습니다. 이는 클레임(claim)으로 불리는 이름-값 쌍의 집합으로 구성되어 있습니다. 예를 들어, "sub" (Subject) 클레임은 토큰의 주체를 나타내며, "exp" (Expiration Time) 클레임은 토큰의 만료 시간을 나타냅니다.
시그니처(Signature): 시그니처는 헤더와 페이로드를 합친 후, 비밀 키를 사용하여 생성됩니다. 이를 통해 토큰이 변조되지 않았음을 검증할 수 있습니다.
JWT는 웹 개발에서 정보 전달과 인증을 처리하는 데 매우 유용한 도구입니다. RFC7519는 이러한 JWT의 표준을 정의하고 있으며, 헤더, 페이로드, 시그니처의 구조와 동작 방식을 자세하게 설명하고 있습니다. 이를 기반으로 웹 애플리케이션에서 보안성을 유지하면서 효율적인 데이터 교환을 실현할 수 있습니다.