揭秘Cookie:
cookie說的直白點就是保存在用戶瀏覽器端的一個鍵值對,舉個例子,你現在登錄了京東商城,你把瀏覽器關閉之后,你再打開京東,你還是可以對你的賬戶繼續操作,已經購買的商品,訂單都是可以看到的,這個就是cookie起了作用。那為什么你再次打開的時候,就直接是已經登錄狀態了,京東的服務端是怎么知道你已經登錄的哪,其實就是cookie起了作用,就是你在登錄的時候京東對你的瀏覽器設置了cookie,你登錄的時候它把你的賬號密碼寫到了你瀏覽器的cookie里面,你下次打開京東的時候,它就默認把你瀏覽器里面的cookie,也就是你的賬號密碼發送到了京東的服務端,這樣的話,京東就知道你已經登錄,所以你再打開jd的時候就是已經登錄的狀態了,很多網站上面的記住我、30天不需要登錄就是用的cookie,前面也說了cookie是存在本地的,如果你清理了瀏覽器的cookie,那么cookie就沒有了,你就是未登錄的狀態了。
為什么要用Cookie?
在HTTP請求中,每個HTTP請求都是獨立,沒有辦法做上下文關聯,但是在真正的應用中,很多場景是需要用到這種關聯的。最經典也是最常見到使用Cookie的就是登錄操作,登錄成功后,我們可以在同一瀏覽器下的不同Tab頁面都能訪問我們需要登錄才可以看到的頁面。這就是通過Cookie來實現的。否則每開一個Tab頁面登錄一次淘寶,估計你也就不想購物了。
所謂的Cookie到底是什么?
從本質上來說,Cookie我們可以理解為,它就是一個存在硬盤的字符串,Cookie可以做很多操作,以登錄為例的話,它實際就是存在硬盤中的賬號密碼,多數會以一種加密的方式存儲。
不同瀏覽器時Cookie是共用的么?
假設電腦上有三種瀏覽器,谷歌、歐朋、火狐,如果谷歌上打開淘寶並且登錄,那么火狐瀏覽器打開淘寶時一定還是需要登錄,其實認真想下就能夠想通了,Cookie是存在硬盤中的一個字符串,那么谷歌和火狐瀏覽器分別安裝在不同的目錄下,它們存儲Cookie的地址一定是不同,所以不同瀏覽器之間是不可以共用Cookie的。
揭秘Session:
上面說了cookie,提到cookie肯定不能少了session,什么是session呢,說直白點,就是保存在服務端的一個鍵值對。舉個例子,還是京東,登錄的時候已經把賬號密碼寫到cookie里面了,咱們再去打開京東頁面的時候,瀏覽器會自動把京東這個網站下面的cookie發給京東的服務端,也就是cookie里面存的東西,賬號密碼發到京東的服務端了,那發過去了,京東的服務端肯定是要驗證一下,你發的賬號密碼對不對,要不然你知道誰的賬號了,你隨便偽造一個cookie發給京東那就直接能操作別人的賬號了,那就不安全了。那怎么辦呢,服務端就也保存一個鍵值對不就行了,那你把cookie發過來的時候,和我這保存的這個鍵值對一樣不就ok了,這個就是session,其實就是保存在服務端的一個鍵值對。
有的人可能會問了,那你的賬號密碼肯定都是存在數據庫里面的,完全不用session啊,cookie發過來的時候,我直接從數據庫里面查到這個用戶的賬號密碼做比較就好了,這樣當然是可以的,但是我想說你太年輕了,你想如果打開一個網站,里面很多頁面都是要驗證一下你的登錄狀態的,那你每次驗證登錄狀態都要去操作數據庫,我們都知道計算機在處理數據的時候,都是先從硬盤上取數據然后放到內存里面,內存再給cpu,cpu來進行處理(看下面的圖),CPU的處理速度是很快的,就像火箭一樣,內存的存取的速度就像高鐵的速度一樣,而硬盤的讀取速度就像普通的汽車一樣,而數據庫里面的數據都是存在硬盤上的,每次去校驗一下賬號密碼從數據庫里面取數據,那效率就很低了。一般session都是存在緩存里面,因為要經常用到,要提升性能,直接把seesion放到內存里面,這樣子的話,查的時候直接在內存里面取數據了,就很快了,像一些緩存數據庫,redis、memcached這些都是把數據直接存到內存里面的。
為什么要用Session?
在知道Cookie是存在硬盤中的字符串后,如果將存在硬盤中的Cookie盜取,存在登錄信息被破解的風險,所以通過Session來避免信息被盜取的風險。
什么是Session?
可以將Session簡單的理解為一個對象,這個對象中可以包含很多東西,具體想包含什么是可以由開發人員自定義的。存在服務器中的是一個key,value形式的對象。
Cookie與Session有什么聯系?
在WEB應用中,Cookie是可以獨立使用的,但是Session必須依賴於Cookie使用,每創建一個Session對象時,都會生成一個唯一的Session_id,它通過Cookie的形式存在瀏覽器的內存中,隨着瀏覽器關閉則消失,從而保證不留存在硬盤中。
Session的原理是什么?
登錄成功后,通過Cookie的形式在瀏覽器內存中存入一個唯一的Session_id,每一次請求時,都會攜帶帶有Session_id的Cookie信息傳到服務器,以Session_id為Key得到唯一的Value信息,則代表發送過來的請求為有效請求。否則為無效請求。