首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Cookie详解

Cookie详解

原创
作者头像
艾伦耶格尔
发布2025-08-14 18:04:32
发布2025-08-14 18:04:32
8520
举报
文章被收录于专栏:Java后端Java后端

在 Web 开发中,HTTP 是无状态协议——每次请求彼此独立,服务器无法“记住”用户是谁。为了解决这个问题,Cookie 应运而生。

Cookie 就像是网站给浏览器贴的一张“小纸条”,用于记录用户状态、偏好或身份信息,让网站在用户再次访问时能“认出你”。

本文将带你深入理解 Cookie 的工作原理、Java 实现、安全性问题与替代方案,掌握 Web 会话管理的核心技术。


一、Cookie 是什么?

Cookie(复数:Cookies)是服务器发送到用户浏览器并保存在本地的一小段文本数据,浏览器会在后续请求中自动将其发送回服务器。

  • 本质:键值对形式的文本数据(如 username=John
  • 存储位置:客户端(浏览器本地)
  • 作用域:绑定到特定域名和路径
  • 生命周期:可设置为会话级或持久化存储

二、生活化理解:Cookie 就像“会员卡”

场景一:咖啡店会员卡

你第一次去咖啡店,店员给你一张会员卡(Cookie),上面写着“常客:拿铁爱好者”。 下次你再来,出示这张卡,店员就知道:“老样子,一杯拿铁!” 这就是 Cookie 的个性化服务

场景二:电商登录

你在某电商网站登录后,服务器发给你一张“已登录”凭证(Cookie)。 下次访问时,浏览器自动提交这张凭证,你就不用重新输入账号密码了。 这就是 Cookie 的会话管理功能。


三、Cookie 的核心作用

用途

示例

会话管理

用户登录状态、购物车内容

个性化设置

记住语言、主题、字体大小

用户行为跟踪

统计访问路径、广告点击(需合规)

A/B 测试

根据用户分组展示不同页面


四、Cookie 的工作原理

工作原理
工作原理

五、Cookie 的关键属性

属性

说明

Java 设置方法

Name/Value

键值对数据

new Cookie(name, value)

Max-Age

有效期(秒)

cookie.setMaxAge(86400)(1天)

Path

有效路径范围

cookie.setPath("/app")

Domain

有效域名范围

cookie.setDomain(".example.com")

Secure

仅 HTTPS 传输

cookie.setSecure(true)

HttpOnly

禁止 JS 访问

cookie.setHttpOnly(true)

SameSite

防止 CSRF 攻击

cookie.setSameSite("Strict")

💡 最佳实践建议

  • 敏感信息:使用 HttpOnly + Secure + SameSite=Strict
  • 登录状态:建议设置 Max-Age 为 1-7 天
  • 跨子域共享:设置 Domain=.yourdomain.com

六、Java Servlet 中操作 Cookie

6.1 创建并发送 Cookie

代码语言:java
复制
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException {

        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        // 1. 获取已有 Cookie
        String lastVisit = null;
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("lastVisitTime".equals(cookie.getName())) {
                    lastVisit = cookie.getValue();
                    break;
                }
            }
        }

        // 2. 输出欢迎信息
        if (lastVisit != null) {
            response.getWriter().println("<h3>欢迎回来!上次访问时间:" + lastVisit + "</h3>");
        } else {
            response.getWriter().println("<h3>🎉 欢迎首次访问!</h3>");
        }

        // 3. 创建新 Cookie 记录当前时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(new Date());

        Cookie visitCookie = new Cookie("lastVisitTime", currentTime);
        visitCookie.setMaxAge(60 * 60 * 24);     // 有效期 1 天
        visitCookie.setPath("/");                // 根路径有效
        visitCookie.setHttpOnly(true);           // 防 XSS
        visitCookie.setSecure(true);             // 仅 HTTPS
        visitCookie.setSameSite("Lax");          // 防 CSRF

        // 4. 发送 Cookie 到浏览器
        response.addCookie(visitCookie);
    }
}

