導語:
在web開發中,總是有看到cookie還有session這兩個東西,那么它們到底有什么用,這一篇詳細告訴你,
因為http協議是無狀態的,每次的請求訪問都是獨立的,沒辦法追蹤到上一次訪問的狀態,后端就無法知道這次的訪問是哪位,所以就要一些技術來幫助后臺辨別這次的請求是誰,而這兩者Cookie與Session都是Web程式中常用的技術,用來跟蹤用戶的整個會話,
- Cookie通過在客戶端記錄資訊確定用戶身份,(相當于你有一張身份證,跟后端交流前要拿出身份證給后端看一看,然后后端才能確認你的身份,)
- Session通過在服務器端記錄資訊確定用戶身份,(你不用身份證,你只要說出自己的名字,然后后端在它們用戶簿上找一找有沒有你的名字,最終確認你的身份,)
了解了它們的大概后,我們現在深入了解它們吧,以及了解什么情況使用session或者cookie,
深入理解cookie和session
- 一,session
- 1,session簡介
- 2,session是怎么運行的
- 3,session實作登陸
- 4,Session的生命周期
- 5,Session常用方法
- 6,如何解決session存放在后端,記憶體溢位,或者后臺多行程間記憶體不共享問題,
- 二,cookie
- 1,Cookie簡介
- 2,Cookie的不可跨域名性
- 3,cookie安全性
- 4,cookie的效率
一,session
1,session簡介
Session是服務器端使用的一種記錄客戶端狀態的方法,雖然簡單而且安全一些,但是會把用戶資訊存放在后端的記憶體中,導致記憶體變大,可能會導致溢位(后文會講到解決方法),
2,session是怎么運行的
當你開始跟后端聯系的時候,后端就會根據你的情況給你分配一個sessionid(唯一),這個sessionid就會存放在cookie中,而且cookie中只需要存放這個資訊就行了,后端設定這個sessionid存在的最長時間,時間到了自然這個sessionid就消失了,同時后端中的相應記憶體也會釋放,
有了這個sessionid后,每次跟后臺交流,都會拿著這個id去校驗一下,確保后端明白你的身份,身份確認后,就可以開始交流了,
3,session實作登陸
const session = require('koa-generic-session')
app.keys = ['xiaomizhou123_']
app.use(session({
//配置cookie
cookie: {
path: '/',
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000 //存在的最長時間
},
//配置redis
store: redisStore({
all: '127.0.0.1:6379' //寫死本地redis
})
}))
//登陸后session中就會有你的資訊,每次跟后端的交流前都要驗證你的身份,并且更新最后交流時間,只有當session過期了,你跟后端的會話才要重新登陸,
4,Session的生命周期
Session保存在服務器端,為了獲得更高的存取速度,服務器一般把Session放在記憶體里,每個用戶都會有一個獨立的Session,如果Session內容過于復雜,當大量客戶訪問服務器時可能會導致記憶體溢位,因此,Session里的資訊應該盡量精簡,
Session在用戶第一次訪問服務器的時候自動創建,
Session生成后,只要用戶繼續訪問,服務器就會更新Session的最后訪問時間,并維護該Session,用戶每訪問服務器一次,無論是否讀寫Session,服務器都認為該用戶的Session“活躍(active)”了一次,
5,Session常用方法
- secret:一個String型別的字串,作為服務器端生成session的簽名,
- name:回傳客戶端的key的名稱,默認為connect.sid,也可以自己設定,
- resave:(是否允許)當客戶端并行發送多個請求時,其中一個請求在另一個請求結束時對session進行修改覆寫并保存, 默認為true,但是(后續版本)有可能默認失效,所以最好手動添加,
- saveUninitialized:初始化session時是否保存到存盤,默認為true,但是(后續版本)有可能默認失效,所以最好手動添加,
- cookie:設定回傳到前端key的屬性,默認值為
{ path: '/', httpOnly: true, secure: false,maxAge: null }, - Session.destroy():洗掉session,當檢測到客戶端關閉時呼叫,
- Session.reload():當session有修改時,重繪session,
- Session.regenerate():將已有session初始化,
- Session.save():保存session,
6,如何解決session存放在后端,記憶體溢位,或者后臺多行程間記憶體不共享問題,
可以使用redis,重新開一個行程,將服務器上的幾個后臺行程的session資訊存放在redis中,既可以解決記憶體溢位的問題,又可以解決進場間通訊的問題,但是有可能會引發redis的其他問題,這又是另外的一個知識點了,不在本文的討論范圍,但是合理的后臺撰寫,是可以解決這個問題的,
二,cookie
1,Cookie簡介
客戶端請求服務器,如果服務器需要記錄該用戶狀態,就向客戶端瀏覽器頒發一個Cookie,客戶端瀏覽器會把Cookie保存起來,當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器,服務器檢查該Cookie,以此來辨認用戶狀態,服務器還可以根據需要修改Cookie的內容,(也就是給你一個身份證,上面記錄了你的資訊,每次跟后臺的交流前,后臺都要看看你的身份證過期了沒,然后才跟你通話,)
2,Cookie的不可跨域名性
既然這些資訊都是存放在我們的客戶端(瀏覽器)上,那么瀏覽器上面存放了這么多的cookie,就不會混亂嗎,比如我訪問qq的網址,拿了阿里的cookie(身份證),就過去了?
答案是不會的,瀏覽器的合格與否,就是要看看它的cookie是否會存放和使用好,跨域的cookie是不能夠共享的,
3,cookie安全性
既然是存放在客戶端上,那么就會存在被修改的危險,如果這個cookie是明文存放的,那么我相信小白也能夠隨意更改資訊(相當于你把你的身份證改成了別人的名字,然后就冒充那個人去跟后臺交流),
早期的cookie確實存在這樣的問題,但是肯定要進步,就給加密起來了,現在你的cookie上面都是亂碼,只有后臺程式才知道這個亂碼要怎么解密,變成你的身份,我們亂修改就會導致你的身份證失效,
4,cookie的效率
由于每次跟后臺訪問的時候,都要攜帶上這個cookie,我們坐一個假設,如果我們的cookie是5kb,然后我打開csdn的首頁,它上面是首頁要請求的次數是200多次,那么在打開首頁的程序中,就要消耗5kb×200多=1mb多的流量,
拜托,我們才只是打開一個頁面而已,光是身份證驗證就已經消耗了1MB的流量了,而且還沒算上200多次請求回傳來的資料流量,算上圖片,文字啥的,你打開一次首頁就要消耗幾MB,
所以我們要將cookie的大小壓縮一下,不必要的就不放進去了,太浪費流量和效率了,
補充:

微信搜索【web小館】,回復全堆疊博客專案,即可獲取專案原始碼和后續的實戰文章教程,每天用最簡單樸實的語言,潛移默化的提升你的計算機基礎知識和前端技術,小米粥,一個專注的web全堆疊工程師,我們下期再見!


轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/160274.html
標籤:其他
