Cookie和Session会使用两个HTTP头,
Set-Cookie` and `Cookie
服务器端会使用Set-Cookie ,需要注意的是Set-Cookie 携带多个Cookie时,需要用 逗号 ,
分隔,每个Cookie 是 name=value
的形式,每个Cookie的属性用分号;
隔开。
例如:
Set-Cookie: user_id=5; Expires=Fri, 5 Oct 2018 14:28:00 GMT; Secure; HttpOnly, remember_me=true
包含两个Cookie : user_id= 5 , 它的属性有过期时间,Secure属性(表示该Cookie客户端只能发送给HTTPS 协议的服务端),HttpOnly属性表示禁止js读取Cookie,可以防止XSS攻击。
第二个Cookie是remember_me=true ,采用默认属性。
客户端会使用Cookie
头,每个Cookie用分号分隔:
例如:
Cookie: user_id=5; remember_me=true
Cookie
Cookie就是当一个用户通过HTTP协议访问服务器时,服务器会将一些Key/Value键值对返回给客户端浏览器。这样做的目的是因为HTTP是无状态的协议,本次请求和下一次请求,服务器如何确认是同一个用户,就可以用Cookie的方式携带一些信息。
Cookie使用流程
Cookie产生和使用的流程是:
1.客户端第一次访问指定的URL
2.服务端接收请求,查看Cookie请求头,如果已经有需要的信息,说明之前访问过。
如果没有,说明是第一次访问,则会在服务端将业务需要的数据通过Set-Cookie响应头
返回给客户端。
3.浏览器收到响应后,会自动保存服务端设置的Set-Cookie并和URL对应。
4.下次浏览器访问时,浏览器会检查Cookie的有效期和相关限制,将该URL对应的所有Cookie设置在请求头Cookie中,传给服务器。
- Chrome中查看Cookie方法:
设置——》高级——》网站设置——》Cookie和网站数据
这样就可以解决客户端和服务端多次请求,身份的认证问题。但是Cookie在客户端保存,不安全,并且有数量限制。
浏览器版本 | Cookie数限制 | Cookie总大小限制 |
---|---|---|
Chrome | 50个/每个域名 | 大于80000字节 |
FireFox | 50个/每个域名 | 4097个字节 |
Cookie如何过期?
1.服务端可以设置Cookie的过期时间
例如:
cookies
.set(:current_user_id, 123)
.expires(1.year.from_now)
.http_only(true)
这样,客户端就会在过期时间到了,删除浏览器中保存的Cookie。
2.如果没有设置过期时间,则会在浏览器关闭后,清空该Cookie
Session
Session并非是HTTP协议中的内容,Session是为了解决Cookie存证的一些问题,比如安全和大小限制等,将数据保存在服务端,交互时,只通过Cookie传递SessionId,来保证数据的安全性 和存储的灵活性。
Session允许同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,而是只要传回一个ID,这个ID是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的ID,客户端只要传回这个ID就行了。这个ID通常是NAME为JSESSIONID的一个Cookie。
Session的使用流程是:
1.客户端第一次访问服务器
2.服务器判断是否携带了值类似JSESSIONID=42D1ED74CB19755C0C26FBA8C2B73B4A的Cookie,如果携带了,会通过对应的JSESSIONID查找对应的Session对象,Session对象中存了该客户端的信息。如果没有携带,Tomcat会根据随机数+时间+jvmid生成一个JSESSIONID,放入Set-Cookie响应头
3.客户端保存Cookie,之后每次请求该URL时携带Cookie 值为JSESSIONID
JAVA中Session的生成过程
Session过期时间
Java中Session的默认过期时间是30分钟,过期后,会删除Session对象。
可以通过设置修改Session过期时间。
小结
Cookie是HTTP协议中的内容,Session的使用也是基于Cookie,Session可以将数据保存在服务器端的内存,或者持久化到磁盘,或使用redis等存储。
Cookie的内容较多,建议详细内容查看下面的链接
https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
http://browsercookielimits.squawky.net/