首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

自動登錄實現:Cookie + Session 機制與安全增強

     編輯:程式設計綜合問答

基礎流程

  1. 用戶勾選「記住我」登錄成功。
  2. 服務端生成隨機 Token(UUID/JWT),關聯用戶 ID 存入 Redis/DB,設置過期時間(如 30 天)。
  3. 將 Token 寫入 HttpOnly Secure Cookie(Set-Cookie: remember_me=token; HttpOnly; Secure; Max-Age=2592000)。
  4. 瀏覽器關閉後再訪問,自動攜帶 Cookie,服務端驗證 Token 有效性,自動建立 Session 登錄態。

你的方案分析

  • 保存 JSESSIONID 到 Cookie:JSESSIONID 默認就是 Session Cookie(瀏覽器關閉即失效)。強制持久化它違反 Servlet 規範,且 Session 服務端重啟後失效,導致自動登錄失效。
  • 雙重驗證 Cookie+JSESSIONID:純屬多此一舉,未增加安全性,反而引入同步複雜度。

安全增強方案

最佳實踐代碼片段

// 登錄成功後
String token = UUID.randomUUID().toString().replace("-", "");
redisTemplate.opsForValue().set("auto_login:" + token, userId, 30, TimeUnit.DAYS);
Cookie cookie = new Cookie("remember_me", token);
cookie.setHttpOnly(true);
cookie.setSecure(true); // 僅 HTTPS
cookie.setPath("/");
cookie.setMaxAge(30 * 24 * 3600);
response.addCookie(cookie);

// 攔截器/過濾器中
String token = WebUtils.getCookie(request, "remember_me");
if (token != null) {
    String userId = redisTemplate.opsForValue().get("auto_login:" + token);
    if (userId != null) {
        // 自動登錄
        SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userId, null, authorities));
    }
}

結論

採用獨立長效 Token + HttpOnly Cookie + 服務端存儲架構,而非依賴 JSESSIONID。簡單、安全、符合標準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
威脅對策
Cookie 竊取 (XSS/中間人)HttpOnly + Secure + SameSite=Strict/Lax;Token 綁定 User-Agent/IP 指紋
Token 暴力破解Token 長度 ≥ 128 bit (Base64 22字符);限制驗證頻率
數據庫洩露存儲 Token 哈希 (bcrypt/Argon2) 而非明文
設備遺失提供「吊銷所有 Token」功能;顯示活躍會話列表