Cookie是一種服務器發送給瀏覽器的一組數據,用於瀏覽器跟蹤用戶,並訪問服務器時保持登錄狀態等功能。
通常用戶登錄的時候,服務器根據用戶名和密碼在服務器數據庫中校驗該用戶是否正確,校驗正確后則可以根據用戶ID和時間戳等屬性加密生成一個Token,並返回給瀏覽器。
生成一個ticket的例子:
WebUtils.saveCookie(response, “ticket”, webTicket, -1, "/", null);
這樣瀏覽器就會得到一個cookie
只要這個訪問回話沒有關閉,所有訪問服務器的請求都會帶上這個cookie。
服務器通過攔截器來校驗用戶的登錄狀態
//偽代碼
public class PassPortIntercepter extends HandlerInterceptorAdapter {
public boolean preHandler(HttpServletRequest request, HttpServletResponse response) {
//攔截請求
String ticket = request.getParameter("ticket");
//根據ticke解密用戶的id
long id = SessionUtil.build(ticket).getUserId();
//再從數據庫中訪問是否存在這個用戶
UserInfo user = userInfoService.getUserBy(id);
//如果不存在user,講該請求攔截,並跳回登錄頁
if(user == null) {
return false;
}
return super.preHandle(request, response, handler);
}
}
這種情況下,cookie如果被人竊取,則會有泄露信息的危險。
- 通過設置httpOnly屬性,這樣cookie只在http中傳輸,而不會被腳本竊取,但是網絡攔截http請求還是會得到cookie。
- 在cookie中加入校驗信息,這個校驗信息與用戶的使用環境相關,比如ip地址,計算機的物理地址等,在服務器端對校驗的時候,如果校驗值發生了變化,則要求重新登錄。
