# `http.cookiejar` — HTTP 클라이언트를 위한 쿠키 처리

소스 코드: Lib/http/cookiejar.py

`http.cookiejar` 모듈은 HTTP 쿠키의 자동 처리를 위한 클래스를 정의합니다. 웹 서버의 HTTP 응답으로 클라이언트 시스템에 설정된 후, 이후의 HTTP 요청에서 서버로 반환되는 작은 데이터 조각 – 쿠키(cookies) – 을 요구하는 웹 사이트에 액세스하는 데 유용합니다.

일반 Netscape 쿠키 프로토콜과 RFC 2965로 정의된 프로토콜이 모두 처리됩니다. RFC 2965 처리는 기본적으로 꺼져있습니다. RFC 2109 쿠키는 Netscape 쿠키로 구문 분석된 후 이후에 적용되는 ‘정책’에 따라 Netscape나 RFC 2965 쿠키로 처리됩니다. 인터넷 쿠키의 대부분은 Netscape 쿠키임에 유의하십시오. `http.cookiejar`는 RFC 2965에 도입된 `max-age`와 `port` 쿠키 어트리뷰트를 처리하는 것을 포함하여, 시장 표준 Netscape 쿠키 프로토콜(원래 Netscape 명세에서 설정한 것과 꽤 다릅니다)을 따르려고 합니다.

참고

Set-Cookie와 Set-Cookie2 헤더에서 발견되는 다양한 이름 붙은 파라미터(예를 들어, `domain`과 `expires`)는 통상적으로 어트리뷰트(attributes)로 지칭됩니다. 파이썬 어트리뷰트와 구별하기 위해, 이 모듈의 설명서는 쿠키 어트리뷰트(cookie-attribute)라는 용어를 대신 사용합니다.

모듈은 다음 예외를 정의합니다:

exception http.cookiejar.LoadError

  `FileCookieJar` 인스턴스는 파일에서 쿠키를 로드하지 못하면 이 예외를 발생시킵니다. `LoadError`는 `OSError`의 서브 클래스입니다.

  버전 3.3에서 변경: 이전에는 `LoadError`가 `IOError`의 서브 형이었습니다. 이제는 `OSError`의 별칭입니다.

다음과 같은 클래스가 제공됩니다:

class http.cookiejar.CookieJar(policy=None)

  policy는 `CookiePolicy` 인터페이스를 구현하는 객체입니다.

  `CookieJar` 클래스는 HTTP 쿠키를 저장합니다. HTTP 요청에서 쿠키를 추출하고, HTTP 응답으로 반환합니다. 필요하면 `CookieJar` 인스턴스는 포함된 쿠키를 자동으로 만료합니다. 서브 클래스는 파일이나 데이터베이스에서 쿠키를 저장하고 검색하는 역할도 합니다.

class http.cookiejar.FileCookieJar(filename=None, delayload=None, policy=None)

  policy는 `CookiePolicy` 인터페이스를 구현하는 객체입니다. 다른 인자에 대해서는, 해당 어트리뷰트의 설명서를 참조하십시오.

  디스크의 파일에서 쿠키를 로드하고 아마도 파일에 쿠키를 저장할 수 있는 `CookieJar`. `load()`나 `revert()` 메서드가 호출될 때까지 이름이 지정된 파일에서 쿠키가 로드되지 않습니다. 이 클래스의 서브 클래스는 FileCookieJar 서브 클래스와 웹 브라우저와의 협력 섹션에 설명되어 있습니다.

  This should not be initialized directly – use its subclasses below instead.

  버전 3.8에서 변경: filename 매개 변수는 경로류 객체를 지원합니다.

class http.cookiejar.CookiePolicy

  이 클래스는 각 쿠키가 서버에서 수락되고 서버로 반환되어야 하는지를 결정하는 역할을 맡습니다.

