Cookie与Session
...大约 3 分钟
Cookie与Session
Cookie与Session
Cookie用于解决HTTP无状态,但存在被劫持,篡改,盗用的风险。
Session是基于Cookie的解决HTTP无状态,但是会对服务器造成额外开销,增加服务器压力。
Cookie和Session有区别的核心原因在于内容的存储位置:Cookie存储在客户端,Session存储在服务端。
区别 | Cookie | Session |
---|---|---|
存储位置 | 客户端(浏览器) | 服务端 |
存储数据类型 | 一般为string类型 | 使用的语言所支持的数据结构 |
安全性 | 安全性稍差 | 较Cookie更安全 |
生命周期 | 可以长期保存 | 一般在关闭客户端后过期 |
灵活性 | 稍差 | 更灵活(可以存储在服务端,任意一个允许存储的地方) |
跨域问题 | 不能跨域 | 默认不能跨域 |
引申:浏览器禁用了cookie,Session还能使用么?
session依赖cookie 只是用cookie储存session ID,如果cookie被禁用,我们还可以用一下方式储存session ID 从而实现浏览器与服务器的交互。
- URL重写:把session ID 加到URL中发送给服务器,服务器识别session ID返回操作,后续的交互就会携带session ID。
- 把session ID 作为隐藏字段放到表单中,传送表单时将session 传给服务端,从而解决接下来的交互行为。
- 通过HTTP协议将session ID储存在header字段中传递给服务端,从而解决问题。
- 通过HTML提供的API协议来储存session ID,通过页面共享将session ID 传给服务端,实现简单的会话管理。
如果要实现不同域名下的cookie正常使用,应该怎么处理?
设置 Cookie 的域名属性: 当设置 Cookie 时,可以通过指定域名属性来确保 Cookie 在不同子域名之间共享。例如,如果你希望 Cookie 在
example.com
和subdomain.example.com
之间共享,则可以设置 Cookie 的域名属性为.example.com
(注意前面的点号),这样 Cookie 就可以在所有以example.com
为结尾的子域名下共享。document.cookie = "name=value; domain=.example.com; path=/";
设置跨域资源共享(CORS): 如果是通过 AJAX 或 Fetch 发起的跨域请求,需要在服务器端设置适当的 CORS 头来允许跨域请求。服务器响应中应包含
Access-Control-Allow-Origin
头,并设置为允许访问的域名。例如:Access-Control-Allow-Origin: https://example.com
使用代理: 如果跨域请求不能通过上述方法解决,可以考虑在服务器端设置代理,即在同一域名下创建一个中间层,由该中间层代理请求到其他域名,然后再将结果返回给客户端。这种方法可以绕过浏览器的同源策略限制。
设置 Cookie 的路径:确保路径参数设置为 Cookie 所在的路径。通常,将路径设置为根路径
/
是最简单和最通用的方法,使得 Cookie 在整个网站的所有页面中可用。document.cookie = "name=value; domain=.example.com; path=/";