6.2 读取 Cookie 的通用方法

代码语言:java
复制
public String getCookieValue(HttpServletRequest request, String name) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }
    }
    return null;
}

6.3 删除 Cookie(设置 Max-Age=0)

代码语言:java
复制
public void deleteCookie(HttpServletResponse response, String name) {
    Cookie cookie = new Cookie(name, "");
    cookie.setMaxAge(0);      // 立即删除
    cookie.setPath("/");
    response.addCookie(cookie);
}

七、Cookie 的安全性问题与防护

风险

说明

防护措施

XSS(跨站脚本)

JS 窃取 Cookie

✅ 设置 HttpOnly=true

CSRF(跨站请求伪造)

恶意网站伪造请求

✅ 设置 SameSite=Strict/Lax

中间人攻击

明文传输被截获

✅ 使用 Secure=true + HTTPS

敏感信息泄露

存储密码等

❌ 禁止在 Cookie 中存敏感数据

🔐 黄金组合HttpOnly + Secure + SameSite=Lax/Strict 是现代 Web 应用中 Cookie 的安全标配


八、Cookie 的限制与挑战

限制

说明

大小限制

每个 Cookie ≤ 4KB

数量限制

每个域名约 20-50 个(浏览器差异)

总大小限制

所有 Cookie 总和约 4KB~8KB

隐私政策

GDPR、CCPA 要求用户同意

浏览器禁用

部分用户会关闭 Cookie


九、Cookie 的替代方案对比

方案

存储位置

安全性

容量

适用场景

Cookie

客户端

中等

≤4KB

会话管理、小数据

Session

服务端

无限制

登录状态、敏感数据

URL 重写

URL 参数

Cookie 被禁用时备用

localStorage

客户端

~5MB

大数据、离线存储

sessionStorage

客户端

~5MB

临时数据、会话级

推荐组合

  • 登录状态:JWT + HttpOnly Cookie
  • 用户偏好:localStorage
  • 购物车:Cookie 或 localStorage

十、Cookie 优缺点总结

✅ 优点

  • 实现简单,兼容性好
  • 减轻服务器存储压力
  • 提升用户体验(自动登录、个性化)
  • 浏览器自动管理(发送、存储)

❌ 缺点

  • 安全性较低(易被窃取)
  • 存在大小和数量限制
  • 可能被用户禁用
  • 涉及隐私合规问题(需弹窗提示)

十一、现代 Web 中的 Cookie 使用建议

  1. 不要存储敏感信息(密码、身份证号等)
  2. 始终启用 HttpOnly Secure
  3. 合理设置 SameSite 属性
  4. 结合 Session 或 JWT 使用
  5. 遵守 GDPR、CCPA 等隐私法规
  6. 提供“清除数据”功能

十二、结语

Cookie 是 Web 开发的基石技术之一,虽然简单,但背后涉及安全、隐私、用户体验等多重考量。

理解 Cookie 的原理与限制,合理使用并做好安全防护,是每一位 JavaWeb 开发者的必修课。

🌐 在前后端分离、微服务、SPA 架构盛行的今天,Cookie 依然在身份认证、会话保持、跨域共享等场景中发挥着不可替代的作用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Cookie 是什么?
  • 二、生活化理解:Cookie 就像“会员卡”
    • 场景一:咖啡店会员卡
    • 场景二:电商登录
  • 三、Cookie 的核心作用
  • 四、Cookie 的工作原理
  • 五、Cookie 的关键属性
  • 六、Java Servlet 中操作 Cookie
    • 6.1 创建并发送 Cookie
    • 6.2 读取 Cookie 的通用方法
    • 6.3 删除 Cookie(设置 Max-Age=0)
  • 七、Cookie 的安全性问题与防护
  • 八、Cookie 的限制与挑战
  • 九、Cookie 的替代方案对比
  • 十、Cookie 优缺点总结
    • ✅ 优点
    • ❌ 缺点
  • 十一、现代 Web 中的 Cookie 使用建议
  • 十二、结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档