class http.cookiejar.DefaultCookiePolicy(blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, secure_protocols=('https', 'wss'))

  생성자 인자는 키워드 인자로만 전달해야 합니다. blocked_domains는 쿠키를 수락하지도 쿠키를 반환하지도 않을 도메인 이름의 시퀀스입니다. allowed_domains가 `None`이 아니면, 이것이 쿠키를 수락하고 반환하는 유일한 도메인의 시퀀스입니다. secure_protocols는 보안 쿠키를 추가 할 수 있는 프로토콜의 시퀀스입니다. 기본적으로 https와 wss(보안 웹 소켓)는 보안 프로토콜로 간주합니다. 다른 모든 인자는, `CookiePolicy`와 `DefaultCookiePolicy` 객체에 대한 설명서를 참조하십시오.

  `DefaultCookiePolicy`는 Netscape와 RFC 2965 쿠키를 위한 표준 수락/거부 규칙을 구현합니다. 기본적으로, RFC 2109 쿠키(즉 version 쿠키 어트리뷰트가 1인 Set-Cookie 헤더로 수신된 쿠키)는 RFC 2965 규칙에 따라 처리됩니다. 그러나, RFC 2965 처리가 꺼져 있거나 `rfc2109_as_netscape`가 `True`이면, `Cookie` 인스턴스의 `version` 어트리뷰트를 0으로 설정하여, `CookieJar` 인스턴스에서 RFC 2109 쿠키를 Netscape 쿠키로 ‘다운 그레이드’ 합니다. `DefaultCookiePolicy`는 정책을 미세 조정할 수 있는 매개 변수도 제공합니다.

class http.cookiejar.Cookie

  이 클래스는 Netscape, RFC 2109 및 RFC 2965 쿠키를 나타냅니다. `http.cookiejar` 사용자가 스스로 `Cookie` 인스턴스를 만들 것으로 기대하지 않습니다. 대신, 필요하면, `CookieJar` 인스턴스에서 `make_cookies()`를 호출하십시오.

더 보기

모듈 `urllib.request`

  자동 쿠키 처리가 지원되는 URL 열기.

모듈 `http.cookies`

  HTTP 쿠키 클래스, 주로 서버 측 코드에 유용합니다. `http.cookiejar`와 `http.cookies` 모듈은 서로 의존하지 않습니다.

https://curl.se/rfc/cookie_spec.html

  원래 Netscape 쿠키 프로토콜의 명세. 이것이 여전히 지배적인 프로토콜이지만, 모든 주요 브라우저(및 `http.cookiejar`)에 의해 구현된 ‘Netscape 쿠키 프로토콜’은 사라져가는 `cookie_spec.html`에서 스케치 된 것과의 유사성을 담고 있을 뿐입니다.

RFC 2109 - HTTP 상태 관리 메커니즘

  RFC 2965로 개정되었습니다. version=1 인 Set-Cookie를 사용합니다.

RFC 2965 - HTTP 상태 관리 메커니즘

  버그가 수정된 Netscape 프로토콜. Set-Cookie 대신 Set-Cookie2를 사용합니다. 널리 사용되지 않습니다.

https://kristol.org/cookie/errata.html

  완료되지 않은 RFC 2965의 정오표.

RFC 2964 - HTTP 상태 관리 사용

## CookieJar와 FileCookieJar 객체

`CookieJar` 객체는 포함된 `Cookie` 객체를 이터레이트 하기 위한 이터레이터 프로토콜을 지원합니다.

`CookieJar`에는 다음과 같은 메서드가 있습니다:

CookieJar.add_cookie_header(request)

  request에 올바른 Cookie 헤더를 추가합니다.

  정책이 허용하면 (즉, `CookieJar`의 `CookiePolicy` 인스턴스의 `rfc2965`와 `hide_cookie2` 어트리뷰트가 각각 참과 거짓이면), Cookie2 헤더도 적절한 경우 추가됩니다.

  request 객체(일반적으로 `urllib.request.Request` 인스턴스)는 `urllib.request`에 설명되어 있듯이 `get_full_url()`, `has_header()`, `get_header()`, `header_items()`, `add_unredirected_header()` 및 어트리뷰트 `host`, `type`, `unverifiable`, `origin_req_host`를 지원해야 합니다.

  버전 3.3에서 변경: request 객체에는 `origin_req_host` 어트리뷰트가 필요합니다. 폐지된 메서드 `get_origin_req_host()`에 대한 의존성이 제거되었습니다.

