日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

面試必問:session,cookie與session區(qū)別( 二 )


搞不懂Session、Cookie、Token有何關(guān)系和區(qū)別?
前段時間,剛好大致的了解過這三者的區(qū)別 。為了方便理解,我們可以從傳統(tǒng)的Session到Token的身份驗證演變過程,來理解Session、Cookie、Token之間的關(guān)系 。很久很久以前,Web應(yīng)用基本用于文檔的瀏覽,例如,網(wǎng)絡(luò)黃頁 。既然是瀏覽,服務(wù)器也就不需要去記錄具體用戶在哪段時間里瀏覽了哪些文檔,每一次請求都是一個新的HTTP協(xié)議,對服務(wù)器來說都是全新的,這時候沒有Session、Cookie、Token 。
基于Session的身份驗證隨著交互式Web應(yīng)用的發(fā)展,比如,像購物等需要用戶登錄的網(wǎng)站 。引出了一個問題,那就是網(wǎng)站需要記錄哪些用戶登錄了系統(tǒng)進(jìn)行了哪些操作,即要進(jìn)行管理會話(什么是會話?簡單的講如果用戶需要登錄,那么就可以簡單的理解為會話,如果不需要登錄,那么就是簡單的連接 。),比如,不同用戶將不同商品加入到自己的購物車中, 也就是說必須將每個用戶區(qū)分開 。
但因為HTTP請求是無狀態(tài)的,所以想出了一個解決辦法,那就是給每個用戶發(fā)一個會話標(biāo)識(Session id),簡單的說就是給每個用戶發(fā)一個既不重復(fù),又不容易被找到規(guī)律進(jìn)行仿造的隨機(jī)字符串,以使每個用戶收到的會話標(biāo)識都不一樣 。這樣每次用戶從客戶端向服務(wù)端發(fā)起HTTP請求的時候,把這個字符串給一起發(fā)送過來, 服務(wù)端就可以區(qū)分開誰是誰了 。
那么客戶端(瀏覽器)如何保存這個“身份標(biāo)識”的呢?,一般默認(rèn)采用 Cookie(存儲在瀏覽器目錄中的文本文件) 的方式,這個會話標(biāo)識(Session id)會存在客戶端的Cookie中 。雖然上面的方法解決了區(qū)分用戶的問題,但同時也引入了一個新的問題,那就是每個用戶(客戶端)只需要保存自己的會話標(biāo)識(Session id),而服務(wù)端則要保存所有用戶的會話標(biāo)識(Session id) 。
當(dāng)訪問服務(wù)端的用戶逐漸變多,服務(wù)端那就需要存儲成千上萬,甚至幾千萬個,這對服務(wù)器說是一個難以接受的開銷。我們再舉一個簡單的例子,假如服務(wù)端是由2臺服務(wù)器組成的一個集群, 小明通過服務(wù)器A登錄了系統(tǒng), 那 Session id會保存在服務(wù)器A上, 假設(shè)小明的下一次請求被轉(zhuǎn)發(fā)到服務(wù)器B怎么辦? 服務(wù)器B可沒有小明 的 Session id 。
可能會有人講,如果使小明登錄時,始終在服務(wù)器A上進(jìn)行登錄(sticky session),豈不解決了這個問題?那如果服務(wù)器A掛掉怎么辦呢? 還是會將小明的請求轉(zhuǎn)發(fā)到服務(wù)器B上,問題仍然存在 。如此一來,那只能做集群間的 Session 復(fù)制共享了, 就是把 Session id 在兩個機(jī)器之間進(jìn)行復(fù)制,如下圖,但這又對服務(wù)器的性能和內(nèi)存提出了巨大的挑戰(zhàn) 。
因此,又想到如果將所有用戶的Session集中存儲呢,也就想到了緩存服務(wù)Memcached——由于 Memcached 是分布式的內(nèi)存對象緩存系統(tǒng),因此可以用來實現(xiàn) Session 同步 。把Session id 集中存儲到一臺服務(wù)器上, 所有的服務(wù)器都來訪問這個地方的數(shù)據(jù), 如此就避免了復(fù)制的方式, 但是這種“集萬千寵愛于一身”使得又出現(xiàn)了單點故障的可能, 就是說這個負(fù)責(zé)存儲 Session 的服務(wù)器掛了, 所有用戶都得重新登錄一遍, 這是用戶難以接受的 。
那么索性將存儲Session的服務(wù)器也設(shè)計為集群,增加可靠性,避免單點故障,但無論如何,Session 引發(fā)出來的問題似乎層出不窮 。于是有人開始思考, 為什么服務(wù)端必須要保存 Session呢, 只讓每個客戶端去保存不行嗎?可是服務(wù)端如果不保存這些Session id ,又將如何驗證客戶端發(fā)送的 Session id 的確是服務(wù)端生成的呢? 如果不驗證,服務(wù)端無法判斷是否是合法登錄的用戶,對,這里的問題是驗證, session 只是解決這個驗證問題的而產(chǎn)生的一個解決方案,是否還有其它方案呢?——于是,引出了基于Token 的身份驗證 。

推薦閱讀