session、cookie、token 以及JWT的介绍

本文探讨了会话(Session)、Cookie、Token和JWT在Web开发中的角色,包括它们的工作原理、发展过程以及各自的优缺点,着重于它们在存储用户信息、保持会话状态和安全认证方面的应用与挑战。
摘要由CSDN通过智能技术生成

定义:

1.Session (会话) : Session是服务器端用来存储用户信息的一种机制。当用户第一次访问网站时,服务器会为该用户创建一个唯一的session ID,并将该ID存储在Cookie中发送给客户端。客户端每次请求时都会携带这个session lD,服务器通过它来识别并关联用户的会话状态。服务器可以使用session来跟踪用户身份认证、保存用户数据等。

2.Cookie (HTTP Cookie) : Cookie是存储在客户端的小型文本文件,由服务器通过响应头中的Set-Cookie头部发送给客户端,并随后的每个请求中被浏览器自动携带。Cookie通常用来存储一些用户相关的信息,例如登录状态、用户首选项°等。服务器可以根据Cookie来识别用户,并提供个性化的服务。

3.Token (令牌I) :Token是一种安全凭证,用于验证用户身份和授权访问。与session和cookie不同,token是无状态的,即服务器不存储任何信息。在用户登录成功之后,服务器会生成一个token,并将其返回给客户端。客户端在每次请求时都需要携带这个token,服务器通过验证token的有效性来辨别用户身份和权限。
​

发展:

        http最开始为了满足大家浏览web文档的请求只有GET请求,浏览完了就走,两个连接之间没有任何关系,这也是http无状态的原因。
        但是后来我们需要购物、评论等,不是单纯的浏览web,需要我们记录下每次连接之间的关系,有了cookie
        以加入购物车为例,每次浏览器请求后 server 都会将本次商品 id 存储在 Cookie 中返回给客户端,客户端会将 Cookie 保存在本地,下一次再将上次保存在本地的 Cookie 传给 server 就行了,这样每个 Cookie 都保存着用户的商品 id,购买记录也就不会丢失了
        因为所有的信息已经存在server服务端了,所以cookie每次携带所有的信息会很长,有了session。在登录的时候,server会生成一个session,为用户分配一个sessionid,通过cookie传给server,在后端查找用户信息
        但是session是单机登录的,一般为了高可用会有不止一台机器,通过负载均衡的方式决定请求到哪台机器上

解决方法:
方法1:A生成session后复制到bc上,缺点是数据比较冗余、性能消耗比较大

方法2:Nginx 的 sticky 模块。让每个客户端固定打到一个机器上,比如通过ip算hash值等。缺点是这台机器挂了就不能登录了

方法3:将session保存在redis中,redis做集群设置。缺点就是每个session都要从redis去查询,多了一次连接

token:首先请求方输入自己的用户名,密码,然后 server 据此生成 token,客户端拿到 token 后会保存到本地,之后向 server 请求时在请求头带上此 token 即可。
​

jwt:检验token

可以看到 token 主要由三部分组成:
​
header:指定了签名算法
payload:可以指定用户 id,过期时间等非敏感数据
Signature: 签名,server 根据 header 知道它该用哪种签名算法,再用密钥根据此签名算法对 head + payload 生成签名,这样一个 token 就生成了。
​
当 server 收到浏览器传过来的 token 时,它会首先取出 token 中的 header + payload,根据密钥生成签名,然后再与 token 中的签名比对,如果成功则说明签名是合法的,即 token 是合法的。而且你会发现 payload 中存有我们的 userId,所以拿到 token 后直接在 payload 中就可获取 userid,避免了像 session 那样要从 redis 去取的开销

优缺点:

token缺点(更适合一次性的命令认证,设置一个比较短的有效期):
    太长:token比cookie长,每次请求中带上token对请求来说有负担
    不太安全:token存在于浏览器的local storage中,而这类的本地存储可以被js直接获取。token生成要失效的话需要过期才行,就算检测到威胁也无法让其失效
  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SessionCookieTokenJWT都是在Web开发中用于管理用户身份认证和会话管理的工具。 1. SessionSession指的是服务器端保存的用户信息。当用户登录成功后,服务器会创建一个session,为该用户分配一个session ID,并将该ID保存到cookie中,发送给客户端。客户端浏览器保存了这个cookie,以后每次请求都会带上这个cookie,服务器通过这个cookie就可以识别出用户身份,从而进行相应的操作。Session机制存在一定的风险,比如会话劫持、会话固定等问题,需要注意安全性。 2. CookieCookie是一种客户端保存用户信息的机制,它是由服务器在响应HTTP请求时通过Set-Cookie头部字段发给客户端浏览器的一小段文本信息。浏览器将这些信息保存在客户端,以后每次向服务器发送请求时都会自动带上这些cookie,从而实现身份认证和会话管理。但是Cookie也存在一些安全问题,比如会话劫持、跨站脚本攻击等问题。 3. TokenToken是一种用户身份认证和授权的机制,通常由服务器生成,以便在客户端和服务端之间进行身份认证和授权。客户端在登录成功后,服务器会为该用户生成一个Token,并将Token发送给客户端浏览器。客户端在之后的请求中需要携带该Token,服务器验证Token的有效性后,就可以识别出用户身份,并进行相应的操作。Token相比SessionCookie,具有更高的安全性和可扩展性。 4. JWTJWT是一种基于Token的身份认证和授权机制。JWT包含三部分,分别是头部、载荷和签名。头部包含加密算法和类型等信息;载荷包含用户的身份信息和相关的元数据等信息;签名则是对头部和载荷进行签名生成的一段密文,用于验证Token的有效性。JWT具有无状态、可扩展、跨域等特点,被广泛用于Web开发中的用户身份认证和授权。 ### 回答2: SessionCookieTokenJWT都是常见的身份验证和会话管理方法。下面我会分别介绍它们。 SessionSession是服务器端记录用户状态的一种机制。当用户通过用户名和密码登录后,服务器会为该用户创建一个唯一的Session。之后,用户再发送请求时,服务器会根据Session来识别用户并获取用户的状态信息。 CookieCookie是一种在客户端存储的小型文本文件。在用户通过用户名和密码登录成功后,服务器可以将一个包含Session信息的Cookie发送给客户端,客户端会将该Cookie保存下来。之后,客户端发送请求时,会自动附带上该Cookie,用于向服务器证明用户的身份。 TokenToken是一种代表用户身份的令牌。与Cookie不同,Token是在客户端保存的,并且不需要服务器端存储用户状态。当用户登录成功后,服务器会生成一个Token并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将Token作为请求头信息的一部分发送给服务器,服务器根据Token验证用户身份。 JWTJWT(JSON Web Token)是一种基于JSON的开放标准,用于在各方之间安全传输信息。它由三部分组成:Header、Payload和Signature。其中,Header用于描述JWT的元数据,Payload用于存储实际传输的数据,Signature用于验证JWT的合法性。在使用JWT进行身份验证时,服务器会生成一个JWT并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将JWT作为请求头信息的一部分发送给服务器,服务器根据JWT验证用户身份的合法性。 总结:SessionCookieTokenJWT都是常用于身份验证和会话管理的方法,它们各有优劣和适用场景。SessionCookie依赖于服务器端存储用户状态,而TokenJWT则可以减轻服务器的负担,并且适用于分布式系统。其中,JWT由于其自包含性和可扩展性,在分布式系统和前后端分离的架构中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值