web協議之Cookie

Cookie 是什麼

RFC6256,HTTP State Management Mechanism
保存在客戶端、由瀏覽器維護、表示應用的HTTP頭部
  • 存放在內存或者磁盤中
  • 服務器生成Cookie在響應中經過Set-Cookie頭部告知客戶端(容許多個Set-Cookie頭部傳遞多個值)
  • 客戶端獲得Cookie後,後續請求都會自動將Cookie頭部攜帶至請求中
CookieSet-Cookie 頭部的定義
  • Cookie頭部中能夠存放多個 name/value 名值對瀏覽器

    • Cookie:cookie-name=cookie-value;cookie-name=cookie-value;
  • Set-Cookie頭部一次只能傳遞1個name/value名值對,可是響應中能夠含多個頭部Set-Cookie安全

    • Set-Cookie:cooke-name=cookie-value;cookie-av
    • Set-Cookie:cooke-name=cookie-value;cookie-av;cookie-av
    • Set-Cookie:cooke-name=cookie-value;cookie-av;cookie-av
  • cookie-av,cookie 描述的可選屬性,好比到期時間、所屬域名,所在路徑等
Cookie 描述屬性
  • expires:cookie 到期時間
  • max-age:cookie存活秒數。(比expires優先級更高)
  • domain:cookie可用於哪些域名。默承認以訪問當前域名
  • path:指定 path 路徑下才能使用 cookie
  • secure:只用使用 TLS/SSL協議(https)時才能使用cookie
  • httponly:不能使用JavaScript (Document.cookie、XMLHttpRequest、Request APIs)訪問到cookie
獲取百度返回的cookie
import requests

url = "https://www.baidu.com/"
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    'Host': "www.baidu.com",

}
response = requests.get(url, headers=headers)
cookies_jar = response.cookies
cookies = dict(cookies_jar)
print(cookies_jar)
print(cookies)

# 獲得結果
# <RequestsCookieJar[<Cookie BAIDUID=77BB8AC6AD49976703A431DD42C26C9E:FG=1 for .baidu.com/>, <Cookie BAIDUID_BFESS=77BB8AC6AD49976707A3990E04310903:FG=1 for .baidu.com/>, <Cookie BIDUPSID=77BB8AC6AD49976707A3990E04310903 for .baidu.com/>, <Cookie H_PS_PSSID=1440_33046_33059_31253_33099_33101_32958_26350 for .baidu.com/>, <Cookie PSTM=1606203000 for .baidu.com/>, <Cookie BDSVRTM=0 for www.baidu.com/>, <Cookie BD_HOME=1 for www.baidu.com/>]>
# {'BAIDUID': '77BB8AC6AD49976703A431DD42C26C9E:FG=1', 'BAIDUID_BFESS': '77BB8AC6AD49976707A3990E04310903:FG=1', 'BIDUPSID': '77BB8AC6AD49976707A3990E04310903', 'H_PS_PSSID': '1440_33046_33059_31253_33099_33101_32958_26350', 'PSTM': '1606203000', 'BDSVRTM': '0', 'BD_HOME': '1'}

Cookie 使用的限制

  • RFC 規範對瀏覽器使用 Cookie 的要求服務器

    • 每條 Cookie 的長度(包括name、value以及描述的屬性等總長度)至少能支持4kb
    • 每一個域名下至少支持 50Cookie
    • 至少要支持 3000Cookie
  • 代理服務器傳遞 Cookie 時會有限制
  • Cookie 會被附加在每一個 HTTP 請求中,因此無形中增長了流量
  • 因爲在 HTTP 請求中的 Cookie 是明文傳遞的,因此安全性成問題(除非用https)
  • Cookie 的大小不該超過4kb,故對於複雜的存儲需求來講是不夠用的。
相關文章
相關標籤/搜索