Session和Token的區(qū)別
一暂吉、cookie
http請求時無狀態(tài)的陆蟆。就是說第一次和服務器連接并登陸成功后,第二次請求服務器仍然不知道當前請求的用戶凤藏。
cookie出現就是解決了這個問題奸忽,第一次登陸后服務器返回一些數據(cookie)給瀏覽器堕伪,然后瀏覽器保存在本地,當用戶第二次返回請求的時候栗菜,就會把上次請求存儲的cookie數據自動攜帶給服務器欠雌。
如果關閉瀏覽器cookie失效(cookie就是保存在內存中)
如果關閉瀏覽器cookie不失效(cookie保存在磁盤中)
二、session
session和cookie的作用有點類似疙筹,都是為了存儲用戶相關的信息富俄。不同的是,cookie是存儲在本地瀏覽器而咆,而session存儲在服務器霍比。存儲在服務器的數據會更加的安全,不容易被竊取暴备。但存儲在服務器也有一定的弊端悠瞬,就是會占用服務器的資源。
1涯捻、存儲在服務端:通過cookie存儲一個session_id浅妆,然后具體的數據則是保存在session中。如果用戶已經登錄障癌,則服務器會在cookie中保存一個session_id狂打,下次再次請求的時候,會把該session_id攜帶上來混弥,服務器根據session_id在session庫中獲取用戶的session數據趴乡。就能知道該用戶到底是誰,以及之前保存的一些狀態(tài)信息蝗拿。
2晾捏、將session數據加密,然后存儲在cookie中哀托。這種專業(yè)術語叫做client side session惦辛。flask采用的就是這種方式,但是也可以替換成其他形式仓手。
cookie和session的區(qū)別
cookie數據存放在客戶的瀏覽器上胖齐,session數據放在服務器上。
cookie不是很安全嗽冒,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session呀伙。
session會在一定時間內保存在服務器上。當訪問增多添坊,會比較占用你服務器的性能考慮到減輕服務器性能方面剿另,應當使用COOKIE。
單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie雨女。因此使用cookie只能存儲一些小量的數據谚攒。
所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
Cookie和Session的方案雖然分別屬于客戶端和服務端氛堕,但是服務端的session的實現對客戶端的cookie有依賴關系的馏臭,上面我講到服務端執(zhí)行session機制時候會生成session的id值,這個id值會發(fā)送給客戶端讼稚,客戶端每次請求都會把這個id值放到http請求的頭部發(fā)送給服務端位喂,而這個id值在客戶端會保存下來,保存的容器就是cookie乱灵,因此當我們完全禁掉瀏覽器的cookie的時候塑崖,服務端的session也會不能正常使用。
cookie和session的區(qū)別:1痛倚、cookie數據存放在客戶的瀏覽器上规婆,session數據放在服務器上。2
1蝉稳、session出現的原因
因為http協(xié)議本身是無狀態(tài)的抒蚜,這樣你本次請求和上次請求無法判斷是不是同一個人操作的。
2耘戚、session的生成方式
瀏覽器在第一次訪問服務器時嗡髓,服務器會創(chuàng)建一個session,然后同時為該session生成一個唯一的會話sessionid收津。然后將sessionid和session存儲到緩存/數據庫中饿这,然后服務器再把sessionid(名字為JSESSIONID的cookie),以cookie形式發(fā)送給客戶端撞秋。
瀏覽器再次訪問時會攜帶cookie中的sessionis长捧,然后服務器根據sessionid找到對應的session進行匹配。
如果瀏覽器禁用了cookie/不支持cookie吻贿,可以通過URL重寫的方式發(fā)送到服務串结。
3、token出現的原因
session的存儲是需要空間的舅列,session的傳輸一般都是通過cookie來傳輸肌割,或url重寫的方式。
token在服務器時可以不用存儲用戶信息的帐要,token傳遞的方式也不限于cookie傳遞把敞,token也可以保存起來。
4宠叼、token的生成方式
瀏覽器第一次訪問服務器時先巴,會傳過來一個唯一表示ID其爵,服務端通過算法冒冬,加密鑰伸蚯,生成一個token。通過BASE64編碼后將token發(fā)送給客戶端简烤。
客戶端將token保存起來剂邮,下次請求帶著token,服務器收到請求會用相同的算法取驗證toekn横侦,如果通過就繼續(xù)執(zhí)行挥萌。
token組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)枉侧、sign(簽名引瀑,由token的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串,可以防止惡意第三方拼接token請求服務器)榨馁。還可以把不變的參數也放進token憨栽,避免多次查庫
5、token和session的區(qū)別
共同點:都是保存了用戶身份信息翼虫,都有過期時間屑柔。
session翻譯為會話,token翻譯為令牌珍剑。
session是空間換時間掸宛,token是時間換空間。
session和sessionid:服務器會保存一份招拙,可能保存到緩存/數據庫/文件唧瘾。
token:服務器不需要記錄任何東西,每次都是一個無狀態(tài)的請求别凤,每次都是通過解密來驗證是否合法劈愚。
sessionid:一般是隨機字符串,要到**服務器檢索id的有效性闻妓。**出現請求:服務器重啟餓內存中的session沒了菌羽,數據庫服務器掛了。
為什么要使用token由缆?
一注祖、session的狀態(tài)保持及弊端
當用戶第一次通過瀏覽器使用用戶名和密碼訪問服務器時,服務器會驗證用戶數據均唉,驗證成功后在服務器端寫入session數據是晨,向客戶端瀏覽器返回sessionid,瀏覽器將sessionid保存在cookie中舔箭,當用戶再次訪問服務器時罩缴,會攜帶sessionid蚊逢,服務器會拿著sessionid從數據庫獲取session數據,然后進行用戶信息查詢箫章,查詢到烙荷,就會將查詢到的用戶信息返回,從而實現狀態(tài)保持檬寂。
弊端:
1终抽、服務器壓力增大
通常session是存儲在內存中的,每個用戶通過認證之后都會將session數據保存在服務器的內存中桶至,而當用戶量增大時昼伴,服務器的壓力增大。
2镣屹、CSRF跨站偽造請求攻擊
session是基于cookie進行用戶識別的, cookie如果被截獲圃郊,用戶就會很容易受到跨站請求偽造的攻擊。
3女蜈、擴展性不強
如果將來搭建了多個服務器持舆,雖然每個服務器都執(zhí)行的是同樣的業(yè)務邏輯,但是session數據是保存在內存中的(不是共享的)鞭光,用戶第一次訪問的是服務器1混坞,當用戶再次請求時可能訪問的是另外一臺服務器2庆冕,服務器2獲取不到session信息看幼,就判定用戶沒有登陸過直砂。
二、token認證機制
token與session的不同主要在①認證成功后汹买,會對當前用戶數據進行加密佩伤,生成一個加密字符串token,返還給客戶端(服務器端并不進行保存)
②瀏覽器會將接收到的token值存儲在Local Storage中晦毙,(通過js代碼寫入Local Storage生巡,通過js獲取,并不會像cookie一樣自動攜帶)
③再次訪問時服務器端對token值的處理:服務器對瀏覽器傳來的token值進行解密见妒,解密完成后進行用戶數據的查詢孤荣,如果查詢成功,則通過認證须揣,實現狀態(tài)保持盐股,所以,即時有了多臺服務器耻卡,服務器也只是做了token的解密和用戶數據的查詢疯汁,它不需要在服務端去保留用戶的認證信息或者會話信息,這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了卵酪,這就為應用的擴展提供了便利幌蚊,解決了session擴展性的弊端谤碳。