http.cookies
--- HTTP 상태 관리¶
소스 코드: Lib/http/cookies.py
http.cookies
모듈은 HTTP 상태 관리 메커니즘인 쿠키의 개념을 추상화하는 클래스를 정의합니다. 그것은 단순한 문자열 전용 쿠키를 지원하고, 동시에 직렬화 가능한 데이터형을 쿠키값으로 갖는 데 필요한 추상화를 제공합니다.
이 모듈은 예전에는 RFC 2109와 RFC 2068 명세에서 설명된 구문 분석 규칙을 엄격하게 적용했습니다. 그 이후로 MSIE 3.0x가 이 명세에 명시된 문자 규칙을 따르지 않으며 쿠키 처리와 관련하여 오늘날의 많은 브라우저와 서버가 구문 분석 규칙을 완화했다는 사실이 발견되었습니다. 결과적으로, 사용되는 구문 분석 규칙은 약간 덜 엄격합니다.
문자 집합, string.ascii_letters
, string.digits
및 !#$%&'*+-.^_`|~:
는 이 모듈이 쿠키 이름(key
)에 허용한 유효한 문자 집합을 나타냅니다.
버전 3.3에서 변경: ':'를 유효한 쿠키 이름 문자로 허용합니다.
참고
잘못된 쿠키가 발견되면, CookieError
가 발생하므로, 쿠키 데이터가 브라우저에서 제공되면 항상 잘못된 데이터일 가능성에 대비하고 구문 분석할 때 CookieError
를 잡아야 합니다.
flowdas
CookieError
를 발생시키는 검사는 쿠키 키와 어트리뷰트의 이름에 대해서만 이루어집니다.
또한 이 예외는 BaseCookie.load()
에서는 발생하지 않습니다. 잘못된 값이
제공되면 그냥 무시해버립니다.
flowdas
이 동작 때문에 이 모듈에서 제공되는 클래스들을 상용 웹서버에 그대로
사용하는 것은 좋지 않습니다. 예를 들어, 크롬 브라우저는 표준에서 허락하지 않는 '"'
문자가 쿠키값의
아무 곳에서나 나올 수 있도록 허락하는데, 이 문자는 이 모듈이 허락하는 비표준 문자 집합에도 포함되지 않습니다
(오직 값 전체를 '"'
로 둘러싸는 것만 허락합니다). 표준 준수에 대한
의무감을 느끼지 않는 개발자들은 쿠키값으로 '"'
가 중간에 포함된 JSON 문자열을 그대로 넣기도 합니다.
만약 이런 개발자가 여러분과 도메인을 공유하는 이웃에 있으면 곤란한 상황에 직면할 수 있습니다.
가령 여러분이 goodgirl.example.com에서 웹 서비스를 제공하는데, 이웃의 badguy.example.com에서
JSON 값을 갖는 쿠키를 example.com 도메인으로 뿌리면, 여러분의 서비스에도 그 쿠키가 올라오게 됩니다.
문제는 한 Cookie
헤더에 goodgirl 쿠키와 badguy 쿠키가 함께 들어오게 된다는 것입니다.
badguy 쿠키가 앞에 나와서 BaseCookie.load()
가 잘못된 문자를 인식하는 순간, 그 헤더를
통째로 버립니다. 여러분은 "왜 쿠키가 들어오지 않지?"를 중얼거리게 됩니다. 보통은 웹 프레임워크를 사용하기
때문에 BaseCookie.load()
를 직접 호출할 일은 없을 것으로 생각할 수도 있겠지만, 웹 프레임워크들 역시
이 모듈을 그대로 사용하기도 한다는 것이 문제입니다. 올라온 것 같은 쿠키가 사라지는 일을 만나면,
이 문제를 살펴보십시오.
RFC 2109 위반으로 인해 실패하는 예외: 잘못된 어트리뷰트, 잘못된 Set-Cookie 헤더 등
이 클래스는 키가 문자열이고 값이
Morsel
인스턴스인 딕셔너리 형 객체입니다. 키에 값을 설정하면, 값이 먼저 키와 값이 포함된Morsel
로 변환됩니다.input이 주어지면,
load()
메서드로 전달됩니다.
이 클래스는
BaseCookie
에서 파생되며value_decode()
와value_encode()
를 재정의합니다. SimpleCookie는 문자열 쿠키값을 지원합니다. 값을 설정할 때, SimpleCookie는 내장str()
을 호출하여 값을 문자열로 변환합니다. HTTP에서 수신된 값은 문자열로 유지됩니다.flowdas
SimpleCookie
는'%'
문자를 사용해서 쿠키에서 허용되지 않는 문자들을 이스케이핑 합니다.
더 보기
- 모듈
http.cookiejar
웹 클라이언트용 HTTP 쿠키 처리.
http.cookiejar
와http.cookies
모듈 간의 의존성은 없습니다.- RFC 2109 - HTTP State Management Mechanism (HTTP 상태 관리 메커니즘)
이것은 이 모듈이 구현한 상태 관리 명세입니다.
쿠키 객체¶
문자열 표현으로부터 튜플
(real_value, coded_value)
를 반환합니다.real_value
는 모든 형이 될 수 있습니다. 이 메서드는BaseCookie
에서는 아무런 디코딩을 하지 않습니다 --- 재정의할 수 있도록 존재합니다.flowdas
디코딩된 값은 2-튜플 (
Morsel.value
, val)로 반환해야 합니다.
튜플
(real_value, coded_value)
를 반환합니다. val은 모든 형이 될 수 있지만,coded_value
는 항상 문자열로 변환됩니다. 이 메서드는BaseCookie
에서는 아무런 인코딩을 하지 않습니다 --- 재정의할 수 있도록 존재합니다.flowdas
인코딩된 값은 2-튜플 (val,
Morsel.coded_value
)로 반환해야 합니다.flowdas
정확히 말하자면,
BaseCookie
에서 아무것도 하지 않는다는 것은 사실이 아닙니다. val을str()
로 변환하기는 합니다.일반적으로,
value_encode()
와value_decode()
는 value_decode 범위에서 역연산입니다.
HTTP 헤더로서 송신하기 적절한 문자열 표현을 반환합니다. attrs와 header는 각
Morsel
의output()
메서드로 전송됩니다. sep는 헤더를 함께 결합하는 데 사용되며, 기본적으로'\r\n'
(CRLF) 조합입니다.
자바스크립트를 지원하는 브라우저에서 실행될 때 HTTP 헤더가 전송된 것처럼 작동하는, 삽입 가능한 자바스크립트 코드 조각을 반환합니다.
attrs의 의미는
output()
과 같습니다.
rawdata가 문자열이면,
HTTP_COOKIE
로 구문 분석하고 거기에 있는 값을Morsel
로 추가합니다. 딕셔너리면, 다음과 동등합니다:for k, v in rawdata.items(): cookie[k] = v
Morsel 객체¶
RFC 2109 어트리뷰트를 포함하는 키/값 쌍을 추상화합니다.
Morsel은 딕셔너리류 객체이며, 키의 집합은 상수입니다 --- 다음과 같은 유효한 RFC 2109 어트리뷰트입니다
expires
path
comment
domain
max-age
secure
version
httponly
samesite
httponly
어트리뷰트는 쿠키가 HTTP 요청으로만 전송되고 자바스크립트를 통해 액세스할 수 없도록 지정합니다. 이것은 교차 사이트 스크립팅의 일부 형식을 방지하기 위한 것입니다.어트리뷰트
samesite
는 브라우저가 교차 사이트 요청에 쿠키를 보낼 수 없도록 지정합니다. 이는 CSRF 공격을 완화하는 데 도움이 됩니다. 이 어트리뷰트의 유효한 값은 "Strict" 와 "Lax" 입니다.flowdas
secure
와 같이 사용한다면 "None"도 유효한 값일 수 있습니다. 이렇게 설정하면samesite
를 기본적으로 활성화하는 브라우저(가령 Chrome)에서 제삼자 쿠키를 허용하도록 합니다.키는 대소 문자를 구분하지 않으며 기본값은
''
입니다.버전 3.7에서 변경: 어트리뷰트
key
,value
및coded_value
는 읽기 전용입니다. 설정하려면set()
을 사용하십시오.버전 3.8에서 변경:
samesite
어트리뷰트에 대한 지원이 추가되었습니다.
쿠키의 값.
쿠키의 인코딩된 값 --- 이것을 전송해야 합니다.
쿠키의 이름.
key, value 및 coded_value 어트리뷰트를 설정합니다.
K가
Morsel
의 키 집합의 구성원인지를 판단합니다.
HTTP 헤더로 보내기에 적합한, Morsel의 문자열 표현을 반환합니다. 기본적으로, attrs가 주어지지 않는 한, 모든 어트리뷰트가 포함됩니다. 주어지면 사용할 어트리뷰트 리스트여야 합니다. header는 기본적으로
"Set-Cookie:"
입니다.
자바스크립트를 지원하는 브라우저에서 실행될 때, HTTP 헤더가 전송된 것처럼 작동하는, 삽입 가능한 자바스크립트 코드 조각을 반환합니다.
attrs의 의미는
output()
과 같습니다.
둘러싸는 HTTP나 자바스크립트 없이 Morsel을 표현하는 문자열을 반환합니다.
attrs의 의미는
output()
과 같습니다.
Morsel 딕셔너리의 값을 닥셔너리 values의 값으로 갱신합니다. values 딕셔너리의 키 중 하나라도 유효한 RFC 2109 어트리뷰트가 아니면 에러를 발생시킵니다.
버전 3.5에서 변경: 유효하지 않은 키에 대해서 에러가 발생합니다.
Morsel 객체의 얕은 복사본을 반환합니다.
버전 3.5에서 변경: 딕셔너리 대신 Morsel 객체를 반환합니다.
key가 유효한 RFC 2109 어트리뷰트가 아니면 에러를 발생시킵니다. 그렇지 않으면,
dict.setdefault()
와 같이 동작합니다.
예제¶
다음 예제는 http.cookies
모듈을 사용하는 방법을 보여줍니다.
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # HTTP 헤더를 생성합니다
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # 마찬가지입니다
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # 문자열에서 로드합니다 (HTTP 헤더)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # C["number"] = str(7) 과 동등합니다
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven