서명 인터페이스¶
가장 기본적인 인터페이스는 서명 인터페이스다. 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_derivation
및digest_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)¶ 값을 받아서 서명을 검증한다.
-
static