最近項目上線,開啟https(ssl)后,Cookie出現缺少Secure 屬性的情況。因為Cookie少了Secure屬性,沒有告知瀏覽器采用https方式來傳輸信息,所以在可以被外界獲取到用戶標識特征,如 JSESSIONID session會話ID 。
session cookie
用戶首次訪問Web站點時,Web服務器對用戶一無所知,但希望用戶再次訪問的時候,能根據特征識別用戶。cookie中包含了一個由 name=value 這樣信息構成的任意列表,並通過Set-Cookie或Set-cookie2 HTTP響應(擴展) Headers 首部 將其貼到用戶身上去。
場景
用戶登錄界面,使用openssl生成證書,采用https方式傳輸,不被外界(攻擊者)所截取用戶密碼等明文信息。
問題
由於session cookie沒設置了secure屬性,通知瀏覽器使用https方式連接,cookie中的JSSESSIONID 等其它信息對於攻擊者是可見了,沒避免中間人攻擊(Man-in-the-Middle Attack,簡稱“MITM攻擊”)。
解決
Servlet 3.0環境
直接在web.xml配置以下信息開啟 cookie secure屬性
<session-config>
<cookie-config>
<secure>true</secure>
</cookie-config>
</session-config>
Servlet 3.0以下環境
設置response 請求頭cookile信息,添加Secure屬性。對於HttpOnly也是同樣,在后面直接添加。
處理可以寫個過濾器filter,對於需要的請求,添加cookile信息,走https傳輸方式;也可以在特定的MVC 控制器里設置,走https傳輸方式。
String jSessionId=request.getSession().getId();
response.setHeader("Set-Cookie", "JSESSIONID="+jSessionId+"; Secure;HttpOnly;");