CookieJar.extract_cookies(response, request)

  HTTP response에서 쿠키를 추출하여 정책이 허용하면 `CookieJar`에 저장합니다.

  `CookieJar`는 response 인자에서 수락할 수 있는 Set-Cookie와 Set-Cookie2 헤더를 찾고, 쿠키를 적절하게 저장합니다 (`CookiePolicy.set_ok()` 메서드의 승인에 따라).

  response 객체(일반적으로 `urllib.request.urlopen()` 호출의 결과, 또는 유사한 것)는 `email.message.Message` 인스턴스를 반환하는 `info()` 메서드를 지원해야 합니다.

  request 객체(일반적으로 `urllib.request.Request` 인스턴스)는 `urllib.request`에 설명되어 있듯이 메서드 `get_full_url()` 과 어트리뷰트 `host`, `unverifiable` 및 `origin_req_host`를 지원해야 합니다. request는 쿠키를 설정할 수 있는지 확인하는 것뿐만 아니라 쿠키 어트리뷰트의 기본값을 설정하는 데 사용됩니다.

  버전 3.3에서 변경: request 객체에는 `origin_req_host` 어트리뷰트가 필요합니다. 폐지된 메서드 `get_origin_req_host()`에 대한 의존성이 제거되었습니다.

CookieJar.set_policy(policy)

  사용할 `CookiePolicy` 인스턴스를 설정합니다.

CookieJar.make_cookies(response, request)

  response 객체에서 추출한 `Cookie` 객체의 시퀀스를 반환합니다.

  response와 request 인자에 필요한 인터페이스는 `extract_cookies()` 설명서를 참조하십시오.

CookieJar.set_cookie_if_ok(cookie, request)

  정책이 그래도 좋다고 한다면 `Cookie`를 설정합니다.

CookieJar.set_cookie(cookie)

  설정할 수 있는지 정책을 확인하지 않고, `Cookie`를 설정합니다.

CookieJar.clear([domain[, path[, name]]])

  일부 쿠키를 지웁니다.

  인자 없이 호출되면, 모든 쿠키를 지웁니다. 단일 인자가 제공되면, 해당 domain에 속하는 쿠키만 제거됩니다. 두 개의 인자가 제공되면, 지정된 domain과 URL path에 속하는 쿠키가 제거됩니다. 세 개의 인자가 제공되면, 지정된 domain, path 및 name을 갖는 쿠키가 제거됩니다.

  일치하는 쿠키가 없으면 `KeyError`를 발생시킵니다.

CookieJar.clear_session_cookies()

  모든 세션 쿠키를 폐기합니다.

  실제 `discard` 어트리뷰트를 갖는 모든 쿠키를 폐기합니다 (보통 `max-age`나 `expires` 쿠키 어트리뷰트가 없기 때문에, 혹은 명시적인 `discard` 쿠키 어트리뷰트). 대화식 브라우저의 경우, 세션의 끝은 일반적으로 브라우저 창을 닫는 것에 해당합니다.

  `save()` 메서드는 참값의 ignore_discard 인자를 전달하여 다르게 요청하지 않는 한 세션 쿠키를 저장하지 않음에 유의하십시오.

`FileCookieJar`는 다음과 같은 추가 메서드를 구현합니다:

FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)

  쿠키를 파일에 저장합니다.

  이 베이스 클래스는 `NotImplementedError`를 발생시킵니다. 서브 클래스는 이 메서드를 구현하지 않은 채로 둘 수 있습니다.

  filename은 쿠키를 저장할 파일의 이름입니다. filename을 지정하지 않으면, `self.filename`이 사용됩니다 (이것의 기본값은 생성자에게 전달된 값입니다, 있다면); `self.filename`이 `None`이면 `ValueError`가 발생합니다.

  ignore_discard: 폐기되는 것으로 설정된 쿠키도 저장합니다. ignore_expires: 만료된 쿠키도 저장합니다

  파일이 이미 존재하면, 파일을 덮어써서, 파일에 포함된 모든 쿠키를 지웁니다. 저장된 쿠키는 나중에 `load()`나 `revert()` 메서드를 사용하여 복원할 수 있습니다.

FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)

  파일에서 쿠키를 로드합니다.

  새로 로드한 쿠키가 덮어쓰지 않는 한 오래된 쿠키는 유지됩니다.

  인자는 `save()`와 같습니다.

  명명된 파일은 클래스가 이해하는 형식이어야 하고, 그렇지 않으면 `LoadError`가 발생합니다. 또한, 예를 들어 파일이 존재하지 않으면, `OSError`가 발생할 수 있습니다.

  버전 3.3에서 변경: `IOError`가 발생했었지만, 이제는 `OSError`의 별칭입니다.

FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)

  모든 쿠키를 지우고 저장된 파일에서 쿠키를 다시 로드합니다.

  `revert()`는 `load()`와 같은 예외를 발생시킬 수 있습니다. 실패가 일어나면, 객체 상태는 변경되지 않습니다.

`FileCookieJar` 인스턴스에는 다음과 같은 공용 어트리뷰트가 있습니다:

FileCookieJar.filename

  쿠키를 보관할 기본 파일의 파일명. 이 어트리뷰트는 대입할 수 있습니다.

FileCookieJar.delayload

  참이면, 디스크에서 쿠키를 천천히(lazily) 로드합니다. 이 어트리뷰트는 대입하지 않아야 합니다. (디스크의 쿠키가 변경되지 않는 한) 성능에만 영향을 미칠 뿐 동작을 바꾸지는 않기 때문에, 이것은 힌트일 뿐입니다. `CookieJar` 객체는 이를 무시할 수 있습니다. 표준 라이브러리에 포함된 `FileCookieJar` 클래스는 아무것도 쿠키를 천천히 로드하지 않습니다.

## FileCookieJar 서브 클래스와 웹 브라우저와의 협력

다음 `CookieJar` 서브 클래스는 읽기와 쓰기를 위해 제공됩니다.

class http.cookiejar.MozillaCookieJar(filename=None, delayload=None, policy=None)

  Mozilla `cookies.txt` 파일 형식(curl, Lynx 및 Netscape 브라우저에서도 사용됩니다)으로 디스크에서 쿠키를 로드하고 저장할 수 있는 `FileCookieJar`.

  참고

  RFC 2965 쿠키에 대한 정보와, `port` 같은 최신이나 비표준 쿠키 어트리뷰트에 대한 정보가 손실됩니다.

  경고

  손실/손상이 불편한 쿠키가 있다면 저장하기 전에 쿠키를 백업하십시오 (로드/저장 왕복으로 인해 파일이 약간 변경될 수 있는 미묘한 부분이 있습니다).

  또한 Mozilla가 실행되는 동안 저장된 쿠키는 Mozilla에 의해 방해를 받음에 유의하십시오.

class http.cookiejar.LWPCookieJar(filename=None, delayload=None, policy=None)

  libwww-perl 라이브러리의 `Set-Cookie3` 파일 형식과 호환되는 형식으로 쿠키를 디스크에서 로드하고 저장할 수 있는 `FileCookieJar`. 사람이 읽을 수 있는 파일에 쿠키를 저장하려는 경우에 편리합니다.

  버전 3.8에서 변경: filename 매개 변수는 경로류 객체를 지원합니다.

## CookiePolicy 객체

`CookiePolicy` 인터페이스를 구현하는 객체에는 다음과 같은 메서드가 있습니다:

CookiePolicy.set_ok(cookie, request)

  서버에서 쿠키를 수락해야 하는지를 나타내는 불리언 값을 반환합니다.

  cookie는 `Cookie` 인스턴스입니다. request는 `CookieJar.extract_cookies()` 설명서에서 정의한 인터페이스를 구현하는 객체입니다.

CookiePolicy.return_ok(cookie, request)

  쿠키를 서버로 반환해야 하는지를 나타내는 불리언 값을 반환합니다.

  cookie는 `Cookie` 인스턴스입니다. request는 `CookieJar.add_cookie_header()` 설명서에서 정의한 인터페이스를 구현하는 객체입니다.

