Cookie和Session詳解
Cookie
Cookie只存儲在客服端
Cookie是什麼:Cookies是web服務器存放在用戶硬盤的一段文本,Cookies容許一個wen站點在用戶的機器存放一些文本的信息,並能夠在之後從新獲取它。這個基於文本的信息存儲着一些「鍵-值」對。
![](http://static.javashuo.com/static/loading.gif)
Cookie在http瀏覽器裏面的使用過程
1.當瀏覽器發送請求時,它會查看你機器上跟域名www.test.com有關的Cookie文件,若是存在同www.test.com有關的 Cookie,瀏覽器就會把相關的Cookie「鍵-值」對數據跟請求一塊兒發送到服務器(),若是不存在同www.test.com有關的 Cookie,則瀏覽器不發送Cookie到服務器。php
http協議中,在Request Headers裏面經過Cookie:PHPSESSIS=123456發送
2.服務器若是返回Cookie,瀏覽器會把Cookie存儲在域名www.test.com有關的Cookie文件中,提供給下次請求調用程序員
http協議中,在Response Headers裏面經過Set-Cookie:PHPSESSIS=123456(名字,值,過時時間,路徑和域)返回
3.固然,不是所有Cookie都會存儲起來,Set-Cookie設置的過時時間web
- 持久性cookie,設置了cookie的時間,以文件方式存在硬盤上
- 會話cookie,沒有設置cookie時間,cookie的生命週期也就是關閉瀏覽器前就消失,通常不會保存在硬盤,而是保存在內存上
4.因此單純使用Cookie不安全數據庫
Cookie其實就是鍵值對存儲在文件中,若是一些用戶名都存儲在裏面,只需簡單修改文件裏面的用戶名,就能夠達到模仿他人登陸,因此相對不安全,固然能夠經過其餘手段避免,例如加密加鹽
Session
Session存儲在服務端(中介是Cookie或者直接url,使用url傳遞session_id不詳說,這種使用場景比較少)
簡單來講,一個請求到達的時候,服務器會先判斷是否帶有Session信息。若是有,則根據Session ID去數據庫中查找是否具備對應的用戶身份信息。此處可能會出現Session失效、非法的Session信息等可能性,那麼服務器視同無Ssession信息的狀況,從新的產生一個隨機的字符串,而且在Http返回頭中寫入新的Session ID信息。另外一者,若是服務器成功獲取了用戶的身份信息則以該身份爲請求者提供服務。在http中,客服端的請求裏面的session id通常是經過cookie帶過來的,因此Session也依賴於cookie。
以php裏面Session舉例,session_start()開啓
- 首先會去獲取客戶端cookie裏的session_id,若是不存在,會從新建立一個
- 根據session_id,取到全部相關的信息,放入$_SESSION全局變量裏以供使用
- 若是寫session,也是根據session_id寫入相關文件,並放入$_SESSION全局變量裏以供使用
設置登陸態的過時時間,須要設置session的過時時間以及cookie的過時時間才能夠真正生效(ini_set修改)
這個表明SessionID在客戶端Cookie儲存的時間,默認是0,表明瀏覽器一關閉SessionID就做廢
這個是Session數據在服務器端儲存的時間,若是超過這個時間,那麼Session數據就自動刪除
Cookie 和 session 傳輸的區別
![](http://static.javashuo.com/static/loading.gif)
Cookie主域名和子域名之間的共享
總的來講,設置cookie的話只能在本域名下或者domain級別高於自身的域名下才會生效!
- 二級域名能讀取設置了domain爲頂級域名或者自身的cookie,不能讀取其餘二級域名domain的cookie。例如:要想cookie在多個二級域名中共享,須要設置domain爲頂級域名,這樣就能夠在全部二級域名裏面或者到這個cookie的值了。
- 頂級域名只能獲取到domain設置爲頂級域名的cookie,domain設置爲其餘子級域名的沒法獲取。
多系統共用登陸態的方法一(cookie共享)
- 在頂級域名下開啓session
- 使用同一個session_id
- 必須是二級域名,不一樣域名不適合使用
多系統共用登陸態的方法一(SSO,限制沒這麼多)
- 瀏覽器訪問單點登陸的網站,若是session存在就返回數據,若是不存在就跳轉到cas server(一個單獨域名的服務)
- 若是有已經登陸過,經過檢測cookie,cas server就會302跳轉經過url返回Ticket(Ticket是隨機且惟一)到網站,若是沒有登陸過,就跳轉到cas server登陸頁面進行登陸,登陸成功設置cookie,而後302跳轉返回Ticket到網站,同時cas server會存儲改Ticket、cookie和網站host的對應關係。
- 網站接收到Ticket後經過cas server提供的校驗url去校驗Ticket,cas server確認後返回成功,網站寫入當前域名的sessionid
- 當用戶再訪問網站的時候,就會判斷當前session是否登陸
兩種登錄方式圖
![](http://static.javashuo.com/static/loading.gif)
更多內容請關注微信公衆「p12310086」,一個程序員和hr一塊兒運營的公衆號!
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)