什么是Cookies?
- http 是无状态的协议 每个请求都是完全独立的 服务端无法确认访问者的身份信息,无法分辨上一次请求者和这一次的请求者是不是一个人,所以服务器与浏览器为了进行会话的跟踪,就必须主动维护一个状态,这个状态用于告知服务器前后两个请求是否来自同一个浏览器, 而这个状态主要是通过cookie或者session来实现。
- cookie是存储在客户段的,cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向服务起发送请求的时候被携带并发送到服务器上
- cookie是不可跨域的 每个cookie都会绑定在单一的域名下,无法在别的域名下使用,一级域名 和 二级域名允许共享使用(靠的是domain)
- 如果值为Unicode字符,则需要为字符编码,如果为二进制数据,则需要用base64编码,
- domain指定cookie所属的域名,默认当前域名
- path指定cookie在那个路径下生效 默认为’/‘, 如果path设置为/abc,则只有在/abc的路由下才可以访问cookie, 如/abc/read. domain和path共同决定了cookie的有效范围
- maxAge 设置cookie的失效时间,单位是秒, 如果是正数,那么就会在maxAge秒之后失效, 如果是负数,该cookie为临时cookie,关闭浏览器就会失效,如果是0,表示删除该cookie, 默认值是-1
- secure 表示是否使用安全协议传输, 默认为false 设置为true的时候,cookie只有在https中才有效 ,在http中无效
如果给cookie加了httpOnly属性,那么cookie在只能在http中传输, 不能通过js脚本修改,所以可以在一定成都上防止xss攻击
什么是session ?
session 是另外一种记录服务器和客户端会话状态的机制
- session是基于cookie实现的。session存在服务端,sessionId 是存储到客户段的cookie中的
session 的认证流程
- 用户第一次请求服务器的时候,服务器根据用户提交的信息,创建session
- 请求返回时,将此session的唯一表示sessionID 返回给浏览器
- 浏览器讲sessionID 存储在cookie中 ,同时记录cookie是属于那个域名的
- 当第二次请求浏览器的时候,请求会自动带着cookie去服务端,服务端从cookie中取出sessionId,在根据sessionID查找对应的session信息, 如果没有找到说明用户没有登录或者登录显示失效。
cookie 与 session的区别
- session是存储在服务端的, cookie是存在客户段的, 所以session比较安全
- 存储值的类型不同, cookie只支持字符串的,想要存其他类型的数据,需要转换为字符串 ,session 可以存储任意类型的数据
- 有效期不同, cookies可以设置较长的时间, 但是session 一般的失效都比较短, tomcat中默认session的有效期是30分钟,但是假如cookie的有效期很短,导致cookie失效,同时也就拿不到cookie中的sessionId了,那么即使不到30分钟,session也失效了。有很多人说客户端关闭了session就失效了,其实是说客户端关闭了,cookie中的sessionId就失效了,那么session就失效了, 但是假如实在cookie的过期时间内重新打开打开浏览器并访问服务器就不会失效了。
- 存数的大小不同,单个cookie不能超过4k, Session的存储远高于Cookie。但是当访问过多,就会占用过多的服务器资源