HTTP | JWT

JWT(JSON Web Token)는 일반적으로 header + payload + signature로 구성됩니다.

 

Header

 

JWT에 대한 메타데이터 정보를 포함합니다.

 


{
  "alg": "HS256",
  "typ": "JWT"
}

더 많은 헤더를 찾을 수 있지만, 이전 헤더들은 항상 존재합니다.

 

Payload

 

페이로드에는 JWT의 클레임이 포함됩니다. 표준 헤더는 다음과 같습니다:

 


{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

서명

 

서명은 Encoded Header, Encoded Payload, Secret, 그리고 Cryptographic Algorithm을 사용하여 생성됩니다.


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5M
DIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

지원되는 알고리즘

다음 알고리즘은 Client 및 Server JWT 구성 요소 모두에서 지원됩니다.

 

 

JWT를 서명하고 검증하려면 OpenSSL 라이브러리가 필요합니다. 단 한 가지 예외가 있습니다.

 

ML-DSA, 포스트 양자 서명

세 가지 ML-DSA 알고리즘은 RFC 9964의 포스트 양자 JOSE 알고리즘이며, 위에서 말한 예외에 해당합니다. sgcCrypto 팩에 순수 Object Pascal로 구현되어 있으므로 OpenSSL 라이브러리 없이도 서명하고 검증합니다. 서명은 JWS 서명 입력에 대해 빈 컨텍스트로 순수(pure) 모드에서 수행하는 FIPS 204 ML-DSA이며, 토큰에는 base64url로 실립니다. 서명기는 결정적이므로, 같은 키와 같은 입력은 언제나 같은 서명을 만들어 냅니다.

 

열거형 값은 jwtMLDSA44, jwtMLDSA65, jwtMLDSA87이며, 이들이 기록하는 alg 헤더는 ML-DSA-44, ML-DSA-65, ML-DSA-87입니다. 클라이언트는 PKCS#8 PEM 개인 키인 JWTOptions.Algorithms.MLDSA.PrivateKey로 서명하고, 서버는 SubjectPublicKeyInfo PEM 공개 키인 JWTOptions.Algorithms.MLDSA.PublicKey로 검증합니다. 키의 매개변수 집합은 알고리즘이 가리키는 것과 같아야 합니다. 그렇지 않으면 서명은 오류를 발생시키고 검증은 False를 반환합니다.

 

서명은 큽니다. ML-DSA-44 서명은 ES256의 64바이트에 비해 2420바이트이므로 토큰이 base64url 기준으로 대략 3.2KB 늘어나고, ML-DSA-87은 약 6.2KB 늘어납니다. 도입하기 전에 토큰이 거쳐 가는 모든 곳의 헤더 크기 제한을 확인하십시오.

 

키는 RFC 9964의 3절과 4절에 있는 AKP JSON Web Key로도 전달할 수 있습니다. sgcMLDSA_ExportPublicJWK와 sgcMLDSA_ExportPrivateJWK가 JWK를 기록하고, sgcMLDSA_ImportJWK가 두 형식 모두를 읽으며, sgcMLDSA_ImportJWKAsPEM은 JWK를 두 구성 요소가 읽는 PEM 문자열로 바로 변환합니다. 개인 JWK는 4절이 정의하는 유일한 개인 형식인 32바이트 시드를 priv에 저장하므로, 확장된 개인 키는 JWK로 기록할 수 없습니다. 네 함수 모두 sgcHTTP_JWT_MLDSA에 선언되어 있습니다.

 

* ML-DSA 알고리즘에는 sgcCrypto 팩이 필요합니다. 이 팩이 없으면 열거형 값 자체는 그대로 있으므로 그 값으로 저장된 폼은 계속 로드되지만, 서명은 오류를 발생시키고 모든 ML-DSA 토큰은 거부됩니다.

구성 요소

 

 

 

* JWT 구성 요소는 최소 Indy 버전 10.6.0.5169 또는 sgcWebSockets Enterprise Edition을 필요로 합니다.