搜尋
首頁後端開發Python教學一文徹底了解cookie、session、token

一文徹底了解cookie、session、token

發展史

#1、很久很久以前,Web 基本上就是文件的瀏覽而已, 既然是瀏覽,作為伺服器, 不需要記錄誰在某一段時間都瀏覽了什麼文檔,每次請求都是一個新的HTTP協議, 就是請求加響應, 尤其是我不用記住是誰剛剛發了HTTP請求, 每個請求對我來說都是全新的。這段時間很嗨皮。

2、但是隨著互動式Web應用程式的興起,像線上購物網站,需要登入的網站等等,馬上就面臨一個問題,那就是要管理會話,必須記住哪些人登入系統,哪些人往自己的購物車中放商品, 也就是說我必須把每個人區分開,這就是一個不小的挑戰,因為HTTP請求是無狀態的,所以想出的辦法就是給大家發一個會話標識(session id), 說白了就是一個隨機的字符串,每個人收到的都不一樣, 每次大家向我發起HTTP請求的時候,把這個字符串給一並捎過來, 這樣我就能區分開誰是誰了

3、這樣大家很嗨皮了,可是伺服器就不嗨皮了,每個人只需要保存自己的session id,而伺服器要保存所有人的session id !如果訪問伺服器多了, 就得有成千上萬,甚至幾十萬個。

這對伺服器說是一個巨大的開銷, 嚴重的限制了伺服器擴展能力, 例如我用兩個機器組成了一個集群, 小F透過機器A登入了系統, 那session id會保存在機器A上, 假設小F的下一個請求被轉送到機器B怎麼辦?機器B可沒有小F的 session id啊。

有時候會採用一點小伎倆: session sticky , 就是讓小F的請求一直粘連在機器A上, 但是這也不管用, 要是機器A掛掉了, 還得轉到機器B去。

那隻要做session 的複製了, 把session id 在兩台機器之間搬來搬去, 快累死了。

一文徹底了解cookie、session、token

後來有個叫Memcached的支了招:把session id 集中儲存到一個地方, 所有的機器都來存取這個地方的數據, 這樣一來,就不用複製了, 但是增加了單點失敗的可能性, 要是那個負責session 的機器掛了, 所有人都得重新登入一遍, 估計得被人罵死。

一文徹底了解cookie、session、token

也試著把這個單點的機器也搞出集群,增加可靠性, 但不管如何, 這小小的session 對我來說是一個沉重的負擔。

4、於是有人就一直在思考, 我為什麼要保存這可惡的session呢, 只讓每個客戶端去保存該有多好?

可是如果不儲存這些session id , 怎麼驗證客戶端寄給我的session id 的確是我產生的呢?如果不去驗證,我們都不知道他們是不是合法登入的用戶, 那些不懷好意的傢伙們就可以偽造session id , 為所欲為。

嗯,對了,關鍵點就是驗證 !

比如說,小F 已經登入了系統, 我給他發一個令牌(token), 裡邊包含了小F的user id, 下一次小F 再次透過Http 請求訪問我的時候, 把這個token 透過Http header 帶過來不就可以了。

不過這和session id沒有本質差別啊, 任何人都可以可以偽造, 所以我得想點兒辦法, 讓別人偽造不了。

那就對資料做一個簽名吧, 比如說我用HMAC-SHA256 演算法,加上一個只有我才知道的金鑰, 對資料做一個簽名, 把這個簽章和資料一起當作token ,由於金鑰別人不知道, 就無法偽造token了。

一文徹底了解cookie、session、token

相關推薦:《Python影片教學

這個token 我不保存, 當小F把這個token 給我發過來的時候,我再用同樣的HMAC-SHA256 演算法和同樣的金鑰,對資料再計算一次簽名, 和token 中的簽名做個比較, 如果相同, 我就知道小F已經登入過了,並且可以直接取到小F的user id , 如果不相同, 資料部分肯定被人竄改過, 我就告訴發送者:對不起,沒有認證。

一文徹底了解cookie、session、token

