cookie 与 session
1. Cookie 和 session概念
1.1 什么是cookie
cookie是服务器发给用户浏览器,并保存在用户浏览器的一小段(key/value键值对)数据。有大小、数量的限制。它会在下一次浏览器请求访问同一个服务器的时候被携带并发送到服务器。它是用来告知服务器两次请求是否来自同一个浏览器。
1.2 cookie的创建
在浏览器中查看set-cookie的属性项:
- Name:Cookie的名称。一旦创建不可更改。
- Value:Cookie的值。
- Domain:Cookie注入的域名,如.baidu.com下的Cookie,只要Host以.baidu.com结尾的域名都能访问该Cookie
- Path:允许使用该Cookie的路径,一般都为 /
- Expires/Max-Age:Cookie失效时间,若没有指定失效时间则默认当浏览器关闭时Cookie失效
- Size:Cookie大小
- HttpOnly:若True,则不允许脚本来访问该Cookie(如:JS)
- ecure:Cookie是否仅被使用安全协议传输,默认为False
服务端通过发送一个称为set-cookie
的http消息来创建一个cookie。
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
1.3 cookie 的分类
- 会话cookie
可以将打开浏览器-关闭浏览器理解成一个会话,会话cookie的有效期仅在浏览器打开期间,而会话cookie是存在浏览器内存里的。
- 持久cookie
是保存在客户端本地硬盘中,不受浏览器关闭的影响,下次再访问该网站时还能继续使用,用于长久保持用户登录状态。
可以设置过期时间。可以勾选【自动登录】、【30天内自动登录】的网站用的就是持久Cookie。
1.4 什么是session
session 代表着服务器和客户端一次会话的过程。
- session对象存储着特定用户会话所需的属性及配置信息。当用户在应用程序和web之间跳转时,存储在session对象中的变量将不会消失,而是在整个用户会话中一直存在下去。当客户端关闭或者session超时失效时会话结束。
- 当用户请求网页时,该用户还有session,则web服务器将自动创建一个session对象。
- 当session过期或被放弃后,服务器终止该session。
2. cookie 和 session 的区别
- 作用范围不同
cookie 是保存在客户浏览器的,session 是保存在服务器的。
- 存取方式不同
cookie 只能保存ASII码,而session可以保存任意数据类型。一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
- 有效期不同
cookie 可以设置为长时间保持,session一般失效时间较短,客户端关闭或者session超时都会失效。
- 隐私策略不同(安全性)
cookie保存在客户端,容易遭到不法获取;session存储在服务器端,安全性相对较高。
- 存储大小不同
单个cookie保存的数据不能超过4k,session可存储数据远大于cookie。
3. 为什么需要cookie 和session
因为cookie 和 session 可以记录用户状态信息。
说起来为什么需要 Cookie ,这就需要从浏览器开始说起,我们都知道浏览器是没有状态的(HTTP 协议无状态)。
什么是无状态协议:
HTTP对事务的处理是没有记忆的,也就是说服务器不知道客户端是什么状态。
当我们向服务器发送请求后,服务器解析处理,返回响应。这个过程是独立的,服务器不会记录前后状态的变化,缺少状态记录。
后果:
如果后续的请求想要处理前面的响应,就必须重传请求,大大增加资源浪费程度。就好像如果一个网站每次发出一个请求前都要先发出一次登录请求,这无疑大大增加了资源浪费程度。
这个时候就需要有一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作,那这套机制的实现就需要 Cookie 和 Session 的配合。
4. cookie 和 session 的配合
- 用户第一次请求服务器时,服务器会根据用户提交的信息,创建对应的session。请求返回时将session的唯一标识sessionID返回给浏览器。
- 浏览器收到服务器响应,将响应头中set-cookie字段的信息,存储到cookie中,记录sessionID属于哪个域名。
- 当用户第二次访问服务器的时候,携带这些cookie。服务端会从cookie中获取sessionID,再根据sessionID查找对应的session信息,如果没有找到说明用户没有登陆或者失效,如果找到该用户可执行后面操作。
5. 如果浏览器中止了cookie,如何保障整个机制的正常运转?
第一种方案:
每次请求都携带sessionID信息,也可以POST方式提交,也可以在请求的地址后面拼接xxx?sessionID=123...
。
第二种方案:
Token
机制。多用于app客户端与服务器交互的模式,也可用于web端做用户状态管理。
意思是“令牌”。是服务端生成的一串字符串,作为客户端进行请求的一个标识。Token 机制和 Cookie 和 Session 的使用机制比较类似。
当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次登录验证。