[编程]-web认证
时间:2023-08-31 21:24:01 | 来源:网站运营
时间:2023-08-31 21:24:01 来源:网站运营
[编程]-web认证:cookie在客户端
cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)
session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
单个 Cookie 保存的数据不能超过 4K
每次请求都要带token,token在header
token是签名后的凭证
token不存储在服务器端
token是无状态的设计
(ssession使得服务器有状态化)
jwt支持跨域认证
jwt自包含了一些会话信息,所以对数据库的查询操作较少(jwt会查询数据库吗? 如果把解密jwt的密钥存数据库的话就需要查询)
jwt的token可以保存在localstorage,也可以使用cookie?
jwt不使用cookie,所以不用担心跨域(和上一条冲突? 放cookie里发送不能跨域。但是放header里是可以跨域的)
无状态: 状态不存在服务器端
*** jwt的使用- 方式1
header里:
Authorization: Bearer <token>
- 方式2
跨域时,可以将jwt放post请求的body里
- 方式3
url传送:
http://www.example.com/user?token=xxx可以减少查询数据库次数
服务器不存储jwt,故不涉及session那样在集群下需要共享的问题。
但是这也导致jwt一旦下发token后就无法废弃该token或更改其权限(即无法随时踢客户端下线)。
故jwt的有效期尽量要设短。
适合一次性的命令认证。
为了避免盗用,应该使用https。
*** cookie的使用不要存敏感信息
因和域名绑定,无法跨域
移动端对cookie支持不是很好,session要基于cookie(存sessionId)实现,所以移动端常用的是token。
*** session的使用用户在线量多时, 需要及时清内存
集群部署的问题: 产生session的是某个服务器,如果后来处理请求的服务器不是产生session的服务器,就涉及session共享的问题。
cookie涉及跨域,所以为了避免这个问题,也有做法是把sessionId放在url里
*** token的使用一般用内存如redis来提高查询效率
token 可以避免 CSRF 攻击(因为不需要 cookie 了)
**** 和jwt的区别单纯的token需要存服务器比如redis里,jwt不用(因将token和payload加密后存客户端了)
要做随时踢下线这种强管理的功能,就需要用token-session这种有状态的模型,比如用sa-token框架(这里的意思应该是指这个框架,可以有token方式,也可以有session方式)。
token如何和session结合?
//一般没有这种做法。如果token作为session的id,那其实还是session的方式。
摘要自:
还分不清 Cookie、Session、Token、JWT? - 老刘的文章 - 本站