cookie是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。
四种会话跟踪技术(URL重写、隐藏表单域、Cookie、Session)
服务端技术:URL重写,Session,Cookie。
客户端技术:Cookie,隐藏表单域。
web2.0应用趋势是动态页面加载,通过Session或URL重写识别用户,保存用户状态。
web3.0应用趋势是前后端分离,通过基于cookie的token识别用户,获取用户状态。
PS:token建议存放在cookies,而不要存放在LocalStorage 和 SessionStorage。
原因:LocalStorage 和 SessionStorage可以被js读取,而cookies 可以设置httponly 和secure 属性,提高鉴权机制安全性。
cookie的特点
同域,默认带请求凭据(cookie)
跨域,默认不带请求凭据(cookie)
session-cookie,关闭浏览器会删除,会话结束或者会话超时就删除。
cookie,关闭浏览器不会被删除,除非设置了expires/Max-Age,或者是浏览器清除cookies。
cookie被篡改问题
给cookie生成一个签名。
本地调试使用loaclhost跨域设置cookie问题。
以java为例(参考代码)
//设置http请求头 HttpResponse response = null; HttpPost post = new HttpPost("http://www.xxx.com"); post.addHeader("Access-Control-Allow-Credentials", true); // Access-Control-Allow-Origin 不能设置通配符号,必须指定域,如果是本地就设置http://localhost:xxx post.addHeader("Access-Control-Allow-Origin", "http://www.xxx.com");
//设置cookie Cookie cookie = new Cookie("cookie", "1"); //设置cookie过期时间 cookie.setMaxAge(24 * 60 * 60); //一定要设置cookie的path属性,否则会获取不到值(undefined) cookie.setPath("/");
PS: 如果允许请求带cookies,会把所有的请求(图片,音视频,css,js)等资源都会发送cookies,从而降低了页面性能。
为此要使用CDN静态部署资源,避免静态资源请求发送cookie,提高请求的效率,节省请求带宽。