CookiePolicy.domain_return_ok(domain, request)

  주어진 쿠키 도메인(domain)에서, 쿠키를 반환하지 않아야 하면 `False`를 반환합니다.

  이 메서드는 최적화입니다. 특정 도메인을 가진 모든 쿠키를 검사할 필요(많은 파일을 읽는 것을 수반합니다)를 제거합니다. `domain_return_ok()`와 `path_return_ok()`에서 참을 반환하면 모든 작업이 `return_ok()`로 넘어갑니다.

  쿠키 도메인에 대해 `domain_return_ok()`가 참을 반환하면, 쿠키 경로에 대해 `path_return_ok()`가 호출됩니다. 그렇지 않으면, 해당 쿠키 도메인에 대해 `path_return_ok()`와 `return_ok()`가 호출되지 않습니다. `path_return_ok()`가 참을 반환하면, `return_ok()`가 `Cookie` 객체 자체로 호출되어 전체 검사를 수행합니다. 그렇지 않으면, 해당 쿠키 경로에 대해 `return_ok()`가 호출되지 않습니다.

  `domain_return_ok()`는 request 도메인뿐만 아니라 모든 cookie 도메인에 대해 호출됨에 유의하십시오. 예를 들어, 요청 도메인이 `"www.example.com"`이면 함수는 `".example.com"`과 `"www.example.com"` 모두에 대해 호출될 수 있습니다. `path_return_ok()`도 마찬가지입니다.

  request 인자는 `return_ok()`에 대해 설명된 대로입니다.

CookiePolicy.path_return_ok(path, request)

  주어진 쿠키 경로에 대해, 쿠키를 반환하지 않아야 하면 `False`를 반환합니다.

  `domain_return_ok()` 설명서를 참조하십시오.

위의 메서드를 구현하는 것 외에도, `CookiePolicy` 인터페이스의 구현은 어떤 프로토콜을 어떻게 사용해야 하는지를 나타내는 다음 어트리뷰트도 제공해야 합니다. 이러한 모든 어트리뷰트는 대입할 수 있습니다.

CookiePolicy.netscape

  Netscape 프로토콜을 구현합니다.

CookiePolicy.rfc2965

  RFC 2965 프로토콜을 구현합니다.

CookiePolicy.hide_cookie2

  요청에 Cookie2 헤더를 추가하지 않습니다 (이 헤더가 있으면 서버에게 우리가 RFC 2965 쿠키를 이해하고 있음을 알립니다).

`CookiePolicy` 클래스를 정의하는 가장 유용한 방법은 `DefaultCookiePolicy` 에서 서브 클래싱하고 위의 메서드 중 일부나 전부를 재정의하는 것입니다. `CookiePolicy` 자체는 모든 쿠키를 설정하고 수신하도록 허용하는 ‘널 정책’으로 사용될 수 있습니다 (이 정책이 그리 유용하지는 않을 것입니다).

## DefaultCookiePolicy 객체

쿠키 수락과 반환에 대한 표준 규칙을 구현합니다.

RFC 2965와 Netscape 쿠키를 모두 다룹니다. RFC 2965 처리는 기본적으로 꺼져있습니다.

자체 정책을 제공하는 가장 쉬운 방법은 이 클래스를 재정의하고 자체 검사를 추가하기 전에 재정의된 구현에서 해당 메서드를 호출하는 것입니다:

    import http.cookiejar
    class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
        def set_ok(self, cookie, request):
            if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
                return False
            if i_dont_want_to_store_this_cookie(cookie):
                return False
            return True

`CookiePolicy` 인터페이스를 구현하는 데 필요한 기능 외에도, 이 클래스를 사용하면 도메인이 쿠키를 설정하고 수신하는 것을 차단하고 허락할 수 있도록 합니다. 또한 다소 느슨한 Netscape 프로토콜 규칙을 약간 강화할 수 있는 몇 가지 엄격성 스위치가 있습니다 (일부 양성 쿠키를 차단하는 대가를 치르면서).

