JSON 웹 서명 (JWS)

JSON 웹 서명(JWS)은 앞서 본 URL 안전 직렬화와 비슷하게 동작하되 draft-ietf-jose-json-web-signature에 따라 헤더를 내놓는다.

from itsdangerous import JSONWebSignatureSerializer
s = JSONWebSignatureSerializer("secret-key")
s.dumps({"x": 42})
'eyJhbGciOiJIUzI1NiJ9.eyJ4Ijo0Mn0.ZdTn1YyGz9Yx5B5wNpWRL221G1WpVE5fPCPKNuc6UAo'

값을 다시 받을 때 다른 직렬화와 마찬가지로 기본적으로 헤더가 반환되지 않는다. 하지만 return_header=True를 줘서 헤더를 요청할 수도 있다. 직렬화 때 자체적인 헤더 필드를 제공할 수 있다.

s.dumps(0, header_fields={"v": 1})
'eyJhbGciOiJIUzI1NiIsInYiOjF9.MA.wT-RZI9YU06R919VBdAfTLn82_iIQD70J_j-3F4z_aM'
s.loads(
    "eyJhbGciOiJIUzI1NiIsInYiOjF9"
    ".MA.wT-RZI9YU06R919VBdAfTLn82_iIQD70J_j-3F4z_aM"
)
(0, {'alg': 'HS256', 'v': 1})

현재 itsdangerous에서는 HMAC SHA 파생 알고리듬과 none 알고리듬만 제공하고 ECC 기반 알고리듬을 지원하지 않는다. 헤더의 알고리듬을 직렬화의 알고리듬과 비교해서 불일치 시 BadSignature 예외를 던진다.

class itsdangerous.jws.JSONWebSignatureSerializer(secret_key, salt=None, serializer=None, serializer_kwargs=None, signer=None, signer_kwargs=None, algorithm_name=None)

이 직렬화 모듈에선 JSON 웹 서명(JWS) 지원을 구현하고 있다. JWS Compact Serialization만 지원한다.

default_algorithm = 'HS512'

서명 생성에 사용할 기본 알고리듬

default_serializer

alias of itsdangerous._json._CompactJSON

dump_payload(header, obj)

인코딩 된 객체를 덤프 한다. 반환 값은 항상 bytes다. 내부 직렬화 모듈에서 텍스트를 반환하면 UTF-8으로 인코딩 된다.

dumps(obj, salt=None, header_fields=None)

Serializer.dumps()와 비슷하되 JSON 웹 서명을 만들어 낸다. JWS 헤더에 추가로 포함시킬 필드를 지정하는 것도 가능하다.

load_payload(payload, serializer=None, return_header=False)

인코딩 된 객체를 적재한다. 페이로드가 유효하지 않으면 함수에서 BadPayload를 던진다. serializer 매개변수를 이용하면 클래스에 저장된 것과 다른 직렬화 방식을 쓸 수 있다. 인코딩 된 payload는 항상 bytes여야 한다.

loads(s, salt=None, return_header=False)

dumps()의 반대. return_header를 설정해 요청하면 페이로드와 헤더로 된 튜플을 반환한다.

loads_unsafe(s, salt=None, return_header=False)

loads()와 비슷하되 서명 검증이 빠져 있다. 직렬화 모듈 동작 방식에 따라선 아주 위험한 동작일 수도 있다. 반환 값이 단순 페이로드가 아니라 (signature_valid, payload)다. 첫 항목은 서명이 유효한지 여부를 나타내는 불리언이다. 이 함수는 절대 실패하지 않는다.

디버깅용으로만, 그리고 직렬화 모듈에 취약성이 없다는 게 확실할 때만 써야 한다. (예를 들어 pickle 직렬화 모듈에는 쓰지 말아야 한다.)

New in version 0.15.

make_signer(salt=None, algorithm=None)

사용할 signer 인스턴스를 새로 만든다. 기본 구현에서는 기반 클래스 Signer를 쓴다.

class itsdangerous.jws.TimedJSONWebSignatureSerializer(secret_key, expires_in=None, **kwargs)

기본 JSONWebSignatureSerializer처럼 동작하되 서명 시간까지 기록하므로 서명이 만료되게 할 수 있다.

JWS에서는 현재 이런 동작을 명세하고 있지 않지만 이런 확장이 가능하다고 명세에서 언급하고 있다. draft-ietf-oauth-json -web-token에 명세된 것과 비슷한 방식으로 만료 날짜를 헤더에 인코딩 한다.

loads(s, salt=None, return_header=False)

dumps()의 반대. return_header를 설정해 요청하면 페이로드와 헤더로 된 튜플을 반환한다.