Token 中的資料是明文保存的(雖然我會用Base64做下編碼, 但那不是加密), 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感資訊。

當然, 如果一個人的token 被別人偷走了, 那我也沒辦法, 我也會認為小偷就是合法用戶, 這其實和一個人的session id 被別人偷走是一樣的。

這樣一來, 我就不保存session id 了, 我只是生成token , 然後驗證token , 我用我的CPU計算時間獲取了我的session存儲空間 !

解除了session id這個負擔, 可以說是無事一身輕, 我的機器集群現在可以輕鬆地做水平擴展, 用戶訪問量增大, 直接加機器就行。這種無狀態的感覺實在太好了!

Cookie

cookie 是一個非常具體的東西,指的就是瀏覽器裡面能永久儲存的一種數據,只是瀏覽器實現的一種數據儲存功能。

cookie由伺服器生成,傳送給瀏覽器,瀏覽器把cookie以kv形式儲存到某個目錄下的文字檔案內,下次要求同一網站時會把該cookie傳送給伺服器。由於cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會佔據太多磁碟空間,所以每個網域的cookie數量是有限的。

Session

session 從字面上講,就是會話。這類似於你和一個人交談,你怎麼知道目前和你交談的是張三而不是李四呢?對方肯定有某種特徵(長相等)表示他就是張三。

session 也是類似的道理,伺服器要知道目前發送請求給自己的是誰。為了做這種區分,伺服器就要給每個客戶端分配不同的“身份標識”,然後客戶端每次向伺服器發送請求的時候,都帶上這個“身份標識”,伺服器就知道這個請求來自於誰了。至於客戶端怎麼保存這個“身份標識”,可以有很多種方式,對於瀏覽器客戶端,大家都默認採用 cookie 的方式。

伺服器使用session把使用者的資訊暫時保存在了伺服器上,使用者離開網站後session會被銷毀。這種使用者資訊儲存方式相對cookie來說比較安全,可是session有一個缺陷:如果web伺服器做了負載平衡,那麼下一個操作請求到了另一台伺服器的時候session會遺失。

Token

在Web領域基於Token的驗證隨處可見。在大多數使用Web API的網路公司中,tokens 是多用戶下處理認證的最佳方式。

以下幾點特性會讓你在程式中使用基於Token的身份驗證:

(1)無狀態、可擴展

(2)支援行動裝置

(3)跨程式呼叫

(4)安全性

那些使用基於Token的身份驗證的大佬們,大部分你見過的API和Web應用都使用tokens。例如Facebook, Twitter, Google , GitHub等。

Token的起源

在介紹基於Token的身份驗證的原則與優勢之前,不妨先看看之前的認證都是怎麼做的。

基於伺服器的驗證

我們都是知道HTTP協定是無狀態的,這種無狀態意味著程式需要驗證每一次請求,從而辨別客戶端的身份。

在這之前,程式都是透過在服務端儲存的登入資訊來辨別要求的。這種方式一般都是透過儲存Session來完成。

隨著Web,應用程序,已經移動端的興起,這種驗證的方式逐漸暴露出了問題。尤其是在可擴展性方面。

基於伺服器驗證方式暴露的一些問題

(1)Session:每次認證使用者發起請求時,伺服器需要去建立一個記錄來儲存資訊。當越來越多的用戶發送請求時,記憶體的開銷也會不斷增加。

(2)可擴展性:在服務端的記憶體中使用Session儲存登入訊息,伴隨而來的是可擴展性問題。

(3)CORS(跨域資源共享):當我們需要讓資料跨多台行動裝置上使用時,跨域資源的共享會是一個令人頭痛的問題。在使用Ajax抓取另一個網域的資源,就可以會出現禁止請求的情況。

(4)CSRF(跨站請求偽造):使用者在造訪銀行網站時,他們很容易受到跨站請求偽造的攻擊,並且能夠被利用其訪問其他的網站。

在這些問題中,可擴展性是最突出的。因此我們有必要去尋求一種更有行之有效的方法。

基於Token的驗證原理

基於Token的身份驗證是無狀態的,我們不將使用者資訊存在伺服器或Session中。

