起因於HTTP無狀態協議web 應用是基於 HTTP 協議的,而 HTTP 協議恰恰是一種無狀態協議。也就是說,User 從A頁面跳轉到B頁面會重新發送一次 HTTP 請求,而服務端在返迴響應的時候是無法獲知該User在請求B頁面之前做了什麼的。 隨著網絡技術的蓬勃發展,人們再也不滿足於死板乏味的靜態HTML,他們希望web應用能動起來,於是客戶端出現了腳本和DOM技術,HTML裡增加了表單,而服務端出現了CGI等等動態技術。 Session是有狀態的
HTTP1.1默認使用長連接,它還是無狀態的嗎? 連接方式和有無狀態是完全沒有關係的兩回事。因為狀態從某種意義上來講就 是資料,而連接方式只是決定了資料的傳輸方式,而不能決定資料。長連接是隨著電腦性能的提高和網絡環境的改善改採取的一種合理的性能上的優化,一般情況 下,web服務器會對長連接的數量進行限制,以免資源的過度消耗。 Cookie & Session解決HTTP協議自身無狀態的方式有cookie和session。二者都能記錄狀態, 前者是將狀態資料保存在客戶端,後者則保存在服務端。 需要注意的是,出於安全性的考慮,cookie可以被瀏覽器禁用。 服務端為每一個session維護一份會話資訊資料,而客戶端和服務端依靠一個全局唯一的標識來訪問會話資訊資料。 cookie可以設置失效時間,所以一般包含session資訊的cookie會設置失 效時間為0,即瀏覽器進程有效時間。 所謂URL重寫,顧名思義就是重寫URL。試想,在返回用戶請求的頁面之前,將頁面內所 有的URL後面全部以get參數的方式加上session標識符(或者加在path info部分等等),這樣用戶在收到響應之後,無論點擊哪個鏈接或提交表單,都會在再帶上session的標識符,從而就實現了會話的保持。讀者可能會覺 得這種做法比較麻煩,確實是這樣,但是,如果客戶端禁用了cookie的話,URL重寫將會是首選。 安全性cookie將資訊保存在客戶端,如果不進行加密的話,無疑會暴露一些隱私資訊,安全性很差,一般情況下敏感資訊 是經過加密後存儲在cookie中,但很容易就會被竊取。而session只會將資訊存儲在服務端,如果存儲在文件或資料庫中,也有被竊取的可能,只是可 能性比cookie小了太多。 Session安全性方面比較突出的是存在會話劫持的問題,這是一種安全威脅,這在下文會進行更詳細的說明。總體來 講,session的安全性要高於cookie Session HijackSession hijack即會話劫持是一種比較嚴重的安全威脅,也是一種廣泛存在的 威脅,在session技術中,客戶端和服務端通過傳送session的標識符來維護會話,但這個標識符很容易就能被嗅探到,從而被其他人利用,這屬於一 種中間人攻擊。 References大話 Session |
C09.Servlet & JSP >