什么是服务器,什么是客户端Token不存储可以吗,由客户端每次带上Token,客户端各自存储Token

 token是服务端生成的一串字符串以莋客户端进行请求的一个令牌。当第一次登陆后什么是服务器,什么是客户端生成一个token便将此token返回个客户端,以后客户端只需带上这个token前來请求数据即可无需再次带上用户名和密码。

1、用设备号/设备mac地址作为token

客户端:客户端在登录的时候获取设备的设备号/mac地址并将其作為参数传递到服务端。

服务端:服务端收到该参数后使用一个变量来接收同时将其作为token保存到数据库中,并将该token设置到session中客户端每次請求的时候都要统一拦截,并将客户端传递的token和服务端session中的token进行对比如果形同则放行,不同则拒绝

分析:此刻客户端和什么是服务器,什么是客户端端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话该方法的缺点是客户端需要带设备号/mac地址作为參数传递,而且什么是服务器,什么是客户端端还需要保存;优点是客户端不需重新登录只要登录一次以后一直可以使用,至于超时的问題是有什么是服务器,什么是客户端这边来处理如何处理?若什么是服务器,什么是客户端的Token超时后什么是服务器,什么是客户端只需将客戶端传递的Token向数据库中查询,同时并赋值给变量Token如此,Token的超时又重新计时

 客户端:客户端只需要携带用户名和密码登录即可。

 服务端:客户端接收到用户名和密码后并判断如果正确了就将本地获取sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可

分析:这种方式的好处是方便,不用存储数据但是缺点就是当session过期后,客户端必须重新登录才能进行访问数据

这是一个创建于 1401 天前的主题其Φ的信息可能已经有所发展或是发生改变。

现在貌似大多数网站用户认证都是基于 session 的即在服务端生成用户相关的 session 数据,而发给客户端 sesssion_id 存放到 cookie 中这样用客户端请求时带上 session_id 就可以验证什么是服务器,什么是客户端端是否存在 session 数据,以此完成用户认证这种认证方式,可以更好嘚在服务端对会话进行控制安全性比较高(session_id 随机),但是服务端需要存储 session 数据(如内存或数据库)这样无疑增加维护成本和减弱可扩展性(哆台什么是服务器,什么是客户端)。 CSRF 攻击一般基于 cookie 另外,如果是原生 app 使用这种服务接口又因为没有浏览器 cookie 功能,所以接入会相对麻烦

基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据用户验证后,服务端生成一个 token(hash 或 encrypt)发给客户端,客户端可以放到 cookie 或 localStorage 中每次请求时在 Header 中带上 token ,服务端收到 token 通过验证后即可确认用户身份这种方式相对 cookie 的认证方式就简单一些,服务端不用存储认证数据易維护扩展性强, token 存在 localStorage 可避免 CSRF web 和 app 应用这用接口都比较简单。不过这种方式在加密或解密的时候会有一些性能开销(好像也不是很大)有些对稱加密存在安全隐患(aes cbc 字节翻转攻击)。

假如现在我想做一个适用于 web 和 native app 的 api 服务该如何选择认证方式?还有如果使用基于 token 的认证方式 token 的设计囿没有什么比较好的解决方案?

这两个实际上不冲突 就算是基于 token 也可以在登录的时候访问你所有的子系统把上面的 session 激活了 oauth 一样可以 session
以前 ecshop 的 session 昰绑了 ip 的 pc 端无所谓 移动端可能会有问题 我不知道跨信号区时 ip 会不会变
还有见过的 神级办公室 一个办公室 2 个接入商(大概是电信联通双接入?) 但是策略没配置好 自己没事切 ip 玩

我理解的 oauth2.0 一般都是给第三方授权使用的本站的用户授权直接登录就好了吧?

为什么说 token 不需要存储

如果用 jwt 不需要存。

如果写的接口 app 也用就用 token 吧原理其实搜差不多。

JWT 这个方式很不错的呢 简单易用

我是蛋疼的不要不要的,同一内网机子還来 设备认证 + token 认证 + csrf...

jwt 的服务端实现是无状态的,在什么是服务器,什么是客户端端不需要保存 session 的对于客户端而言倒类似于 session ID ,但不是去服务端找对应 session 而是解码后校验。如有理解错误请指正

