1. Cookie/Session?
1.1Cookie簡介
HTTP/1.1 引入 Cookie 來保存狀態(tài)信息。Cookie 是服務器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會在瀏覽器之后向同一服務器再次發(fā)起請求時被攜帶上,用于告知服務端兩個請求是否來自同一瀏覽器。由于之后每次請求都會需要攜帶 Cookie 數(shù)據(jù),因此會帶來額外的性能開銷。Cookie具有不可跨域性,Cookie在客戶端是由瀏覽器來管理的,瀏覽器只允許一個網(wǎng)站操作對應域名的Cookie。
用途:會話狀態(tài)(登錄狀態(tài),購物車等),個性化設置,瀏覽器行為跟蹤
創(chuàng)建:服務器發(fā)送的響應報文包含 Set-Cookie 首部字段,客戶端得到響應報文后把 Cookie 內(nèi)容保存到瀏覽器中。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
客戶端之后對同一個服務器發(fā)送請求時,會從瀏覽器中取出 Cookie 信息并通過 Cookie 請求首部字段發(fā)送給服務器。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
1.2Session及二者區(qū)別
Cookie保存在瀏覽器,Session保存在服務器端(Session 可以存儲在服務器上的文件、數(shù)據(jù)庫或者內(nèi)存中。也可以將 Session 存儲在 Redis 這種內(nèi)存型數(shù)據(jù)庫中,效率會更高。),但是為了區(qū)分不同的客戶端,服務器返回的響應報文的 Set-Cookie 首部字段包含了這個 Session ID,客戶端收到響應報文之后將該 Cookie 值存入瀏覽器中,下次客戶端之后對同一個服務器進行請求的時候會包含該Cookie值,服務器收到之后取出SessionID,從服務器端取出用戶信息,繼續(xù)業(yè)務操作。所以Session機制依賴于Cookie機制。
1、Cookie不是很安全,存儲在瀏覽器中,容易被惡意查看。(如果非要將一些隱私數(shù)據(jù)存在 Cookie 中,可以將 Cookie 值進行加密,然后在服務器進行解密)
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
a.瀏覽器通過 document.cookie 屬性可創(chuàng)建新的 Cookie,也可通過該屬性訪問非 HttpOnly 標記的 Cookie。站腳本攻擊 (XSS) 可使用它竊取用戶的 Cookie 信息。
b.標記為 HttpOnly 的 Cookie 不能被 JavaScript 腳本調(diào)用。
c.標記為 Secure 的 Cookie 只能通過被 HTTPS 協(xié)議加密過的請求發(fā)送給服務端。
2、Cookie 只能存儲 ASCII 碼字符串,而 Session 則可以存儲任何類型的數(shù)據(jù),因此在考慮數(shù)據(jù)復雜性時首選 Session。
3、Session會在一定時間內(nèi)保存在服務器上。當訪問增多,會比較占用服務器的性能考慮到減輕服務器性能方面,應當使用Cookie。
4、單個Cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、建議:將登陸信息等重要信息存放為Session,其他信息如果需要保留,可以放在Cookie中。
瀏覽器禁用Cookie,則只能用Session,使用 URL 重寫技術,將 Session ID 作為 URL 的參數(shù)進行傳遞。
2. 保存登錄狀態(tài)?
1、把登錄信息如賬號、密碼等保存在Cookie中,并控制Cookie的有效期,下次訪問時再驗證Cookie中的登錄信息即可。
2、把密碼加密后保存到Cookie中,下次訪問時解密并與數(shù)據(jù)庫比較。
3、把登錄的時間戳保存到Cookie與數(shù)據(jù)庫中,到時只驗證用戶名與登錄時間戳就可以了。
4、把賬號按照一定的規(guī)則加密后,連同賬號一塊保存到Cookie中。