도메인 차단 목록과 수락 목록이 제공됩니다 (둘 다 기본적으로 꺼져있습니다). 차단 목록에 없고 수락 목록에 있는(수락 목록이 활성화되었다면) 도메인만 쿠키 설정과 반환에 참여합니다. blocked_domains 생성자 인자와 `blocked_domains()` 및 `set_blocked_domains()` 메서드 (그리고 allowed_domains를 위한 해당 인자와 메서드)를 사용하십시오. 수락 목록을 설정하면, `None`으로 설정하여 수락 목록을 다시 끌 수 있습니다.

점으로 시작하지 않는 차단 또는 수락 목록에 있는 도메인은 일치할 쿠키 도메인과 같아야 합니다. 예를 들어, `"example.com"`은 차단 목록 항목 `"example.com"`과 일치하지만, `"www.example.com"`은 일치하지 않습니다. 점으로 시작하는 도메인은 더 구체적인 도메인과도 일치합니다. 예를 들어, `"www.example.com"`과 `"www.coyote.example.com"`은 모두 `".example.com"`과 일치합니다 (하지만 `"example.com"` 자체는 일치하지 않습니다). IP 주소는 예외이며, 정확히 일치해야 합니다. 예를 들어, blocked_domains에 `"192.168.1.2"`와 `".168.1.2"`가 포함되어 있으면, 192.168.1.2는 차단되지만, 193.168.1.2는 차단되지 않습니다.

`DefaultCookiePolicy`는 다음과 같은 추가 메서드를 구현합니다:

DefaultCookiePolicy.blocked_domains()

  차단된 도메인 시퀀스를 반환합니다 (튜플로).

DefaultCookiePolicy.set_blocked_domains(blocked_domains)

  차단된 도메인 시퀀스를 설정합니다.

DefaultCookiePolicy.is_blocked(domain)

  domain이 쿠키 설정이나 수신에 대한 차단 목록에 있으면 `True`를 반환합니다.

DefaultCookiePolicy.allowed_domains()

  `None`, 또는 수락 도메인 시퀀스를 반환합니다 (튜플).

DefaultCookiePolicy.set_allowed_domains(allowed_domains)

  수락 도메인 시퀀스, 또는 `None`을 설정합니다.

DefaultCookiePolicy.is_not_allowed(domain)

  domain이 쿠키 설정이나 수신에 대한 수락 목록에 있으면 `True`를 반환합니다.

`DefaultCookiePolicy` 인스턴스에는 다음과 같은 어트리뷰트가 있습니다. 이 어트리뷰트들은 모두 같은 이름의 생성자 인자로 초기화되며, 모두 대입할 수 있습니다.

DefaultCookiePolicy.rfc2109_as_netscape

  참이면, `CookieJar` 인스턴스가 `Cookie` 인스턴스의 version 쿠키 어트리뷰트를 0으로 설정하여 RFC 2109 쿠키(즉, Set-Cookie 헤더에서 수신된 version 쿠키 어트리뷰트가 1인 쿠키)를 Netscape 쿠키로 다운 그레이드하도록 요청합니다. 기본값은 `None`입니다, 이 경우 RFC 2965 처리가 꺼졌을 때만 RFC 2109 쿠키가 다운 그레이드됩니다. 따라서, RFC 2109 쿠키는 기본적으로 다운 그레이드됩니다.

일반 엄격성 스위치:

DefaultCookiePolicy.strict_domain

  사이트가 `.co.uk`, `.gov.uk`, `.co.nz` 등의 국가 코드 최상위 도메인으로 2개의 구성 요소 도메인을 설정하는 것을 수락하지 않습니다. 이것은 완벽하지는 않으며 작동하지 않을 수도 있습니다!

RFC 2965 프로토콜 엄격성 스위치:

DefaultCookiePolicy.strict_rfc2965_unverifiable

  확인할 수 없는 트랜잭션(unverifiable transactions)에 대한 RFC 2965 규칙을 따릅니다 (일반적으로 확인할 수 없는 트랜잭션은 다른 사이트에서 호스팅 되는 이미지에 대한 리디렉션이나 요청으로 인한 결과입니다). 이것이 거짓이면, 확인 가능성에 기초하여 쿠키가 차단되지 않습니다.

