這篇文章主要介紹“Node學習之聊聊Cookie-Session登錄驗證的工作原理”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Node學習之聊聊Cookie-Session登錄驗證的工作原理”文章能幫助大家解決問題。
目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、略陽網(wǎng)站維護等服務(wù),公司將堅持客戶導向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
我們知道,HTTP 是無狀態(tài)的。也就是說,HTTP 請求方和響應(yīng)方間無法維護狀態(tài),都是一次性的,它不知道前后的請求都發(fā)生了什么。但有的場景下,我們需要維護狀態(tài)。最典型的,一個用戶登陸微博,發(fā)布、關(guān)注、評論,都應(yīng)是在登錄后的用戶狀態(tài)下的。
這個時候就可以引入Cookie
與Session
來保存用戶的登錄狀態(tài)。
Cookie
是存放在瀏覽器中的,可以在瀏覽器中打開控制臺
,選擇應(yīng)用
,找到存儲
中的Cookie
進行查看:
當客戶端向服務(wù)端發(fā)送網(wǎng)絡(luò)請求時瀏覽器會自動將Cookie
添加到請求頭中,這樣服務(wù)端就能獲取這個Cookie
,如下:
知道了這個原理后,我們就可以想到,如果在用戶登錄系統(tǒng)時:客戶端由用戶的部分登錄信息(比如username
、id
等)生成一個Cookie
存放到瀏覽器中,那么在這之后的每一次網(wǎng)絡(luò)請求都會自動攜帶上該Cookie
。
之后讓服務(wù)端根據(jù)請求中是否攜帶Cookie
并且攜帶的Cookie
中是否存在有效的username
、id
來判斷用戶是否已經(jīng)登錄過了,這樣一來用戶的登錄狀態(tài)不就被保存下來了嗎。
回到上面我們提到的微博的例子,按照這種過程來說,當用戶登錄過后Cookie
已經(jīng)被保存,這時當用戶進行發(fā)布、關(guān)注、評論等需要登錄才能使用的操作時我們就能提前判斷是否存在Cookie
,如果存在并且Cookie
中含有該用戶的id
,那么我們就可以允許該用戶的這些操作(這些操作一般都是需要用戶的id
的,這時就可以從Cookie
中進行獲?。O喾吹?,如果Cookie
不存在或者Cookie
無效,那么就禁止該用戶的這些操作。
說到這,你可能會問:既然一個Cookie
就能實現(xiàn)我們想要的效果,那為何還要使用Session
呢?
這是因為 Cookie
很容易被偽造! ,如果我們知道了Cookie
中存放的信息是username
和id
(就算不知道,也可以在登錄后的網(wǎng)絡(luò)請求的請求體中找到Cookie
),那么我們完全可以在不登錄的情況下手動向瀏覽器存儲一個偽造的Cookie
:
說到這,你應(yīng)該就能明白為什么不能單獨使用Cookie
了吧。
Session
其實是基于Cookie
實現(xiàn)的,并且Session
存儲在服務(wù)端的內(nèi)存或者數(shù)據(jù)庫中。
當用戶登錄成功時,使用Cookie&Session
的登錄驗證會進行以下操作:
由服務(wù)端生成Session
與SessionId
;
Session
一般是根據(jù)用戶登錄的信息,如用戶名、id
等進行生成。
如果把Session
比作是一把鎖,那么SessionId
就相當于是這把鎖的鑰匙。
服務(wù)端將Session
存儲到內(nèi)存或者數(shù)據(jù)庫中;
服務(wù)端將SessionId
存放到請求的響應(yīng)頭(response
對象)中的Set-Cookie
字段中發(fā)送給客戶端;
客戶端收到Set-Cookie
后會自動將Set-Cookie
的值(也就是SessionId
)存放到Cookie
中;
之后的每次網(wǎng)絡(luò)請求都會自動帶上Cookie
,也就是帶上這個SessionId
;
服務(wù)端收到后續(xù)請求時獲取請求上的Cookie
,也就是獲取到了SessionId
,然后通過SessionId
查詢并校驗服務(wù)端存儲的Session
,若校驗成功說明這個SessionId
有效則通過此次請求,反之則阻止此次請求。
圖示:
為了保存用戶的登錄狀態(tài),我們需要為每一位登錄的用戶生成并存儲Session
,這勢必就會造成以下問題:
如果Session
存放到內(nèi)存中,那么當服務(wù)端重啟時,這些內(nèi)存中的Session
都將被清除,那么所有用戶的登錄狀態(tài)都將會過期,并且當用戶量較大時,過多的內(nèi)存占用也勢必會影響服務(wù)端的性能。
如果Session
存放到數(shù)據(jù)庫中,雖然能夠解決因服務(wù)端重啟造成用戶登錄狀態(tài)過期的問題,但當用戶量較大時,對于這個數(shù)據(jù)庫的維護也會變得相對困難。
如果前端頁面中調(diào)用的接口來自兩個服務(wù)器(也就是兩套數(shù)據(jù)庫),為了實現(xiàn)Session
在兩個服務(wù)器間共享通常會將Session
存放到一個單獨的數(shù)據(jù)庫中,這樣就使得整個項目變得更為復(fù)雜也更加難以維護。
CSRF全稱為 Cross-site request forgery 即 跨站請求偽造,使用Cookie
進行驗證的網(wǎng)站都會面臨或大或小的CSRF
威脅,我們以一個銀行網(wǎng)站的例子來介紹CSRF的攻擊原理:
假如一家銀行網(wǎng)站A
的登錄驗證采用的是Cookie&Session
,并且該網(wǎng)站上用以運行轉(zhuǎn)賬操作的Api地址
為:http://www.grillbankapi.com/?account=AccoutName&amount=1000
api
參數(shù):account
代表賬戶名,amount
代表轉(zhuǎn)賬金額。
那么,一個惡意攻擊者可以在另一個網(wǎng)站B
上放置如下代碼:
<img src="http://www.grillbankapi.com/?account=Ailjx&amount=1000">
注意:
img
標簽的src
是網(wǎng)站A
轉(zhuǎn)賬操作的api地址
,并且參數(shù)account
為Ailjx,amount
為1000,也就是說這個api地址
相當于是賬戶名為 Ailjx 轉(zhuǎn)賬1000 時調(diào)用的api
。
如果有賬戶名為 Ailjx 的用戶剛訪問過網(wǎng)站A
不久,登錄信息尚未過期(網(wǎng)站A
的Cookie
存在且有效)。
那么當 Ailjx 訪問了這個惡意網(wǎng)站B
時,上面的img
標簽將被加載,瀏覽器就會自動請求img
標簽的src
路由,也就是請求http://www.grillbankapi.com/?account=Ailjx&amount=1000
(我們將這個請求記為請求Q
),并且因為Cookie
存放在瀏覽器中且瀏覽器發(fā)送請求時會自動帶上Cookie
,所以請求Q
上就會自動攜帶 Ailjx 在網(wǎng)站A
上的Cookie
憑證,結(jié)果就是這個 請求Q
將會被通過,那么 Ailjx 就會損失1000資金。
這種惡意的網(wǎng)址可以有很多種形式,藏身于網(wǎng)頁中的許多地方。 此外,攻擊者也不需要控制放置惡意網(wǎng)址的網(wǎng)站。例如他可以將這種地址藏在論壇,博客等任何用戶生成內(nèi)容的網(wǎng)站中。這意味著如果服務(wù)端沒有合適的防御措施的話,用戶即使訪問熟悉的可信網(wǎng)站也有受攻擊的危險。
透過例子能夠看出,攻擊者并不能通過CSRF攻擊來直接獲取用戶的賬戶控制權(quán),也不能直接竊取用戶的任何信息。他們能做到的,是欺騙用戶瀏覽器,讓其以用戶的名義運行操作。
這些就是使用Cookie&Session
來做登錄驗證的問題所在,那么我們?nèi)绾谓鉀Q這些問題呢?這就需要引入JWT的概念,使用token
來做登錄驗證,這些我們將在之后的文章中進行講解。
關(guān)于“Node學習之聊聊Cookie-Session登錄驗證的工作原理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
當前題目:Node之Cookie-Session登錄驗證的工作原理是什么
網(wǎng)頁URL:http://muchs.cn/article36/pipcpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、云服務(wù)器、面包屑導航、外貿(mào)建站、手機網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)