Token 与 Session 相关区别

本文解释了Session和Token的出现原因、生成方式及其区别。重点介绍了它们在网络无状态协议HTTP中的作用,以及如何确保用户身份验证的安全性和有效性。

1. 为什么要有session的出现?
答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的。如果要进行类似论坛登陆相关的操作,就实现不了了。

2. session生成方式?
答:浏览器第一次访问服务器,服务器会创建一个session,然后同时为该session生成一个唯一的会话的key,也就是sessionid,然后,将sessionid及对应的session分别作为key和value保存到缓存中,也可以持久化到数据库中,然后服务器再把sessionid,以cookie的形式发送给客户端。这样浏览器下次再访问时,会直接带着cookie中的sessionid。然后服务器根据sessionid找到对应的session进行匹配;
还有一种是浏览器禁用了cookie或不支持cookie,这种可以通过URL重写的方式发到服务器;

简单来讲,用户访问的时候说他自己是张三,他骗你怎么办? 那就在服务器端保存张三的信息,给他一个id,让他下次用id访问。
 

3. 为什么会有token的出现?
答:首先,session的存储是需要空间的,其次,session的传递一般都是通过cookie来传递的,或者url重写的方式;而token在服务器是可以不需要存储用户的信息的,而token的传递方式也不限于cookie传递,当然,token也是可以保存起来的;

4. token的生成方式?
答:浏览器第一次访问服务器,根据传过来的唯一标识userId,服务端会通过一些算法,如常用的HMAC-SHA256算法,然后加一个密钥,生成一个token,然后通过BASE64编码一下之后将这个token发送给客户端;客户端将token保存起来,下次请求时,带着token,服务器收到请求后,然后会用相同的算法和密钥去验证token,如果通过,执行业务操作,不通过,返回不通过信息;

5. token和session的区别?
token和session其实都是为了身份验证,session一般翻译为会话,而token更多的时候是翻译为令牌;
session服务器会保存一份,可能保存到缓存,文件,数据库;同样,session和token都是有过期时间一说,都需要去管理过期时间;
其实token与session的问题是一种时间与空间的博弈问题,session是空间换时间,而token是时间换空间。两者的选择要看具体情况而定。

虽然确实都是“客户端记录,每次访问携带”,但 token 很容易设计为自包含的,也就是说,后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论。这一切判断依据,除了固化在 CS 两端的一些逻辑之外,整个信息是自包含的。这才是真正的无状态。 
而 sessionid ,一般都是一段随机字符串,需要到后端去检索 id 的有效性。万一服务器重启导致内存里的 session 没了呢?万一 redis 服务器挂了呢? 

方案 A :我发给你一张身份证,但只是一张写着身份证号码的纸片。你每次来办事,我去后台查一下你的 id 是不是有效。 
方案 B :我发给你一张加密的身份证,以后你只要出示这张卡片,我就知道你一定是自己人。 
就这么个差别。

### 比较TokenSession #### 不同点 在Web认证中,TokenSession有着显著的区别Token的验证机制相比Session更为灵活方便[^1]。具体来说: - **存储位置** - Session的数据主要存放在服务器端,而客户端仅保存一个用于识别会话的身份标识符(sessionId),此sessionId通常通过Cookie传递给客户端[^2]。 - Token则完全由客户端负责保管,在每次HTTP请求时作为参数附加于URL、置于HTTP头部或隐藏在POST数据体内发送至服务端。 - **工作原理** - 对于Session而言,当用户成功登录后,服务器创建一个新的会话并将相关信息保存起来;此同时,向浏览器返回一个唯一的Session ID以便后续通信使用。每当接收到含有特定Session ID的新请求时,服务器便依据它来检索对应的会话详情并执行相应的操作。一旦会话超时期满或是被判定失效,则需再次经历完整的登陆过程才能恢复正常使用权限[^4]。 - 使用Token的情况下,应用程序会在首次验证过后签发一段字符串形式的安全令牌(Token)交给前端持有者。之后每一次交互均附带这份证明材料供后台校验真伪以及获取授权范围内的资源访问许可。由于整个过程中无需依赖额外的状态信息维护,因此实现了真正意义上的无状态化设计思路[^3]。 #### 各自优点 ##### Token的优点 - 基于标准化协议构建(如JSON Web Tokens),具备良好的兼容性和互操作能力; - 能够轻松实现跨域资源共享(CORS),并且非常适合移动端开发场景下的需求特点; - 属于无状态架构的一部分,有助于简化部署结构的同时提高系统的可扩展性能。 ##### Session的优点 - 更加贴近传统的Web应用模式,易于理解和实施; - 可以利用现有成熟的框架和技术栈快速搭建起安全可靠的用户管理体系; - 提供更细粒度控制手段去管理和调整在线用户的活动周期及其关联属性。 #### 各自缺点 ##### Token的缺点 - 如果私钥泄露将会导致所有已发行的有效期内Tokens面临风险敞口扩大化的威胁; - 需要合理规划过期策略防止长期有效的Tokens成为潜在安全隐患源头之一; - 客户端必须妥善处理好本地缓存中的敏感资料以免遭受恶意程序窃取攻击。 ##### Session的缺点 - Server端需要消耗内存空间维持大量活跃Sessions的存在,随着并发数增长可能引发性能瓶颈问题; - Cross-Origin Resource Sharing (CORS)的支持相对较弱,对于现代富互联网应用程序(RIA)来说不够友好; - Mobile设备上可能存在Cookie管理不当的情况影响用户体验质量。 ```python # 示例代码展示如何设置Session from flask import Flask, request, session app = Flask(__name__) app.secret_key = 'your_secret_key' @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] if verify_user(username, password): # Assume this function verifies user credentials. session['user_id'] = get_user_id(username) return "Login successful" return "Invalid credentials" # 示例代码展示如何生成Token import jwt import datetime secret = 'your_jwt_secret' algorithm = 'HS256' payload = { 'sub': user_id, 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7), } token = jwt.encode(payload, secret, algorithm) print(f"Generated JWT: {token}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值