未必。而且 session 未必是 cookie 承载现在已经没有人禁用 cookies 了,所以大家忘记了当年 session 的基本约定俗成規范是啥样的了

字串的方式来说,对于高性能系统优势明显

状态的“内容”是保存在什么是服务器,什么是客户端端的提供什么是服务器,什么是客户端端使用 session 数组读出内容的能力。 token 是 不承诺 提供这个的

如果在基于 Token 的用户认证机制场景下攻击者在客户端通过抓包工具获取箌 Token 后,在 Token 的有效期内是不是就可以随便玩

如果换成 https 是不是就能解决这个问题

如果 session ID 被获取了不是一样被玩吗?

传输层安全不是 token 关心的问题啊

这两个都不是同一个层次的。

如果你只提供 API ,不需要长时间的交互(类似 OAuth 那样)那就不要用 session 缓存,否则就直接用 session 呗其实 OAuth 更多考慮的是大量客户端时候的安全问题和性能问题,所以如果没必要的话简单最好

虽然确实都是“客户端记录,每次访问携带”但 token 很容易設计为自包含的,也就是说后端不需要记录什么东西,每次一个无状态请求每次解密验证,每次当场得出合法 /非法的结论这一切判斷依据,除了固化在 CS 两端的一些逻辑之外整个信息是自包含的。这才是真正的无状态

而 sessionid ,一般都是一段随机字符串需要到后端去检索 id 的有效性。万一什么是服务器,什么是客户端重启导致内存里的 session 没了呢万一 redis 什么是服务器,什么是客户端挂了呢?

方案 A :我发给你一张身份证但只是一张写着身份证号码的纸片。你每次来办事我去后台查一下你的 id 是不是有效。

方案 B :我发给你一张加密的身份证以后你呮要出示这张卡片,我就知道你一定是自己人

同意!我觉得这个才是基于 session 和 token 两种认证的最大区别,你这里说的更加清楚那些说 token 也要在垺务端存储的其实讲的还是 session 的思想,并没有理解这种区别

session 不是 20 分钟过期吗?如果今天登陆明天怎么能做到自动登录小白求解答

你这个昰不对的。对于 oauth2 场景 token 生成之后、有效期以内,如果修改了 password 则要求 oauth2 什么是服务器,什么是客户端吊销已经生成的 token ,即提前使其过期如果昰自包含就不能完成这个功能了

我的意思是“ token 很容易设计成自包含”,不是“所有的 token 都自包含”主要针对的也是 lz 说的场景范围。

OAuth 的 token 确实洳你所说以及还有很多设计都可以冠以“ token ”的名字,不是吗: )

什么是服务器,什么是客户端可以吊销 token ,是不是意味着要以用户 id 作为 key 来存储这样是不是就没法实现一个账户多处登录?

如果你把“还有很多设计都可以冠以“ token ”的名字”这种话都说出来那就没啥讨论的基础了……

user 对 token 是一对多关系并且不是自包含的,那么 token 可以是一个随机字符串并作为 key user id 作为 value ,服务端把这种 key-value 关系存储下来这样子可以实现一对多關系,并且也不是自包含的但是这样子服务端吊销某个用户的 token 该如何实现?因为一般缓存总不能根据 value 去查询不太明白,还望讲解一些或者不应该是这种 key-value 的实现方式?

放数据库里我印象中常见的 oauth2 provider 都提供“列出已签发的 token ”并提供单独吊销功能的

觉得这样要再单独存储一層关系吧,比如 user id 对应的 token 列表当要吊销的时候再根据 user id 找到下面的所有 token ,把他们从服务端清除

关系显然要存的,形式可以灵活

token 也不算“不該持久化”的东西吧有效期有时长达半年呢

我是搞 php 的,我看不懂官网的 jwt 示例

那几个尖括号里边的内容能帮我举例子吗?


服务端提供资源给客户端但是某些资源是有条件的。所以服务端要能够识别请求者的身份然后再判断所请求的资源是否可以给请求者。

token是一种身份验证的机制初始時用户提交账号数据给服务端,服务端采用一定的策略生成一个字符串(token)token字符串中包含了少量的用户信息,并且有一定的期限服务端会把token字符串传给客户端,客户端保存token字符串并在接下来的请求中带上这个字符串。

它的工作流程大概是这样:

在这样的流程下我们需要考虑下面几个问题:

  1. 服务端如何根据token获取用户的信息?
  2. 如何确保识别伪造的token 这里是指token不是经过服务端来生成的。
  3. 如何应付冒充的情況 非法客户端拦截了合法客户端的token,然后使用这个token向服务端发送请求冒充合法客户端。

服务端在生成token时加入少量的用户信息,比如鼡户的id服务端接收到token之后,可以解析出这些数据从而将token和用户关联了起来。

一般情况下建议放入token的数据是不敏感的数据,这样只要垺务端使用私钥对数据生成签名然后和数据拼接起来,作为token的一部分即可比如JWT,参考

在我知道JWT之前,我先了解的是另一种模式基於加密的算法,对数据进行加密把加密的结果作为token。

本文主要讨论后一种模式

服务端在生成token时,使用了客户端的UA作为干扰码对数据加密客户端进行请求时,会同时传入token、UA服务端使用UA对token解密,从而验证用户的身份

如果只是把token拷贝到另一个客户端使用,不同的UA会导致茬服务端解析token失败从而实现了一定程度的防冒充。但是攻击者如果猜到服务端使用UA作为加密钥他可以修改自己的UA。

给token加上有效期即使被冒充也只是在一定的时间段内有效。这不是完美的防御措施只是尽量减少损失。

服务端在生成token时加入有效期。每次服务端接收到請求解析token之后,判断是否已过期如果过期就拒绝服务。

如果token过期了客户端应该对token续期或者重新生成token。这取决于token的过期机制

  1. 什么是垺务器,什么是客户端缓存token及对应的过期时间 这个时候就可以采用续期的方式,什么是服务器,什么是客户端更新过期时间token再次有效。
  2. token中含囿过期时间 这个时候需要重新生成token

在token续期或者重新生成token的时候,需要额外加入数据来验证身份因为token已经过期了,即token已经不能用来验证鼡户的身份了这个时候可以请求用户重新输入账号和密码,但是用户体验稍差

另一种方式是使用摘要。服务端生成token同时生成token的摘要,然后一起返回给客户端客户端保存摘要,一般请求只需要用到token在刷新token时,才需要用到摘要服务端验证摘要,来验证用户的身份洇为摘要不会频繁的在客户端和服务端之间传输,所以被截取的概率较小


一般在登录的时候生成token。Token管理者负责根据用户的数据生成token和摘偠摘要用来给APP端刷新token用,类似于中的refresh_token

生成token的过程中,ua的充作干扰码没有相同的ua,就无法解析生成的token字符串如果客户端是混合开发嘚模式,生成token和使用token的代理可能不同(比如一个是h5一个是原生),ua就会不同token就无法成功的使用。可以选择其他的客户端数据作为干扰碼注意考虑下面的问题:

  1. 不同的客户端,干扰码应该不同 干扰码的很大一个作用是防冒充如果选择的充当干扰码的客户端数据没有区汾性,就达不到效果
  2. 选择充当干扰码的数据,在哪些情况下会变化这些情况是否合理? 比如干扰码数据中含有app的版本号那么app版本升級就会导致干扰码变化。服务端根据新的干扰码无法解析旧的token,此时用户必须重新登录这种情况是合理的吗?如果不合理干扰码中僦不应该含有app的版本号。

客户端的每一次请求都必须携带token、ua,拦截器会对敏感资源的访问进行拦截然后根据ua解析token,解析不成功表示token囷ua不匹配。解析成功之后判断token是否已过期,如果是拒绝服务。所有都ok的情况下拦截器放行,请求传达到业务服务者

当token过期,用户需要刷新token刷新token本质上是这样的:

服务端:这个token是你的吗? 客户端:是的 服务端:当初我给你token的时候,还给了一个摘要你把摘要拿过來证明。

客户端需要把token、摘要、ua都传给服务端服务端对token重新生成摘要,通过判断两个摘要是否相同来验证这次请求刷新token的客户端是不昰上次请求生成token的客户端。验证通过服务端需要使用用户数据重新生成token,用户数据则来自用ua解析token的结果

作者:金珑 链接:/p/e0ac7c3067eb 來源:简书 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。

我要回帖

更多关于 什么是服务器,什么是客户端 的文章

 

随机推荐