cookie,session和token的区别和应用场景

本文介绍了三种常用的身份验证机制:Cookie、Session 和 Token 的基本概念及特点。Cookie 存储于客户端,适用于少量安全数据;Session 存储在服务器端,通过 sessionId 进行跟踪;Token 则是一种无状态验证机制。

1.cookie

       coolie存储在客户端,容量下,不安全,可以用来存储少量和安全无关的数据。

       cookie存在跨域域名共享cookie问题、pc与app的cookie管理问题。


2.session

      session将数据存储在服务器端,返回sessionId给客户端,下次访问时,根据该sessionId在服务器中获取session对象。

      session走的是http层,session对象又request.getSession()产生,又org.apache.catalina.Manager类处理。

      session存在多太服务器共享问题。

 

3 token

   


      

### 工作原理及区别 #### Cookie Cookie 是一种存储在客户端的小型数据片段,通常由服务器通过 HTTP 响应头 `Set-Cookie` 发送,浏览器在后续请求中自动将其附加到请求头 `Cookie` 中。Cookie 用于维护客户端与服务器之间的状态信息,例如用户身份标识、偏好设置等。由于 Cookie 存储在客户端,其大小通常限制在 4KB 左右[^1]。 #### Session Session 是一种服务器端的状态管理机制。当用户首次访问服务器时,服务器会创建一个唯一的会话标识(Session ID),并将该标识通过 Cookie 发送给客户端。客户端在后续请求中携带该 Session ID,服务器通过查找 Session ID 对应的会话数据来识别用户状态。Session 数据存储在服务器端,因此不受客户端限制,但会增加服务器的存储负担[^1]。 #### Token Token 是一种无状态的身份认证机制,通常以 JWT(JSON Web Token)形式存在。它包含经过签名的用户信息,不需要在服务器端保存用户会话状态。Token 通常存储在客户端的 `localStorage`、`sessionStorage` 或 Cookie 中。Token 的生命周期通常较短,且通过 HTTPS 传输以确保安全性。一旦 Token 泄露,可能会被重用,因此通常结合 refresh token 机制来延长登录状态[^3]。 ### 使用场景 #### Cookie Cookie 适用于需要持久化用户状态的场景,例如记住用户登录状态、保存用户偏好设置等。由于 Cookie 是有状态的,适用于单体架构或小型应用。 #### Session Session 适用于需要在服务器端维护用户状态的场景,例如购物车管理、用户权限控制等。Session 适用于传统的单体架构应用,因为服务器需要维护会话状态,因此在分布式系统中需要额外的共享存储机制。 #### Token Token 适用于无状态的认证场景,特别是在分布式系统微服务架构中。Token 通过签名验证用户身份,服务器无需维护会话状态,因此非常适合用于 OAuth、单点登录(SSO)等场景。JWT 是 Token 的一种标准化实现,提供了更安全可扩展的特性[^4]。 ### 代码示例 #### 设置 Cookie ```python from flask import Flask, make_response app = Flask(__name__) @app.route('/set_cookie') def set_cookie(): resp = make_response("Setting Cookie") resp.set_cookie('user_id', '123') return resp ``` #### 创建 Session ```python from flask import Flask, session, redirect app = Flask(__name__) app.secret_key = 'secret_key' @app.route('/login') def login(): session['user_id'] = '123' return redirect('/profile') ``` #### 生成 JWT Token ```python import jwt from datetime import datetime, timedelta # 生成 Token def generate_token(user_id): payload = { 'user_id': user_id, 'exp': datetime.utcnow() + timedelta(hours=1) } token = jwt.encode(payload, 'secret_key', algorithm='HS256') return token # 验证 Token def verify_token(token): try: payload = jwt.decode(token, 'secret_key', algorithms=['HS256']) return payload['user_id'] except jwt.ExpiredSignatureError: return 'Token expired' except jwt.InvalidTokenError: return 'Invalid token' ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值