cookie,session,token之间有什么关系
系列文章目录
http起初设计是无状态的,后来需要让请求和请求之间建立起有状态的联系,所以cookie应运而生,后面又有了session,token,但是最初我们想要解决的是请求和请求之间建立起有状态的联系,状态在哪里呢,要么在服务端,要么在客户端
再专业一点描述:
HTTP 协议最初是无状态的,这意味着服务器无法自动记住用户的状态。为了在多个请求之间建立有状态的联系,Cookie 应运而生,它将部分状态信息存储在客户端。随后,为了解决 Cookie 的安全性和扩展性问题,引入了 Session,它将状态信息存储在服务端。再后来,随着分布式系统的发展,Token(如 JWT)逐渐成为一种更轻量、更灵活的解决方案,它将状态信息封装在客户端,服务端只需验证 Token 的有效性即可。因此,无论状态存储在服务端还是客户端,其核心目标都是实现请求之间的状态关联。
文章目录
- 系列文章目录
- 一、cookie
- 二、session
- 三、token
一、cookie
cookie是存储在用户浏览器端的一个小型数据文件,用于跟踪和保存用户的状态信息
以上面截图为例,把一些信息放到cookie里,服务器就知道这个请求是谁发的了,cookie携带大量明文信息,不安全,所以又出现了session,但是最初我们想要解决的是请求和请求之间建立起有状态的联系
二、session
session把用户的会话信息存储在服务端,然后给客户端一个sessionid.
每个用户会话都会有一个唯一的session id,主要用于跟踪用户在服务器上的状态信息, 服务器接收到客户端的请求,就可以根据sessionid来识别这是来自于哪个用户的了
所以session特点是:存储在服务器端,然后对应的sessionid 通过cookie保存在客户端浏览器中。这种把状态信息存储到服务器中使得服务器有状态了。
但是有一个问题,服务器通常都是集群模式的,如果session存在某一台机器上,但是下一次请求被分配到其他机器,那么其他机器怎么同步session信息呢?
解决方式:
session 复制,每一台机器都存一份,容易产生冗余,有额外的开销,
session sticky,如果你的请求一直黏在某一个服务器,那么之后所有请求都被分到那一台服务器。如果服务器挂了,请求被分到B服务器,这样一来用户信息又丢失了。可以把session 放到第三方存储,比如redis。
三、token
Token 的出现主要是为了替代 Session,因为 Session 是有状态的,需要服务器存储用户信息,难以在分布式系统中扩展。而 Token 是无状态的,所有信息都包含在 Token 中,客户端每次请求都携带 Token,服务器只需验证其有效性即可,大大提升了系统的可扩展性和灵活性。此外,Token 更适合移动端、跨域访问以及现代身份认证体系(如 OAuth、JWT)
所以服务端颁发给用户的签过名的凭证,就是token.
token存在客户端,并在请求中传递,用来证明用户的身份或者权限。
所以服务器此时是无状态的,客户端有状态,有了token之后由于服务器无状态,所以在分布式系统随便扩展。
特性:
自包含:token,尤其是jwt通常自包含了用户的身份和权限信息,无需服务器存储会话数据
过期和刷新:有过期时间,用户需要重新登录或者通过刷新token获取新的token
安全性:token可以进行加密和签名,以保护内容不被篡改,并验证其来源的合法性