瞭解會話的產生過程、會話的特性、簡單的Cookie、在URL中內嵌會話ID以及這樣做帶來什麼後果 ...
會話用來做什麼:
它是用來維持請求和請求之間的狀態。http請求預設是完全無狀態的,也就是說,當用戶瀏覽器把一個完整的請求發送到伺服器,等到伺服器接收完全部的請求,在此之後,用戶的瀏覽器與伺服器之間再也沒人什麼聯繫。當用戶瀏覽器發送下一個請求,那麼這個請求無法與之前的請求關聯起來。這樣會導致什麼後果?以線上商城為例子,用戶需要在不同的商品頁面中瀏覽,當把其中一個商品添加到購物車後,然後再去找其他商品並添加到購物車。若採用採用無狀態的連接,也就是前後兩次請求無法關聯起來,購物車裡並不包含前一次添加進來的商品。所以你只能在當前請求還沒有結束之前把賬單結了,也就是一次只能付款一個商品,無法做到一次性付款所有商品。
會話的工作原理:
會話是由伺服器或web應用程式管理的某些文件、記憶體片段、對象或容器,它包含了分配給它的各種不同的數據。可以把它理解為一個可以存儲之前請求的空間,伺服器會把某個用戶的會話保存在本機中,當下一次用戶再發送請求到伺服器,會把當前的請求與會話中存儲的請求關聯起來。
若採用了會話技術,那麼在用戶瀏覽器發送第一個請求到伺服器,伺服器會為該用戶開闢一段空間用來保存會話內容,並生成一個唯一的會話ID用來標識該用戶。當伺服器返迴響應時,會在響應段中添加會話ID。接下來,從該用戶瀏覽器發出的每個請求都將包含這個會話ID,當Web應用程式接收到含有會話ID的請求時,它可以通過該ID將現有的會話與當前的請求關聯起來。
走進會話Cookie:
它是一種通信機制,可以通過Set-Cookie響應頭在伺服器和瀏覽器之間傳遞任意的數據,並存儲在用戶電腦中,然後再通過請求頭Cookie從瀏覽器返回到伺服器中。
在JavaEE中會話Cookie的名字預設是JSESSIONID
Cookie有哪些特性:
1.Domain:告訴瀏覽器將cookie發送到哪個功能變數名稱中
2.Path:將cookie發送到某個功能變數名稱下的某個URL
3.Expires:定義了Cookie的絕對過期日期
4.Max-Age:定義了Cookie的存活時間,以秒為單位
ps:若Cookie中不包含Expires和Max-Age這兩個特性,那麼該Cookie將在瀏覽器關閉時被刪除
5.Secure:瀏覽器只會通過HTTPS發送Cookie。
6.HttpOnly:只能通過直接的瀏覽器請求發送cookie,其他技術如JavaScript、Flash將無法發送Cookie
如何在請求URL中包含會話ID:
會話ID需要作為第一個響應返回給用戶瀏覽器,如何生成會話ID?需要把會話ID添加到每個應用程式返回的URL中,包括頁面的鏈接、表單操作以及302重定向。
可以通過HttpServletResponse介面中的兩個方法encodeURL()和encodeRedirectURL()將會話ID內嵌到URL中。任何在鏈接、表單操作或者其他標簽中的URL都將被傳入到encodeURL()方法中,然後返回一個正確的、經過編碼處理的URL。任何可以傳入sendRedirect()中的URL都可以傳入encodeRedirectURL()方法中,返回一個正確的、經過編譯處理的URL。
URL中內嵌會話ID會帶來什麼後果:
如果將該URL複製到公共場所,如果惡意用戶發現了該鏈接,可以使用劫持用戶的會話。他將可以修改賬戶地址、獲取密碼重置鏈接並終修改密碼。
攻擊者通過URL或者檢查瀏覽器的Cookie獲得會話ID,然後將含有會話ID的URL發送給目標用戶,當用戶點擊鏈接進入網站時,它的會話ID就換成了URL中含有的固定ID-----攻擊者已經持有該ID。如果用戶接著在該會話期間登錄網站,那麼攻擊者也可以登錄成功,因為這個會話ID是他分享的,因此他也可以訪問用戶的賬號。這個可以通過禁止在URL中內嵌會話ID或者設置登錄後會話遷移(當用戶登錄時,修改會話ID或者將會話信息複製到新的會話中,並使之前的會話無效)