关于cookie

本文澄清了关于Cookie的几个常见误解,例如Cookie不会感染硬盘、产生弹窗或用于垃圾信息传播等。同时介绍了Cookie如何帮助网站记住用户信息,并在网站分析和广告监测中的作用。

 

 

原文地址:http://yhz61010.iteye.com/blog/708377

 

 

关于什么是first-party cookie(第一方cookie)及third-party cookie(第三方cookie),在这里不是我主要想介绍的,因为关于这方面的资料网上有很多。如果有不太清楚的读者,可以参看下面的地址: 

推荐:第一方cookie及第三方cookie的介绍(中文版) 
http://www.chinawebanalytics.cn/%E6%8D%8D%E5%8D%ABcookie%E2%80%94%E2%80%94%E6%B2%A1%E6%9C%89cookie%EF%BC%8C%E6%88%91%E4%BB%AC%E4%BB%80%E4%B9%88%E9%83%BD%E6%B2%A1%E6%9C%89%E4%BA%86/
cookie的介绍: 
http://baike.baidu.com/view/835.html 
wikipedia对cookie更全面的介绍: 
http://en.wikipedia.org/wiki/HTTP_cookie 
第一方cookie及第三方cookie的介绍(英文版) 
http://www.opentracker.net/en/articles/all-about-cookies-third-party.jsp 

    今天我主要想讲的是人们对于cookie的普遍误解。 

    很多人都认为,cookie尤其是third-party cookie会泄露用户的隐私,不安全。其实这是对cookie的误解。 

    总结一下常见的误解: 
・Cookies are like viruses in that they can infect the user's hard disks. (cookies就像病毒一样,它们能感染用户的硬盘) 
・Cookies generate pop-ups. (cookies会产生弹出窗口) 
・Cookies are used for spamming. (cookies被用于传播垃圾信息) 
・Cookies are used only for advertising. (cookies只用于广告) 

    首先需要说明的是,cookies不是程序,不能被执行,它只用作存储信息,因此cookies不会删除或读取用户计算机上面的信息。 

    cookies可以被用来监测用户访问指定网站的访问历史及访问情况(如,cookies会记录用户访问指定网站的时间,访问的页面等等)。但是这些信息并不包含用户的个人隐私,而且cookies只能被拥有它的域访问,并且cookies中的信息一般都是经过加密后的,只用拥有访问权限的服务器才能正确的解密,因此cookies也不会泄露个人隐私。 

    上网的人都可以遇到过这样的情况,访问一个网站时(如,人人网)可能需要输入用户名及密码,此时网站一般都提供“下次不再输入密码”之类的选项,如果用户选择此选项后,那么当Ta再次访问这个网站时就可以直接进入,而不需要再添写验证信息。那么,网站是如何“记住”用户的验证信息呢?答案是cookies。这是cookies最常见的应用。 

    对于网站分析而言,Unique Visitor信息,及用户的访问信息都存放在cookies中。(如,GA)现在,大多数Web Analytics工具都依赖于cookies对访问者信息进行跟踪。因此,cookies的用途远远不止是应用在广告上面而已。 

    当然,cookies在广告上的应用还是很广泛的。 

    广告运营商为了监测自己的广告效果,往往要使用third-party cookies(third-party cookies的解释见前文的链接)。我们知道,cookies只能被创建它的域所以使用,这样的话,广告运营商就无法监测自己的广告效果。这时third-party cookies就发挥了它的优势。 

    举例说明:Bugatti在sina网上做了个汽车的广告,当用户访问sina时,sina会在用户的机器上生成一个first-party cookies供自己使用,然后sina还会为Bugatti生成一个third-party cookies供Bugatti使用(这个cookies sina反而无法访问),此时Bugatti就可以利用该cookies记录用户的访问情况,并为其提供相关的访问信息。 

    至于说cookies会产生弹出窗口,我还真不知道是从何产生的这个误解(如果大家知道是什么原因产生的这个误解,欢迎大家告诉我啊。 :)),因为对HTML和JavaScript稍稍有一些了解的人都会知道,pop-up窗口和cookies基本没什么关系,是风马牛不相及的两件事。除非是恶意网站将pop-up程序的代码写到cookies中,然后再将其读出,可能这样才会产生pop-up。但是我想,凡是正常的网站应该没有人会这么做。 

    说cookies被用于传播垃圾信息,现在垃圾邮件,垃圾信息是不少,但是和cookies应该没什么关系啊。我们很可能是在网络上不小心泄露了自己的email或其它个人信息,才酿成此罪的。刚才我们说了,cookies并不是用户机器生成的,而是服务器产生的,并且只能被指定的服务器所使用。只要是访问正常合法的网站,服务器是不会往cookies中写入多余的信息的,更不会使用cookies来传播垃圾信息。我想,认为cookies被用于传播垃圾信息,可能是因为cookies中存储了没有加密的用户信息,不法分子或别有用意的网站利用其取得的信息,给用户发送垃圾信息。 

    cookies是清白的,也是重要的,对于网站分析而言,cookies更是离开的(对大多数网站分析工具而言),我们能做的,就是对cookies有一个正确的认识,不要再冤枉它了。

