Cookie/Session的机制与安全
1: 什么是 Cookie?
1:Cookie是由客户端保存的小型文本文件,其内容为一系列的键值对。Cookie 一般是由HTTP服务器设置的,保存在浏览器中。客户端也可以设置 Cookie。
2:Cookie具有不可跨域名性。
3:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。
2: 什么是 Session?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。
3: Session的有效期
由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
当同一机器的两个浏览器窗口访问服务器时,会生成2个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口除外,这类子窗口会共享父窗口的Cookie,因此会共享一个Session。若双击桌面浏览器图标等打开的窗口则会有2个不同的Session,。
这个跟客户端的 sessionStorage 设置的值保存状态很像。(具体点击链接查看 cookie sessionStorage localStorage区别)
4: 如何创建一个 Session
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
例如:
// JSP中内置了Session隐藏对象
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
5: cookie 如何做到永久登录?
1: 用户提交用户名和密码的表单,这通常是一个POST HTTP请求。
2: 服务器验证用户名与密码,如果合法则返回200 的HTTP响应, 并设置cookie 的userName, password 和 Cookie的有效期。
3: 浏览器存储该Cookie。
4: 浏览器再发送请求时, 就会把cookie里的 userName 和 password 发送给服务器。
5: 服务器收到第2次请求,与数据库进行比较,验证成功,则处理当前用户已经登录。
把 password 等敏感信息保存到 cookie 中, 比较危险, 一种方案是把 password 加密保存到数据库, 下次访问时解密并且与数据库比较。但是因为Cookie是明文传输的,因此Cookie中最好不要放敏感数据。
6: session 如何做到永久登录?
1: 用户提交用户名和密码的表单,这通常是一个POST HTTP请求。
2: 服务器验证用户名与密码。如果正确则把当前用户对象(包括用户名和密码)存储到redis中,并生成它在redis中的ID。
这个ID称为Session ID,通过Session ID可以从Redis中取出对应的用户对象, 比如密码 都存储在这个用户对象中。
设置Cookie为sessionId=xxxxxx并发送HTTP响应。
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
3: 浏览器存储该Cookie。
4: 浏览器再发送请求时, 就会把cookie里的sessionID 发送给服务器。
5: 服务器收到第2次请求,发现Cookie中有SessionID,根据该ID从Redis中取出对应的用户对象,查看该对象的状态并继续执行业务逻辑。
参考地址: