Cookie
简介:
HTTP是无状态的,服务器无法记录收到的每一次请求,意味着服务器无法识别不同的请求是否来自相同的客户端。
Cookie是服务器创建的一个对象,在收到客户端请求后,携带在响应头(Set-Cookie)中返回给客户端,客户端将Cookie存到本地,在下一次请求中将Cookie信息放到请求头发送给服务器;一定程度上解决了HTTP无状态带来的问题。
应用:
会话状态管理(商城购物车、保存用户的登录状态、游戏分数等)
个性化设置(用户自定义设置、主题等)
浏览器行为跟踪(跟踪分析用户行为)
缺点:Cookie是明文的,安全性差;数据不稳定,用户可以手动删除Cookie
字段:
字段 | 介绍 |
Secure | 标记了Secure的Cookie,只能通过被HTTPS加密过的请求发送给服务器。从Chrome52和FireFox52开始,不安全(http:)的站点无法使用Secure |
HttpOnly | 设置了httponly标记的Cookie无法用document.cookie获取;避免了跨域脚本攻击(XSS) |
Domain | 标识指定了哪些主机可以访问Cookie;设置可以访问此Cookie的域名;如果不设置,默认为当前文档的主机(不包含子域名) |
Path | 标识指定了主机下哪些域名可以接受该Cookie,子路径也会被匹配 |
SameSite | 服务器要求某个Cookie在跨站请求时不会被发送,从而阻止跨站请求伪造攻击(CSRF);值为none:浏览器会在同站请求、跨站请求下发送Cookie,不区分大小写;值为Strict: 浏览器只会发送相同站点请求的Cookie;Lax:默认值,将会为一些跨站子请求保留,如图片加载或frames的调用,但只有当用户从外部站点导航到url时才会发送,如link链接。 |
服务器端可以用Cookie对象的setMaxAge(n)方法设置Cookie的有效期,以秒为单位
HTTP跨域请求时,如何携带Cookie:
AJAX请求通常会被浏览器应用同源策略,禁止获取跨域数据,以及限制发送跨域请求。
客户端设置:设置withCredentials为true,即可让跨域请求携带Cookie;携带的Cookie为目标页面所在域的Cookie。
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.withCredentials = true
xhr.send()
目标服务器设置:Access-Control-Allow-Credentials响应头设置为true
Access-Control-Allow-Origin设置指定单一域名;那么服务器可能需要维护一个接受 Cookie 的 Origin 列表, 验证Origin请求头字段后直接将其设置为 Access-Control- Allow-Origin 的值。 (这一实践来自 Stackoverflow) 值得注意的是在 CORS 请求被重定向后Origin头字段会被置为null。 此时可以选择从 Referer头字段计算得到 Origin。
Session:
由于HTTP是无状态的,所以服务器不会记得是哪个用户发送的请求,无法满足交互式的页面。
服务器给每一个访问自己的用户发送一个会话标识(session id),然后将session id存储起来;用户在以后的请求中都会把session id发送给服务器,这样服务器也就知道了是哪个用户的请求。
Session使服务器和客户端可以进行会话,服务器会对session id进行验证,验证session id确实是自己生成的,也就确定了该用户是合法登录的用户。这样就挡住了伪造session id的不法狂徒。
缺点:访问服务器端用户多了,存储的session id太多,影响服务器性能,严重限制了服务器的扩展能力
Token:
session的关键就是服务器验证session id确实是自己的,但是存储大量session id也造成了服务器的负担;使用token可以解决这个问题;
当有用户访问服务器的时候,服务器就给用户发送一个令牌(token),令牌中包含user id,下一次用户访问的时候,把令牌一起发送给服务器。
发送给用户的token,由签名和数据组成;签名由某个算法和只有服务器知道的密钥形成,由于别人不知道密钥,也就无法伪造token。
服务器不需要保存token,当服务器收到用户发送过来的token时,对数据再计算一次签名,如果和token中的签名相同,就知道该用户已登录并且获取用户的user id;
如此一来,服务器就只需要生成token,以及验证token
Cookie、localStorage、sessionStorage区别:
Cookie | localStorage | sessionStorage |
cookie在服务器和浏览器之间来回传递 | 不会主动发送给服务器 | 不会主动发送给服务器 |
过期时间之前一直有效 | 始终有效,窗口或浏览器关闭也一直保存 | 在当前窗口关闭前有效 |
在所有同源窗口中共享,存储的数据小于4KB | 在所有同源窗口中有效 |
- SessionStorage LocalStorage Session Cookie Tokensessionstorage localstorage session cookie sessionstorage localstorage cookie sessionstorage localstorage router cookie session cookie token 前端sessionstorage localstorage cookie session cookie token jwt session cookie token发展史 javaweb session cookie token session cookie token sign session方式cookie token