狀態保持的常用手法,原理,以及優劣
首先解釋問什麼要進行狀態保持:
直接原因:
http協議是乙個無狀態的協議: http協議通過socket(套接字)進行通訊,客戶端連線伺服器,一次資料傳輸完成之後,
客戶端會斷開於伺服器的連線,伺服器也會銷毀前一次的連線物件,因此,http協議是乙個不能保持狀態(無狀態)的協議
需求:我們的web伺服器總是希望能夠讓服務端和客戶端彼此認識(保持當前的狀態), 從而不至於讓使用者每跳轉乙個頁面就登陸一次,造成極差的使用者體驗
手段一: cookie
特點cookie是儲存在客戶端的乙個文字檔案,一般大小單個檔案大小不會超過4kb,只能存非中文和字串型別,不能儲存物件,根據作業系統和瀏覽器的不同,儲存的位置也不盡相同,大體上存放在硬碟或記憶體中
流程:
當瀏覽器向伺服器傳送請求後,伺服器會給客戶端傳送一些響應資訊,其中有一部分會儲存在由伺服器生成的文字檔案(cookie)中,
儲存的資訊可以是使用者名稱,id, 瀏覽記錄,歷史記錄,如果你在登入的時候選擇了儲存密碼,那還會儲存你的密碼資訊(之前有**就這麼幹,後來連官網都被黑掉了)
如果下一次瀏覽器再一次請求伺服器, 就瀏覽器會在cookie中查詢這台伺服器網域名稱下的相關資訊, 附在請求中,一併發給伺服器,伺服器就可以解析cookie的資訊,然後獲知使用者的身份,許可權等一系列使用者資訊了
優缺點:
這麼做優勢很明顯,即即可以實現狀態保持,又不消耗伺服器的任何儲存資源(cookie存客戶端了嘛), 唯一增加的是在請求時多攜帶了一些資料而已,這些資料小到簡直可以忽略不計
缺點也很明顯: 由於cookie儲存在本地,就相當於把**的很多資訊暴露給了有心之人,即使你的cookie資訊加了密,那些有心之人也有辦法解密,不然你覺得上面的那個**的官網是怎麼被黑掉的, 採用cookie的狀態保持手段安全性相對較低
手段二: session
特點:session是基於cookie的, session儲存的容量大,可以儲存物件,ession儲存在伺服器端,一般是記憶體中,或資料庫中
流程:當瀏覽器向伺服器傳送請求後,伺服器在響應客戶端的同時,會在伺服器內部儲存這個使用者的所有登入資訊,並儲存起來,並根據這個使用者的全部資訊生成乙個針對於這個使用者的sessiondi,
來唯一標識這個使用者的所有資訊,以形成一種一一對應關係(類似於python中的字典,一鍵一值的形式), 並把生成的唯一表示sessionid也響應給瀏覽器,瀏覽器接收到響應之後,會將sessionid儲存在cookie中
下一次該使用者在請求這台伺服器時,瀏覽器就會把這台伺服器下的網域名稱所對應的sessiondi連同請求一併發給伺服器,伺服器通過sessionid查詢到這個使用者,並獲取使用者的相關資訊,如果伺服器沒有獲取到sessionid,就說明這個使用者並沒有在該**中註冊
儲存使用者資料,生成sessionid,並返回就行了,
但是也會遇到一些問題,如果在瀏覽器端,cookie被禁用掉了,那必須得有其他的機制來確保sessionid能夠準確無誤的傳回伺服器,一般常用的方式是重寫url, 這裡也分為兩種方式:
一種就是sessionid當做url的附加資訊進行傳遞如
另外一種就是把sessionid當做url的查詢引數傳遞如:
而另一種機制是表單隱藏字段:如果伺服器發現客戶端禁用掉了cookie,那麼服務端就會修改表單,在表單中新增乙個隱藏的字段,以儲存sessionid,並保證在下一次的請求中,sessionid能被回傳給伺服器
優缺點:
優點是:安全性提高了,你的使用者資料存放在伺服器,一般不會被人黑掉,大大提高了資料的安全性
缺點是:伺服器的儲存資源那是相當的寶貴啊,前期使用者量少還好說,使用者量大了像facebook,youtube,如果真的使用session的狀態保持手段,伺服器會被撐**的,太占用伺服器儲存資源了
手段三: jwt
特點:jwt本身是json型別, 由於json的通用性,jwt也是通用的,跨語言特性很好, jwt本質上是一串字串,比較小巧,一般存放在客戶端
構成:1, 頭部(header) 頭部是json形式,一般存放的是加密的方式和jwt的型別,
2, 載荷(playload) 載荷是json形式,存放的是一些基本資訊, 如過期時間,要發給誰,簽發者是誰,簽發時間是多少
3, 簽證(signature) 簽證的構成稍有複雜,將頭部和載荷使用base64加密過後,同過.進行連線,並且使用header中的加密方式進行secret加鹽加密,最後才得出簽證的值
4, 整個jwt看起來像是這樣: eyjhbgcioiji.eyjzdwiioydwv9.tjva95orm7e2cb
流程:當瀏覽器向伺服器傳送請求後,伺服器在響應客戶端的同時,會在伺服器內部把使用者的一些不敏感資訊放入在jwt的載荷中,如id, name等,生成jwt,並將jwt一併響應給客戶端,客戶端接收到這個jwt之後,會存放在本地,
以後每一次請求都會攜帶這個jwt,以便於儲存使用者的登入狀態,如果使用者需要登出,則把客戶端的jwt刪除即可,
由於頭部和載荷都是採用base64進行的加密,理所應當也可以進行解密,因此頭部和載荷是不安全的,而由於簽證是由加鹽演算法進行加密的,因此不能被篡改, 而一旦有人篡改了頭部或者載荷,在伺服器收到請求之後,
伺服器會把收到的載荷和頭部採用相同的secret進行加鹽加密,得到新的簽證,如果跟老的簽證不一致,則說明資訊被篡改了,直接返回瀏覽器錯誤資訊即可.
總結:
session和cookie相比,其實是拿儲存空間換取資料安全
jwt和session,cookie相比,是以計算力(頻繁的加解密)換取儲存空間
狀態保持 Cookie解釋以及原理分析
狀態保持 cookie解釋以及原理分析 我們知道web 在客戶端儲存資料有三種形式 1.cookie 2.hidden 隱藏域 3.querystring 其中viewstate什麼的都是通過第二種方式隱藏域儲存滴。好了今天的主角是cookie 小甜餅 先看下cookie存在哪吧!首先,開啟執行對話...
白帽子技術的常用手法有哪些呢?
白帽子技術的常用手法有哪些呢?坦白來說,白帽技術不難,黑帽技術也不難,但凡是技術性的活兒,無非是花些時間鑽研學習,也就掌握各七七八八。難的是什麼?是思維上的東西,比方說推廣 營銷,這些就不是你花點時間就能夠掌握的了。白帽技術seo優化從大的方面分為站內優化和站外優化兩大塊。那麼一般說的技術大多都是說...
lr背景虛化 人像攝影模糊背景的常用手法
模糊背景突出主體人物,這是人像攝影經常運用的手法。模糊背景突出主體這一手法使用很多初學攝影的朋友迷惑上癮,總是希望每張人像 的背景盡可能地模糊。不過更多的攝影朋友是抱怨自身條件不好,怪鏡頭光圈不夠大,其實解決的辦法還很多。大口徑鏡頭固然好,但畢竟其昂貴的 不是每個人都能夠承受的。模糊背景突出人物在人...