這個概念解決了在服務端儲存資訊時的許多問題:

NoSession意味著你的程式可以根據需要去增減機器,而不用去擔心使用者是否登入。

基於Token的身份驗證的過程如下:

(1)使用者透過使用者名稱和密碼發送請求。

(2)程式驗證。

(3)程式傳回一個簽署的token 給客戶端。

(4)客戶端儲存token,並且每次用於每次發送請求。

(5)服務端驗證token並傳回資料。

每一次要求都需要token。 token應該在HTTP的頭部發送從而保證了Http請求無狀態。我們同樣透過設定伺服器屬性Access-Control-Allow-Origin:* ,讓伺服器能接受到來自所有網域的請求。

要注意的是,在ACAO頭標明(designating)*時,不得附有像HTTP認證,客戶端SSL憑證和cookies的憑證。

實現想法:

一文徹底了解cookie、session、token

(1)使用者登入校驗,校驗成功後就回傳Token給客戶端。

(2)客戶端收到資料後保存在客戶端。

(3)客戶端每次存取API時攜帶Token到伺服器端。

(4)伺服器端採用filter過濾器校驗。校驗成功則傳回請求數據,校驗失敗則傳回錯誤碼。當我們在程式中認證了資訊並取得token之後,我們便能透過這個Token做許多的事情。我們甚至能基於創建一個基於權限的token傳給第三方應用程序,這些第三方程序能夠獲取到我們的數據(當然只有在我們允許的特定的token)。

Tokens的優勢

#無狀態、可擴展

在客戶端儲存的Tokens是無狀態的,並且能夠被擴展。基於這種無狀態和不儲存Session訊息,負載負載平衡器能夠將使用者資訊從一個服務傳送到其他伺服器。

如果我們將已驗證的使用者的資訊保存在Session中,則每次請求都需要使用者向已驗證的伺服器發送驗證資訊(稱為Session親和性)。用戶量大時,可能會造成一些擁擠。

但不要急。使用tokens之後這些問題都迎刃而解,因為tokens自己hold住了使用者的驗證資訊。

安全性

請求中發送token而不再是發送cookie能夠防止CSRF(跨站請求偽造)。即使在客戶端使用cookie儲存token,cookie也只是一個儲存機製而不是用於認證。不將資訊儲存在Session中,讓我們少了對session操作。

token是有時效的,一段時間之後使用者需要重新驗證。我們也不一定需要等到token自動失效,token有撤回的操作,透過token revocataion可以使一個特定的token或是一組有相同認證的token無效。

可擴充性

tokens能夠建立與其它程式共用權限的程式。例如,能將一個隨便的社交帳號和自己的大號(Fackbook或是Twitter)連結起來。當透過服務登入Twitter(我們將這個過程Buffer)時,我們可以將這些Buffer附到Twitter的資料流上(we are allowing Buffer to post to our Twitter stream)。

使用tokens時,可以提供可選的權限給第三方應用程式。當使用者想要讓另一個應用程式存取它們的數據,我們可以透過建立自己的API,得出特殊權限的tokens。

多平台跨域

我們提前先來談論CORS(跨域資源共享),對應用程式和服務進行擴展的時候,需要介入各種各種的設備和應用程式。

Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates 
the issues that CORS brings up after we set a quick header configuration for our application.

#只要使用者有一個通過了驗證的token,資料和資源就能夠在任何網域上被要求到。

Access-Control-Allow-Origin: *

基於標準創建token的時候,你可以設定一些選項。我們在後續的文章中會進行更詳盡的描述,但是標準的用法會在JSON Web Tokens體現。

最近的程式和文件是供給JSON Web Tokens的。它支援眾多的語言。這意味著在未來的使用中你可以真正的轉換你的認證機制。

以上是一文徹底了解cookie、session、token的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:简书。如有侵權,請聯絡admin@php.cn刪除
Python:自動化,腳本和任務管理Python:自動化,腳本和任務管理Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python和時間:充分利用您的學習時間Python和時間:充分利用您的學習時間Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),