cookies

cookie和session

無狀態的http協議python

2019-11-01_17-14-32

  • 如上圖所示,HTTP協議 是無狀態的協議,用戶瀏覽服務器上的內容,只須要發送頁面請求,服務器返回內容。對於服務器來講,並不關心,也並不知道是哪一個用戶的請求。對於通常瀏覽性的網頁來講,沒有任何問題。ajax

  • 可是,如今不少的網站,是須要用戶登陸的。以淘寶爲例:好比說某個用戶想購買一個產品,當點擊 「 購買按鈕 」 時,因爲HTTP協議 是無狀態的,那對於淘寶來講,就不知道是哪一個用戶操做的。
  • 爲了實現這種用戶標記,服務器就採用了cookie這種機制來識別具體是哪個用戶的訪問。數據庫

2019-11-01_17-15-32

  • 如圖,爲了實現用戶標記,在Http無狀態請求的基礎之上,咱們須要在請求中攜帶一些用戶信息(好比用戶名之類,這些信息是服務器發送到本地瀏覽器的,可是服務器並不存儲這些信息),這就是cookie機制。瀏覽器

  • 須要注意的是:cookie信息是保存在本地瀏覽器裏面的,服務器上並不存儲相關的信息。 在發送請求時,cookie的這些內容是放在 Http協議中的header 字段中進行傳輸的。安全

  • 幾乎如今全部的網站都會發送一些 cookie信息過來,當用戶請求中攜帶了cookie信息,服務器就能夠知道是哪一個用戶的訪問了,從而不須要再使用帳戶和密碼登陸。服務器

  • 可是,剛纔也提到了,cookie信息是直接放在Http協議的header中進行傳輸的,看得出來,這是個隱患!一旦別人獲取到你的cookie信息(截獲請求,或者使用你的電腦),那麼他很容易從cookie中分析出你的用戶名和密碼。爲了解決這個隱患,因此有了session機制。cookie

瞭解sessionsession

- 剛纔提到了cookie不安全,因此有了session機制。簡單來講(每一個框架都不同,這只是舉一個通用的實現策略),整過過程是這樣:框架

  • 服務器根據用戶名和密碼,生成一個session ID,存儲到服務器的數據庫中。
  • 用戶登陸訪問時,服務器會將對應的session ID發送給用戶(本地瀏覽器)。
  • 瀏覽器會將這個session ID存儲到cookie中,做爲一個鍵值項。
  • 之後,瀏覽器每次請求,就會將含有session ID的cookie信息,一塊兒發送給服務器。
  • 服務器收到請求以後,經過cookie中的session ID,到數據庫中去查詢,解析出對應的用戶名,就知道是哪一個用戶的請求了。
總結

- cookie 在客戶端(本地瀏覽器),session 在服務器端。cookie是一種瀏覽器本地存儲機制。存儲在本地瀏覽器中,和服務器沒有關係。每次請求,用戶會帶上本地cookie的信息。這些cookie信息也是服務器以前發送給瀏覽器的,或者是用戶以前填寫的一些信息。

- Cookie有不安全機制。 你不能把全部的用戶信息都存在本地,一旦被別人竊取,就知道你的用戶名和密碼,就會很危險。因此引入了session機制。

- 服務器在發送id時引入了一種session的機制,很簡單,就是根據用戶名和密碼,生成了一段隨機的字符串,這段字符串是有過時時間的。

- 必定要注意:session是服務器生成的,存儲在服務器的數據庫或者文件中,而後把sessionID發送給用戶,用戶存儲在本地cookie中。每次請求時,把這個session ID帶給服務器,服務器根據session ID到數據庫中去查詢,找到是哪一個用戶,就能夠對用戶進行標記了。

- session 的運行依賴 session ID,而 session ID 是存在 cookie 中的,也就是說,若是瀏覽器禁用了 cookie ,那麼同時 session 也會失效(可是能夠經過其它方式實現,好比在url中傳遞 session ID)

- 用戶驗證這種場合通常會用 session。 所以,維持一個會話的核心就是客戶端的惟一標識,即session ID
import requests
post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20191051845626'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
}
session = requests.session()
#建立一個session對象,該對象會自動將請求中的cookie進行存儲和攜帶
formdata = {
    'email': '15072296340',
    'password':''
}

session.post(url=post_url,data=formdata,headers=headers)
#使用session發送請求,目的是爲了將session保存該次請求中的cookies
get_url = 'http://www.renren.com/256450404/profile?ref=hotnewsfeed&sfet=709&fin=0&fid=28283295275&ff_id=256450404&platform=10&expose_time=1572602798'
#再次使用session進行請求的發送,該請求中已經攜帶了cookies
res = session.get(url=get_url,headers=headers).text
相關文章
相關標籤/搜索