关于cookie和session的一些思路整理

本文详细介绍了Cookie和Session的原理与应用场景。Cookie作为客户端会话存储方式,用于跟踪用户状态,通过max-age属性控制有效期,携带有限制的域名和路径。Session则将数据存储在服务器端,通过SessionID在客户端和服务器间保持会话,安全性相对更高,但会增加服务器负载,且在分布式环境中管理复杂。同时,文章讨论了两者在安全性上的考量,如大小限制、加密处理和HTTPOnly标志等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先cookie和session都是用来记录信息的。这些信息记录工具的产生,是因为:HTTP协议是无状态的

Web应用程序是使用HTTP协议传输的,客户端请求+服务端响应 就形成一次会话。而HTTP协议的无状态性意味着,我一次请求和响应结束之后,下一次请求会重新建立连接,而服务器没法从这次的HTTP请求里得知之前的会话发生了什么。比如我上一次会话的时候把一件商品放入了购物车,等下一次我再登录的时候,购物车里就没商品了,这样可不行,所以要采取办法跟踪会话。

Cookie机制

cookie是客户端访问服务器之后,服务器向客户端派发的一个“证件”,里面保存了一些需要跟踪的信息,浏览器拿到cookie之后保存下来(*①保不保存要依据cookie的maxAge属性),等下次客户端再发起请求就会带上cookie(*②带不带要根据访问是否同源),服务器通过cookie保存的值来 辨别用户、获取之前的状态…

*①保不保存(有效期):cookie有max-age属性,值是一个以为单位的值,表示有效期

  1. 默认值-1,表示这个cookie不会被持久化保存,它只存在于内存中,当前页面关闭就会失效;
  2. 值设为正数,表示cookie在这个秒数内有效,会对cookie做持久化保存到cookie文件,这个时间之后就会失效;
  3. 值设为 0,表示删除这个cookie,因为cookie没有提供删除cookie的方法,所以把这个cookie的生存时间设为0,让它直接失效。(对于已经存在的cookie,如果想让它失效,可以让后端再返回一个 同名、同域名、同路径 的cookie,把max-age设为0,进行覆盖)

*②请求的时候带不带:cookie的携带有 域名、路径 的限制,默认只会在同源请求中携带。比如 我访问google返回给我google的cookie,我访问baidu返回给我baidu的cookie,那我再去访问百度的时候,自然不应该带上google的cookie。(当然,跨域请求如果想带上cookie也是可以配置的,只不过默认是不带的)

总的来看下cookie有哪些常用属性:

  1. name:cookie的名字
  2. value:cookie记录的信息,以键值对的形式保存
  3. domain:允许携带这个cookie的域名
  4. path:允许携带这个cookie的路径,cookie的携带需要遵守这两个属性,一个页面只能获取其所属path的cookie
  5. Max-Age/Expires:表示有效期,也决定了cookie是会持久化存储,还是只是会话中的cookie
  6. Secure:表示cookie是否只在安全的HTTPS协议通信的时候发送(毕竟HTTP不安全)
  7. HTTPOnly:这项设为true可以防止脚本获取cookie(document.cookie)

安全性问题:cookie要随着请求和响应再客户端和服务端之间来回传输,一方面不能太大,只能放一些精简的信息,大小不超过4k;另一方面,安全性也是个问题(也是可以对信息做加密的,然后服务端用同样的加密算法进行验证)

Session机制

session是对客户端和服务器端会话状态的记录,客户端第一次访问服务器端时候由服务器创建,以键值对的形式保存了客户的状态信息,使用起来也比cookie方面。和cookie不同的是,session是由服务器端保存的。客户端后续请求的时候只需要找到这个session就可以知道以前的会话状态。如何找?

服务器会生成一个 SessionID,可以放在cookie里返回给客户端,客户端下次请求只要带上这个标识符,服务器就可以找到对应的session。因为session保存在服务器上,所以无法伪造,安全性就比cookie高

session生命周期
服务器会删除长时间不活动的session,也可以在服务端设置时间,像Tomcat中Session的默认失效时间为20分钟。

session的问题

  1. 服务器上存储的session越来越多(高并发的情况下)会对服务器造成很大压力(可以把session存储到redis减轻服务端压力)
  2. 如果服务器由多台主机组成(分布式、集群),各个主机之间的session共享又是件麻烦事(需要保存到redis然后做查询)

然后出现了token

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值