什么是Cookie
cookie是一些key-value的集合。
用户通过HTTP第一次访问一个服务器的时候,服务器就会把一个cookie返回给客户端,保存在客户端的内存或者硬盘中,同一个用户下次再访问服务器时,就把cookie带上,这样服务器就认出这个用户了。
cookie被加在http头中,作为其中的一个字段,其实就是一串字符串的形式。像这样:
Set-Cookie: userName=”wdx”; Domain=”abc123.net”;
一个cookie有多个属性,除了第一个Name之外,其他的属性名都是固定的,是关于cookie的过期时间、生成域名、路径之类的属性。下面是cookie 1.0 版本的属性介绍:
属性项 | 属性项介绍 |
---|---|
NAME=VALUE | 可以设置保存的key-value,NAME不能和下面的属性重名 |
Version | 默认是0,如果设置为1,那么cookie就要符合RFC2109规范 |
Comment | 注释,用户说明该cookie的用途 |
CommentURL | 服务器为此cookie提供的URL注释 |
Discard | 是否在会话结束后丢弃该cookie项,默认是false |
Domain | 生成该cookie的域名 |
Max-Age | 最大失效时间,1.0版本是设置为多少秒后失效 |
Port | 该cookie在什么端口下可以回传服务器,多个端口用逗号隔开 |
Secure | 若设置此属性,则cookie只在SSH连接时回传 |
所以我们如果要保存多个key-value,就需要创建多个cookie。而用户每次访问服务器都会带着它们,这就造成传输数据量的增加,所以每个浏览器都会限制cookie的数量和大小。
什么是Session
由于cookie有数量和大小的限制,为了解决这个问题,session出现了。
有了session之后,用户只需要携带一个默认名为 JSEESIONID 的cookie去访问服务器,它的 value 是每个用户的唯一ID。
用户第一次访问服务器,会生成这个cookie,并且在服务器端实例化一个 HttpSession 对象,这个对象其实就是个Map,可以用来保存用户的信息。下一次用户再访问服务器,就可以根据ID找到这个session,并读取其中保存的用户信息。
两者的安全性
cookie因为是保存在客户端,所以可以在本地查看,甚至修改,因此安全性不高。
相对来说session就更安全,因为用户信息是保存在服务器端的,发给客户端的只是一个用户ID。