[BEInternship] JWT 이해하기(2) - RFC7519

junghan·2023년 8월 25일
0

BE 인턴십

목록 보기
9/9
post-thumbnail

웹 개발에서 사용되는 JWT(JSON Web Token)는 정보를 안전하게 전달하고 인증을 처리하는 강력한 방식입니다. 이 글에서는 JWT의 핵심인 RFC7519에 대해 쉽게 이해할 수 있는 내용으로 알아보겠습니다.

RFC7519란 무엇인가요?

RFC7519는 JWT의 표준 스펙을 정의한 문서입니다. 이 문서는 JWT의 구조, 특성, 사용 방법 등을 상세하게 설명하고 있습니다. 이해하기 쉬운 방식으로 살펴보겠습니다.

JWT란 무엇인가요?

JWT(JSON 웹 토큰)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준( RFC 7519 )입니다. 이 정보는 디지털 서명이 되어 있으므로 확인하고 신뢰할 수 있습니다. JWT는 비밀( HMAC 알고리즘 사용) 또는 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다 .

JWT를 암호화하여 당사자 간 보안을 제공할 수도 있지만 우리는 서명된 토큰에 중점을 둘 것입니다. 서명된 토큰은 그 안에 포함된 청구의 무결성을 확인할 수 있는 반면, 암호화된 토큰은 이러한 청구를 다른 당사자로부터 숨깁니다 . 공개/개인 키 쌍을 사용하여 토큰에 서명하는 경우 서명은 개인 키를 보유하고 있는 당사자만이 서명한 사람임을 인증합니다.

  • 개인키 암호화: 서명 (무결성)
  • 공개키 암호화: 암호화 (기밀성)

JSON 웹 토큰은 언제 사용해야 합니까?

JSON 웹 토큰이 유용한 몇 가지 시나리오는 다음과 같습니다.

  • 승인 : JWT를 사용하는 가장 일반적인 시나리오입니다. 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로, 서비스 및 리소스에 액세스할 수 있습니다. Single Sign On은 오버헤드가 적고 다양한 도메인에서 쉽게 사용할 수 있다는 점 때문에 현재 JWT를 널리 사용하는 기능입니다.

  • 정보 교환 : JSON 웹 토큰은 당사자 간에 정보를 안전하게 전송하는 좋은 방법입니다. 예를 들어 공개/개인 키 쌍을 사용하여 JWT에 서명할 수 있으므로 보낸 사람이 누구인지 확인할 수 있습니다. 또한 헤더와 페이로드를 사용해 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.

JWT의 장점

  1. 자체 수용적(JSON 기반):
    JWT는 JSON 포맷을 사용하므로 데이터의 표현이 간결하고 가독성이 좋습니다. 토큰에 필요한 모든 정보를 자체적으로 포함하고 있어 서버 상태나 데이터베이스 조회와 같은 추가적인 처리 없이도 필요한 정보를 전달할 수 있습니다.

  2. 분산 시스템 지원:
    기존 방식에서는 세션을 서버에 저장해야 했기 때문에 여러 서버 간의 인증 정보 공유가 어려웠습니다. 하지만 JWT는 클라이언트 쪽에서 토큰을 관리하므로 여러 서비스 간에도 인증 정보를 공유하기 용이합니다.

  3. 확장 가능한 클레임:
    JWT는 클레임(claim)이라는 이름-값 쌍을 페이로드에 담아 추가 정보를 포함할 수 있습니다. 이로써 사용자 정의 데이터를 포함하여 확장성 있는 인증 체계를 구축할 수 있습니다. 기존의 세션 기반 방식보다 유연한 확장이 가능합니다.

  4. 디지털 서명을 통한 보안성:
    JWT는 헤더와 페이로드, 그리고 시그니처로 구성되어 있습니다. 시그니처는 헤더와 페이로드의 내용을 기반으로 생성되며, 비밀 키를 사용하여 생성됩니다. 이를 통해 토큰이 변조되지 않았는지, 위조되지 않았는지를 검증할 수 있습니다.

  5. 성능 및 확장성:
    JWT는 서버에 저장할 필요가 없기 때문에 세션 저장소에 대한 부담이 줄어듭니다. 이로써 서버의 성능이 향상되고, 수평 확장성도 더 용이해집니다.

  6. 권한 부여 및 자격 증명 분리:
    JWT를 사용하면 권한 부여 정보를 토큰에 포함시켜 요청마다 권한 검사를 용이하게 할 수 있습니다. 또한, 사용자의 자격 증명을 매 요청마다 서버에 보내지 않고 토큰으로 처리함으로써 보안성을 높일 수 있습니다.

  7. 개방성과 표준화:
    JWT는 개방적인 표준이며, 다양한 라이브러리와 플랫폼에서 지원됩니다. 이로 인해 다양한 환경에서 일관된 방식으로 인증과 데이터 교환을 할 수 있습니다.

JWT의 구성 요소:

헤더(Header): JWT의 헤더는 두 가지 정보를 포함합니다. 첫 번째로, 이 토큰이 JWT임을 나타내는 "typ" 필드가 있습니다. 두 번째로, 어떤 알고리즘을 사용하여 토큰을 서명하는지를 나타내는 "alg" 필드가 있습니다.

페이로드(Payload): 페이로드는 실제로 전달하려는 정보를 담고 있습니다. 이는 클레임(claim)으로 불리는 이름-값 쌍의 집합으로 구성되어 있습니다. 예를 들어, "sub" (Subject) 클레임은 토큰의 주체를 나타내며, "exp" (Expiration Time) 클레임은 토큰의 만료 시간을 나타냅니다.

시그니처(Signature): 시그니처는 헤더와 페이로드를 합친 후, 비밀 키를 사용하여 생성됩니다. 이를 통해 토큰이 변조되지 않았음을 검증할 수 있습니다.

JWT의 동작 방식:

  1. 사용자가 로그인을 시도하면, 서버는 사용자의 정보를 확인하고 정보를 암호화하고 토대로 BASE64URL 인코딩 후 JWT를 생성합니다.
  2. 생성된 JWT는 사용자에게 전달(로컬스토리지 저장)되고, 이를 이용하여 앞으로의 요청에 대한 인증이 이루어집니다.
  3. 클라이언트가 요청을 보낼 때마다 JWT를 헤더에 담아 서버로 전송합니다.
  4. 서버는 secret key를 바탕으로 해당 JWT의 시그니처를 확인하고 클라이언트의 요청을 처리합니다.

JWT는 웹 개발에서 정보 전달과 인증을 처리하는 데 매우 유용한 도구입니다. RFC7519는 이러한 JWT의 표준을 정의하고 있으며, 헤더, 페이로드, 시그니처의 구조와 동작 방식을 자세하게 설명하고 있습니다. 이를 기반으로 웹 애플리케이션에서 보안성을 유지하면서 효율적인 데이터 교환을 실현할 수 있습니다.

profile
42seoul, blockchain, web 3.0

0개의 댓글