<think>我们来实现一个完整的Spring Boot示例,展示如何使用Cookie和Session进行用户状态管理。 需求:用户访问/login进行登录(模拟),服务器创建会话并将用户信息存入session,同时返回一个包含session ID的Cookie。 当用户访问/profile时,通过Cookie中的session ID获取用户信息。 步骤: 1. 创建Spring Boot项目,添加Spring Web和Spring Session依赖(这里使用内存session,生产环境建议Redis) 2. 实现登录接口,设置Cookie 3. 实现个人资料接口,从Session读取数据 注意:为了简化,我们使用内存Session(默认)并模拟用户登录。 依赖(pom.xml): <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> 代码实现:</think>### Cookie与Session实践示例:用户登录状态管理 以下是一个完整的Spring Boot实现,展示如何通过Cookie传递Session ID并在服务端管理用户状态: ```java import org.springframework.web.bind.annotation.*; import javax.servlet.http.*; import java.util.*; @RestController public class AuthController { // 模拟用户数据库(实际应使用数据库) private static final Map<String, String> USER_DB = Map.of( "admin", "admin123", "user", "password" ); // 登录接口:验证凭证并创建会话 @PostMapping("/login") public ResponseEntity<String> login( @RequestParam String username, @RequestParam String password, HttpServletRequest req, HttpServletResponse res ) { // 1. 验证用户凭证 if (!USER_DB.containsKey(username) || !USER_DB.get(username).equals(password)) { return ResponseEntity.status(401).body("用户名或密码错误"); } // 2. 创建唯一会话ID String sessionId = UUID.randomUUID().toString(); // 3. 在服务端存储Session数据(实际应使用Redis) HttpSession session = req.getSession(true); session.setAttribute("username", username); session.setAttribute("loginTime", new Date()); session.setMaxInactiveInterval(30 * 60); // 30分钟超时 // 4. 设置安全Cookie传递Session ID Cookie sessionCookie = new Cookie("SESSION_ID", sessionId); sessionCookie.setHttpOnly(true); sessionCookie.setSecure(true); // 生产环境应开启HTTPS sessionCookie.setPath("/"); sessionCookie.setMaxAge(30 * 60); // 与Session超时一致 res.addCookie(sessionCookie); return ResponseEntity.ok("登录成功!"); } // 个人资料接口:通过Session获取用户数据 @GetMapping("/profile") public ResponseEntity<String> profile(HttpServletRequest req) { // 1. 获取Session对象(不自动创建新Session) HttpSession session = req.getSession(false); // 2. 验证会话有效性 if (session == null || session.getAttribute("username") == null) { return ResponseEntity.status(401).body("请先登录"); } // 3. 返回个性化数据 String username = (String) session.getAttribute("username"); Date loginTime = (Date) session.getAttribute("loginTime"); return ResponseEntity.ok(String.format( "用户: %s\n登录时间: %tT\n会话ID: %s", username, loginTime, session.getId() )); } // 登出接口:销毁会话 @PostMapping("/logout") public ResponseEntity<String> logout(HttpServletRequest req, HttpServletResponse res) { // 1. 使当前Session失效 HttpSession session = req.getSession(false); if (session != null) { session.invalidate(); } // 2. 清除客户端Cookie Cookie cookie = new Cookie("SESSION_ID", null); cookie.setPath("/"); cookie.setMaxAge(0); // 立即过期 res.addCookie(cookie); return ResponseEntity.ok("已退出登录"); } } ``` ### 关键安全机制说明 1. **会话固定攻击防护** ```java // 登录成功后重置Session ID req.changeSessionId(); ``` 2. **会话劫持防护** ```java // 绑定客户端指纹 String fingerprint = req.getHeader("User-Agent") + "@" + req.getRemoteAddr(); session.setAttribute("client_fingerprint", sha256(fingerprint)); // 每次请求验证指纹 public boolean validateFingerprint(HttpServletRequest req) { String current = req.getHeader("User-Agent") + "@" + req.getRemoteAddr(); String stored = (String) req.getSession().getAttribute("client_fingerprint"); return stored != null && stored.equals(sha256(current)); } ``` 3. **Cookie安全属性强化** ```properties # application.properties配置 server.servlet.session.cookie.http-only=true server.servlet.session.cookie.secure=true server.servlet.session.cookie.same-site=lax ``` ### 测试流程 1. **登录** ```bash curl -X POST http://localhost:8080/login \ -d "username=admin&password=admin123" \ -c cookies.txt ``` 2. **访问个人资料** ```bash curl -b cookies.txt http://localhost:8080/profile # 返回:用户: admin 登录时间: 14:30:25 会话ID: D2E5F7... ``` 3. **登出** ```bash curl -X POST -b cookies.txt http://localhost:8080/logout ``` ### 会话存储优化(Redis集成) ```java // 添加依赖:spring-boot-starter-data-redis @Configuration @EnableRedisHttpSession public class RedisSessionConfig { @Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(); // 默认连接localhost:6379 } } ``` > 配置后Session自动存储在Redis,支持分布式扩展
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值