一篇搞懂cookie和session
一篇搞懂cookie和session
cookie、session和token存在的意义是什么?
http是无状态的,每次请求是独立的,服务端不保存会话信息,所以他的好处也就是快,但缺点也显而易见,就是无法对不同用户进行区分。
什么是cookie?
cookie存储于客户端,请求后由服务器发送回浏览器,下次访问同一服务器时,将cookie作为参数携带至服务器。cookie是浏览器实现的一种数据存储功能,是name=value的键值对。
优点:不占用服务器资源,效率高。
缺点:数据安全性较低。
什么是session?
session基于cookie实现,存储于服务端,sessionID会被存储到客户端cookie中,浏览器第二次访问服务器时,服务器从cookie中获取sessionID查找对应session信息,存在说明用户已登录。
优点:安全性较高。
缺点:占用服务器资源,可能会占满,多台服务器下又会出现session存储在其中一台服务器上,其他服务器没法使用的情况,可以用redis服务器去解决,所有服务器都去调用redis服务器。
cookie和session区别
cookie存于客户端,session存于服务器。
cookie中数据不能超过4k,session存储空间大于cookie。
cookie只能存字符串,其他类型会被转为字符串类型,session可存储任意数据类型。
cookie的安全性比session低。
cookie和session执行流程
浏览器第一次向服务器发送请求,服务器检查是否有携带JSESSIONID的cookie。
如果存在,将cookie值取出,在服务器的session池中找到对应的session进行是否登录的校验。
如果不存在,服务器会创建一个session对象,并随机生成一个唯一的sessionID,保存到session池中,在响应浏览器时服务器会在http包的header中创建一个建为JSESSIONID,值为sessionID的cookie对象包含在Set-Cookie属性中返回给浏览器,浏览器将其存储起来下次访问时携带。
用户登出时,服务器会将session销毁,并生成新的JSESSIONID返回给浏览器,浏览器下次携带给服务器后通过JSESSIONID找不到对应的session说明用户是第一次登录。
不一定非要cookie和session配合使用,例如只用cookie也能实现相同功能,但将用户信息存放在cookie是有很大安全风险的,而将sessionID存放在cookie中则没有影响。
cookie的失效时间(会话cookie和持久cookie)
会话cookie
不设置过期时间,cookie保存在内存里,浏览器关闭,cookie就消失。
持久cookie
设置过期时间,setMaxAge(…),cookie保存在硬盘,只有时间过了才会失效。