서명 인터페이스

가장 기본적인 인터페이스는 서명 인터페이스다. Signer 클래스를 써서 특정 문자열에 서명을 붙일 수 있다.

from itsdangerous import Signer
s = Signer("secret-key")
s.sign("my string")
b'my string.wh6tMHxLgJqB6oY1uT73iMlyrOA'

마침표로 구분해서 문자열 뒤에 서명이 덧붙는다. 문자열을 검증하려면 unsign() 메소드를 쓰면 된다.

s.unsign(b"my string.wh6tMHxLgJqB6oY1uT73iMlyrOA")
b'my string'

유니코드 문자열을 주면 암묵적으로 UTF-8 인코딩이 이뤄진다. 하지만 서명 검증 후에 그 문자열이 유니코드였는지 바이트열이었는지 알 방법은 없다.

값이 바뀌면 서명이 더는 일치하지 않게 되고 서명 검증 과정에서 BadSignature 예외를 던지게 된다.

s.unsign(b"different string.wh6tMHxLgJqB6oY1uT73iMlyrOA")
Traceback (most recent call last):
  ...
itsdangerous.exc.BadSignature: Signature "wh6tMHxLgJqB6oY1uT73iMlyrOA" does not match

서명 유효 기간을 써넣고 검증하고 싶다면 타임스탬프 사용해 서명하기 절을 보라.

class itsdangerous.signer.Signer(secret_key, salt=None, sep='.', key_derivation=None, digest_method=None, algorithm=None)

이 클래스로 바이트들에 서명을 하거나 받은 서명을 검증할 수 있다.

솔트를 사용해 일종의 해시 네임스페이스를 만들어서 서명된 문자열이 해당 네임스페이스에서만 유효하게 할 수 있다. 솔트를 기본값 그대로 두거나 응용의 한 부분에서 서명한 값이 다른 부분에서 어떤 의미가 있을 때 두 곳에서 같은 솔트 값을 재사용하는 건 보안 위험 요소다.

솔트의 역할이 뭐고 어떻게 활용할 수 있는지에 대한 예시는 솔트 참고.

New in version 0.14: 클래스 생성자 인자로 key_derivationdigest_method 추가됨.

New in version 0.18: 클래스 생성자 인자로 algorithm 추가됨.

static default_digest_method()

서명에 사용할 다이제스트 메소드. 기본은 SHA1이지만 hashlib 모듈의 다른 함수로 바꿀 수 있다.

New in version 0.14.

default_key_derivation = 'django-concat'

키 유도 방식을 지정. 기본은 장고 스타일 접합이다. 가능한 값으로 concat, django-concat, hmac이 있다. 비밀키에 솔트를 추가해서 키를 유도하는 데 쓰인다.

New in version 0.14.

derive_key()

이 메소드를 호출해서 키를 유도한다. 여기의 기본 키 유도 방식을 바꿀 수 있다. 키 유도는 짧은 패스워드로 복잡한 키를 만드는 보안 수단이 아니다. 보안을 위해선 긴 난수 비밀키를 사용해야 한다.

get_signature(value)

값을 받아서 서명을 반환한다.

sign(value)

문자열을 받아서 서명을 한다.

unsign(signed_value)

문자열을 받아서 검증하고 서명을 없앤다.

validate(signed_value)

서명된 값을 받아서 검증만 한다. 서명이 존재하고 유효하면 True를 반환한다.

verify_signature(value, sig)

값을 받아서 서명을 검증한다.

서명 알고리듬

class itsdangerous.signer.NoneAlgorithm

어떤 서명도 수행하지 않고 빈 서명을 반환하는 알고리듬을 제공한다.

class itsdangerous.signer.HMACAlgorithm(digest_method=None)

HMAC을 이용하는 서명 생성 방식을 제공한다.