넷스케이프 프로토콜 엄격성 스위치:

DefaultCookiePolicy.strict_ns_unverifiable

  Netscape 쿠키에도 확인할 수 없는 트랜잭션에 대한 RFC 2965 규칙을 적용합니다.

DefaultCookiePolicy.strict_ns_domain

  Netscape 쿠키에 대한 도메인 일치 규칙이 얼마나 엄격한지를 나타내는 플래그. 허용 가능한 값은 아래를 참조하십시오.

DefaultCookiePolicy.strict_ns_set_initial_dollar

  이름이 `'$'`로 시작하는 Set-Cookie: 헤더의 쿠키를 무시합니다.

DefaultCookiePolicy.strict_ns_set_path

  경로가 요청 URI와 경로 일치하지 않는 쿠키 설정을 수락하지 않습니다.

`strict_ns_domain`은 플래그 모음입니다. 그 값은 함께 or 하여 구성됩니다 (예를 들어, `DomainStrictNoDots|DomainStrictNonDomain` 은 두 플래그가 설정됨을 의미합니다).

DefaultCookiePolicy.DomainStrictNoDots

  쿠키를 설정할 때, ‘호스트 접두사’에는 점이 없어야 합니다 (예를 들어 `www.foo`에 점이 있어서, `www.foo.bar.com`이 `.bar.com`에 대한 쿠키를 설정할 수 없습니다).

DefaultCookiePolicy.DomainStrictNonDomain

  `domain` 쿠키 어트리뷰트를 명시적으로 지정하지 않은 쿠키는 쿠키를 설정한 도메인과 같은 도메인으로만 반환될 수 있습니다 (예를 들어 `spam.example.com`으로는 `domain` 쿠키 어트리뷰트가 없는 `example.com`의 쿠키를 반환하지 않습니다).

DefaultCookiePolicy.DomainRFC2965Match

  쿠키를 설정할 때, 전체 RFC 2965 도메인 일치가 필요합니다.

편의를 위해 다음 어트리뷰트가 제공되며, 위 플래그의 가장 유용한 조합입니다:

DefaultCookiePolicy.DomainLiberal

  0과 동등합니다 (즉, 위의 모든 Netscape 도메인 엄격성 플래그가 꺼집니다).

DefaultCookiePolicy.DomainStrict

  `DomainStrictNoDots|DomainStrictNonDomain` 과 동등합니다.

## Cookie 객체

`Cookie` 인스턴스는 다양한 쿠키 표준에 지정된 표준 쿠키 어트리뷰트에 대략 상응하는 파이썬 어트리뷰트를 갖습니다. 기본값을 지정하기 위한 복잡한 규칙이 있고, `max-age`와 `expires` 쿠키 어트리뷰트가 동등한 정보를 포함하고, RFC 2109 쿠키가 버전 1에서 버전 0 (Netscape) 쿠키로 `http.cookiejar`에 의해 ‘다운 그레이드’ 될 수 있기 때문에 대응은 일대일이 아닙니다.

`CookiePolicy` 메서드에서의 드문 경우를 제외하고 이러한 어트리뷰트에 대입할 필요는 없습니다. 이 클래스는 내부 일관성을 강요하지 않기 때문에, 그렇게 한다면 무엇을 하고 있는지 알아야 합니다.

Cookie.version

  정수나 `None`. Netscape 쿠키는 `version` 0을 갖습니다. RFC 2965와 RFC 2109 쿠키는 1의 `version` 쿠키 어트리뷰트를 갖습니다. 그러나, `http.cookiejar`는 RFC 2109 쿠키를 Netscape 쿠키로 ‘다운 그레이드’할 수 있으며, 이 경우 `version`은 0입니다.

Cookie.name

  쿠키 이름 (문자열).

Cookie.value

  쿠키값 (문자열), 또는 `None`.

