http协议是无状态的,在很多场景下往往需要保持会话状态,因此cookie和session应运而生。
cookie
cookie的内容就是保存的一小段文本信息,这些文本信息组成了一个通行证。
存在本地的Cookies实际上是一个sqlite数据库文件
key-value的数据:
● name:cookie的名称
● value:cookie的值
● max-age:生存周期,max-age用秒来设置cookie的生存期
- max-age属性为正数,则表示该cookie会在max-age秒之后自动失效
- max-age为负数,则表示该cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该cookie即失效。
- max-age为0,则表示删除该cookie
● domain:Cookie 所属的域 path:Cookie 来源的网址路径
● secure:该Cookie是否仅被使用于安全协议传输。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。
● httponly:指示 Cookie 应仅由浏览器在 HTTP 请求中设置,而无法通过 JavaScript 访问。
以自动填充用户名和密码登录为例介绍cookie:
当我们登录某个网站时,在输入账号和密码之后,当勾选记住密码,点击登录后,浏览器会将表单上的数据作为登录请求的内容发送到服务器,服务器接收到登录请求后,会对记住密码判断是否勾选,如果勾选,就会设置set-cookie字段(里面是一些键值对),然后在响应的头部中放入该字段,然后返回给浏览器。浏览器在接收到响应之后,会查看是否有set-cookie信息,如果有,就会将服务器发挥的cookie信息存储起来。
当用户再次打开此登录页面时,浏览器发送获取登录页面的http请求,此时会将cookie放到请求的头部。服务器端接收到请求后(另外,登录后发送其他请求时由于会将cookie一起发送到服务器,服务器可以通过分析cookie中的内容,得到客户端的特有信息,比如:知道用户名)返回登录的页面http响应,浏览器加载并渲染该登录页面,登录页面中的js代码会检查并获取到cookie中的登录信息,如果当前的cookie在有效期内,便会提取到账号密码填入到表单中,此时便完成了自动填充账号密码。
- 关于cookie的生存周期
cookie并不是关闭浏览器后就会自动清除,它的生存周期可以通过查看cookie的maxAge属性获得,如果该属性值为session,表示和session一起失效。 - cookie不可以跨域名、跨浏览器使用,这是其隐私安全机制决定的。因此你在一个网站记住的账号密码,在另一个其他网站是不可以使用的,即使二者完全一样。
session
session的原理
cookie虽然可以记录会话状态,但是由于其存储在客户端,用户是可见的,并且可以随意地修改,其安全性无法得到保证。而session是存储在服务端的,其安全性更高。
session的工作原理如下:
- 服务器程序运行的过程中产生session,并且为该session生成唯一的session ID
- 这个session ID在随后的请求中会被用来重新获得已经创建的session。在session创建后,就可以调用session相关的方法向session中增加内容,这些内容只会保存在服务器中。
- 服务器将session ID发送给客户端
- 客户端再次发送请求时,会将这个session ID带上
- 服务器接收到请求之后,根据session ID找到相应的session,完成请求响应。
session的传输媒介
第一种方式:通过cookie传输
session的信息保存在服务器端,但是它对客户端是透明的,他的正常运行需要客户端浏览器的支持,因为session需要使用cookie作为识别标志。服务器会向客户端发送一个关于session的cookie,它的值为该session的ID。后续客户端发送消息时,只需要在cookie中带上这个session ID即可。
第二种方式:通过URL地址重写
如果客户端浏览器禁用cookie或者不支持cookie,此时对于session的传输方法就需要利用URL地址重写。
它的原理是将该用户的session ID信息重写到URL地址中,服务区能够解析重写后的URL,获得session的ID,这样即使客户端不支持cookie,也可以使用session来记录用户状态。
session的生存周期问题:
session的生存周期可以通过cookie中的session ID的expire字段来查看,如果该值为-1表示只要关闭该窗口,session就会失效。
二者的区别
● 存储位置不同
○ session存储在服务器端,cookie存储在浏览器端
● 生命周期不同
○ session依赖于jessonid的cookie,它的过期时间默认为-1,只要关闭窗口该session就会失效。session不能达到长期有效的效果,即使利用url重写也不行,因为如果session设置的超时时间过长,服务器累计的session过多,会导致内存溢出。服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效(可以人为设置)
○ cookie也可以预先设置生命周期,或者是永久的保存在本地文件中存储内容的
○ 服务器如何设置cookie失效,通过在返回的响应中设置cookie的失效时间
● 格式不同
○ cookie只能保存ASCII字符串,Cookie中使用Unicode字符时需要对Unicode字符进行编码,使用二进制数据时需要使用BASE64编码
○ session能够存储任何类型的数据,string,map,list等
● 安全性
○ session存储在服务器上,对用户是不可见的,所以会更加安全
○ cookie保存在本地浏览器文件中,对用户是可见的,可以人为操作,不安全
● 对于服务器压力不同
○ session是被存储在服务器上的,如果并发量大,会产生那个非常多的session,内存消耗大
○ cookie是存储在本地浏览器上的,不占用服务器资源,适合高并发场景
● 浏览器支持不同
○ cookie需要浏览器支持,而sesson可以通过URL重写进行会话跟踪。
● 跨域支持不同
○ cookie既能够设为本浏览器窗口及子窗口有效(maxage为-1),也可以设置为一切窗口有效(max-age为正数)
○ session仅在本窗口及其子窗口内有效
● 使用的场景目的不同
○ session更多的作用是通过服务端记录用户的状态,知道是哪一个用户
○ cookie更多的是存储用户的信息,比如记住登录等