JWE와 JWS

JOSE 프레임워크

JOSE는 당사자간에 claim을 안전하게 전송하기 위한 프레임워크이고, 이를 위해 몇가지 규격을 제공하고 있습니다.

대표적인 것 몇 가지만 알아보도록 하겠습니다.

  • JWT (JSON Web Token) : JWS or JWE

  • JWS (JSON Web Signature) : 서버에서 인증을 증거로 인증 정보를 서명한 것을 Token 화 한것.

  • JWE (JSON Web Encryption) : 서버와 클라이언트 간 암호화된 데이터를 Token 화 한것.

JWT (JSON Web Token)

JWT는 주로 인증 및 권한 부여를 위해 사용됩니다.
클레임 정보는 JSON 형식으로 표현되며,
토큰은 마침표(.)로 구분되어 Header, Payload, Signature 세 부분으로 나뉘게 됩니다.

토큰 구성 요소

  1. Header: 토큰의 유형 및 사용된 알고리즘을 정의합니다.
    • alg : signing 알고리즘
    • typ : token의 타입 (JWT)
  2. Payload: 클레임 정보를 포함하며, 사용자에 대한 정보와 추가적인 메타데이터를 포함할 수 있습니다.
    • registered claims
    • public claims
    • private claims
    • 위와 같이 3가지 claim이 존재하고, 상황에 맞게 추가하거나 선택해서 사용함
  3. Signature: Header와 Payload를 조합하여 서명된 부분으로, 토큰의 무결성을 검증합니다.

JWS (JSON Web Signature)

JWS는 서버에서 클라이언트로 전송되는 데이터의 무결성을 보장하기 위해 사용됩니다. 클레임 정보가 서버에 의해 서명되어 토큰으로 포함되며, 이를 통해 클라이언트는 데이터의 변조 여부를 확인할 수 있습니다.

  • 서명된 JWT를 JWS라고 합니다.
  • 규격상 두 가지 방법으로 serialization 될 수 있습니다.
    • JWS Compact Serialization
      • 간결하고, URL-safe 한 문자열
    • JWS JSON Serialization
      • 복잡하고, URL-safe 하지 않은 JSON Object
      • 두 개 이상의 서명이 가능함

서명 과정

  1. Payload 생성: 서명될 내용을 Base64-URL 인코딩하여 Payload를 생성합니다. 이때 JSON 형식일 필요는 없습니다.
  2. Header 결정: Payload와 함께 몇 개의 서명이 필요한지를 고려하여 각 Header를 결정합니다. 보호될 Header들을 포함한 JSON 객체를 생성합니다.
  3. Protected 생성: 보호될 Header를 UTF-8로 인코딩하고 Base64-URL 인코딩하여 Protected를 생성합니다.
  4. 서명 계산: 각 서명을 계산하기 위해 형태를 형성합니다.
    • 이전 단계에 alg 요소의 알고리즘에 따라 서명을 계산합니다.
    • 이전 단계의 서명을 Base64-URL로 인코딩하여 하나의 Signature를 생성합니다.
  5. 모든 서명 완료: Signatures 배열의 모든 서명을 완료합니다.

JWS 알고리즘

통상적으로 가장 많이 사용되는 알고리즘들 입니다.

  • HS256
  • RS256
  • ES256

JWE (JSON Web Encryption)

JWE는 데이터의 기밀성을 유지하기 위해 사용됩니다. 클라이언트와 서버 간에 전송되는 데이터가 암호화되어 토큰에 포함되며, 이를 통해 외부에서의 데이터 열람을 방지합니다.

  • JSON 기반 데이터 구조를 encryption 하는 방법의 규격
  • JWE는 규격상 두 가지 방법으로 serialization 될 수 있습니다.
    • JWE Compact Serialization
      • 5가지 컴포넌트로 구성
        • Header: JWS에 enc와 zip 요소가 추가됩니다. enc는 content encryption 알고리즘을 정의하며, 이는 대칭 AEAD(Authenticated Encryption with Associated Data) 알고리즘이어야 합니다.
        • JWE Encrypted Key: Issuer가 생성한 CEK(Content Encryption Key)를 암호화한 값입니다.
        • Initialization Vector(IV): 암호화를 위해 사용되는 초기화 벡터입니다.
        • Ciphertext: CEK와 암호화된 payload를 함께 사용하여 생성된 값입니다.
        • Authentication Tag: ciphertext와 함께 생성되는 AEAD 알고리즘의 인증 태그입니다.
    • JWE JSON Serialization
      • 6가지 컴포넌트로 구성
        • protected: 보호되어 무결성을 가진 header 요소를 포함하는 JSON object입니다.
        • unprotected(shared): 무결성 보호되지 않는 header 요소를 포함하는 JSON object입니다.
        • recipients: 특정 수신자에게만 적용되는 무결성 보호되지 않는 header 요소가 포함된 JSON object입니다.
        • JWE Encrypted Key: 암호화된 키를 base64-url로 인코딩한 값입니다.
        • Initialization Vector(IV): 암호화를 위해 사용되는 초기화 벡터입니다.
        • Ciphertext와 Authentication Tag: ciphertext와 함께 생성되는 AEAD 알고리즘의 인증 태그입니다.

암호화 과정

  1. 데이터를 암호화하기 위한 공개키를 수신합니다.
  2. 공개키를 사용하여 데이터를 암호화합니다.
  3. 암호화된 데이터를 토큰에 추가하여 클라이언트로 전송합니다.
  4. 클라이언트는 개인키를 사용하여 데이터를 해독하여 복원합니다.

JWS와 JWE의 사용 이유

  • JWS는 단순히 claim set에 서명을 포함하여 Base64로 인코딩 되어 있음
    • 위변조 되지는 않으나 누구나 claim을 읽을 수 있음(무결성 O, 기밀성 X)
  • JWE는 단순히 claim set을 암호화함
    • 누구나 읽을 순 없으나 서명이 없어 인증 및 권한 부여로 쓸 순 없음(무결성 X, 기밀성 O)

JWS와 JWE는 데이터의 무결성과 기밀성을 보장하여 상호 보완하여 안전한 claim 전송이 가능하게 됩니다.
이를 통해 사용자 인증, 권한 부여 및 기타 보안 관련 작업을 효과적으로 수행할 수 있습니다.

결론

JWS는 데이터의 무결성을 보장하므로 데이터가 변경되지 않았는지 확인할 수 있습니다.
반면에 JWE는 데이터의 기밀성을 보장하여 외부에서의 열람을 방지합니다.

JOSE 프레임워크는 인증, 권한 부여, 데이터 보안 등 다양한 보안 요구 사항을 해결하기 위한 도구로서 안전하고 신뢰할 수 있는 시스템을 구축할 수 있도록 합니다.