Cookie.port

  포트나 포트 집합을 나타내는 문자열 (예를 들어 ‘80’이나 ‘80,8080’), 또는 `None`.

Cookie.domain

  쿠키 도메인 (문자열).

Cookie.path

  쿠키 경로 (문자열, 예를 들어 `'/acme/rocket_launchers'`).

Cookie.secure

  쿠키가 보안 연결을 통해서만 반환되어야 하면 `True`.

Cookie.expires

  에포크 이후의 초 단위 정수 만료 날짜, 또는 `None`. `is_expired()` 메서드도 참조하십시오.

Cookie.discard

  세션 쿠키이면 `True`.

Cookie.comment

  이 쿠키의 기능을 설명하는 서버의 문자열 주석, 또는 `None`.

Cookie.comment_url

  이 쿠키의 기능을 설명하는 서버의 주석에 대한 URL 링크, 또는 `None`.

Cookie.rfc2109

  이 쿠키가 RFC 2109 쿠키로 수신되었으면 (즉 쿠키가 Set-Cookie 헤더로 도착하고, 해당 헤더의 Version 쿠키 어트리뷰트 값이 1인 경우) `True`. `http.cookiejar`가 RFC 2109 쿠키를 Netscape 쿠키로 ‘다운 그레이드’할 수 있기 때문에 이 어트리뷰트가 제공됩니다. 이 경우 `version`은 0입니다.

Cookie.port_specified

  서버가 (Set-Cookie / Set-Cookie2 헤더에서) 포트나 포트 집합을 명시적으로 지정했으면 `True`.

Cookie.domain_specified

  서버가 도메인을 명시적으로 지정했으면 `True`.

Cookie.domain_initial_dot

  서버에서 명시적으로 지정한 도메인이 점(`'.'`)으로 시작하면 `True`.

쿠키에는 비표준 쿠키 어트리뷰트가 추가로 있을 수 있습니다. 다음 메서드를 사용하여 액세스 할 수 있습니다:

Cookie.has_nonstandard_attr(name)

  쿠키에 지정된 이름의 쿠키 어트리뷰트가 있으면 `True`를 반환합니다.

Cookie.get_nonstandard_attr(name, default=None)

  쿠키에 지정된 이름의 쿠키 어트리뷰트가 있으면, 그 값을 반환합니다. 그렇지 않으면 default를 반환합니다.

Cookie.set_nonstandard_attr(name, value)

  지정된 이름의 쿠키 어트리뷰트의 값을 설정합니다.

`Cookie` 클래스는 다음 메서드도 정의합니다:

Cookie.is_expired(now=None)

  쿠키에 대해 서버가 만료해야 한다고 요청한 시간이 지났으면 `True`. now가 제공되면 (에포크 이후의 초로), 쿠키가 지정된 시간에 만료되는지를 반환합니다.

## 예

첫 번째 예는 `http.cookiejar`의 가장 일반적인 사용법을 보여줍니다:

    import http.cookiejar, urllib.request
    cj = http.cookiejar.CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    r = opener.open("http://example.com/")

이 예는 Netscape, Mozilla 또는 Lynx 쿠키를 사용하여 URL을 여는 방법을 보여줍니다 (쿠키 파일의 위치에 대해서는 유닉스/Netscape 규칙을 가정합니다):

    import os, http.cookiejar, urllib.request
    cj = http.cookiejar.MozillaCookieJar()
    cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    r = opener.open("http://example.com/")

다음 예는 `DefaultCookiePolicy` 의 사용법을 보여줍니다. RFC 2965 쿠키를 켜고, Netscape 쿠키를 설정하고 반환할 때 도메인에 대해 더욱 엄격하며, 일부 도메인이 쿠키를 설정하거나 쿠키를 반환하지 못하도록 차단합니다:

    import urllib.request
    from http.cookiejar import CookieJar, DefaultCookiePolicy
    policy = DefaultCookiePolicy(
        rfc2965=True, strict_ns_domain=Policy.DomainStrict,
        blocked_domains=["ads.net", ".ads.net"])
    cj = CookieJar(policy)
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    r = opener.open("http://example.com/")