01-

身份认证

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

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

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

组件图

Token机制

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

  1. 服务端如何根据token获取用户的信息?

  2. 如何确保识别伪造的token?

    这里是指token不是经过服务端来生成的。

  3. 如何应付冒充的情况?

    非法客户端拦截了合法客户端的token,然后使用这个token向服务端发送请求,冒充合法客户端。

用户匹配

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

防伪造

一般情况下,建议放入token的数据是不敏感的数据,这样只要服务端使用私钥对数据生成签名,然后和数据拼接起来,作为token的一部分即可。比如JWT,参考JSON Web Token - 在Web应用间安全地传递信息。

在我知道JWT之前,我先了解的是另一种模式。基于加密的算法,对数据进行加密,把加密的结果作为token(http://blog.leapoahead.com/2015/09/06/understanding-jwt/)。

本文主要讨论后一种模式。

防冒充

加干扰码

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

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

有效期

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

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

token刷新

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

  1. 服务器缓存token及对应的过期时间

    这个时候就可以采用续期的方式,服务器更新过期时间,token再次有效。

  2. token中含有过期时间

    这个时候需要重新生成token。

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

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

02-

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是你的吗?

客户端:是的。

服务端:当初我给你token的时候,还给了一个摘要,你把摘要拿过来证明。

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

✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦

作者:守正


 

Token:服务端身份验证的流行方案的更多相关文章

  1. Token:服务端身份验证的流行方案【转】

    01- 身份认证 服务端提供资源给客户端,但是某些资源是有条件的.所以服务端要能够识别请求者的身份,然后再判断所请求的资源是否可以给请求者. token是一种身份验证的机制,初始时用户提交账号数据给服 ...

  2. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...

  3. MVC系列学习(十二)-服务端的验证

    在前一讲,提到过,客户端的东西永远可以造假,所以我们还要在服务端进行验证 注意:先加载表单,后添加js文件,才能有效:而先加载js,后添加表单,是没有效果的 1.视图与Model中的代码如下 2.一张 ...

  4. 基于token的后台身份验证(转载)

    几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

  5. Unity中使用协程进行服务端数据验证手段

    近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都 ...

  6. Asp.Net MVC 模型验证详解-实现客户端、服务端双重验证

    概要 在asp.net webform开发中经常会对用户提交输入的信息进行校验,一般为了安全起见大家都会在客户端进行Javascript(利于交互).服务端双重校验(安全).书写校验代码是一个繁琐的过 ...

  7. JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ...

  8. iOS内购 服务端票据验证及漏单引发的思考.

    因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的 ...

  9. struts2(三)---struts2中的服务端数据验证框架validate

    struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个acti ...

随机推荐

  1. 洛谷 P4298: bzoj 1143: [CTSC2008]祭祀

    题目传送门:洛谷 P4298. 题意简述: 给定一个 \(n\) 个点,\(m\) 条边的简单有向无环图(DAG),求出它的最长反链,并构造方案. 最长反链:一张有向无环图的最长反链为一个集合 \(S ...

  2. (好题)POJ3057

    二分+二分图匹配+BFS 题意: 墙壁“X”,空区域(都是人)“.”, 门“D”. 人向门移动通过时视为逃脱,门每秒能出去一个人,人可以上下左右移动,墙阻止移动. 求最优移动方案下,最后一个人逃脱的最 ...

  3. Elasticsearch之文档的增删改查以及ik分词器

    文档的增删改查 增加文档 使用elasticsearch-head查看 修改文档 使用elasticsearch-head查看 删除文档 使用elasticsearch-head查看 查看文档的三种方 ...

  4. Html介绍,认识head标签

    <head></head>标签位于html文档的头部,主要是用来描述文档的各种属性和信息,包括文档的标题等,当然文档头部包含的数据都不会真正作为内容展示给访客的. 如下的一些标 ...

  5. Docker Stack 学习笔记

    该文为<深入浅出Docker>的学习笔记,感谢查看,如有错误,欢迎指正 一.简介 Docker Stack 是为了解决大规模场景下的多服务部署和管理,提供了期望状态,滚动升级,简单易用,扩 ...

  6. .net core 3.0配置跨域

    1.ConfigureServices services.AddCors(c => { // 配置策略 c.AddPolicy("Policy", policy => ...

  7. 【Flutter】环境搭建以及HelloWorld创建

    平台:WIndows10 Android Studio VScode同理,具体可以参考Flutter中文站 配置环境 1.下载SDK,进入官网选择最新的即可.我这里选择的是v1.9.1+hotfix. ...

  8. Android开发第一天---AndroidStudio的安装和第一个安卓开发

    今天已经是开始学习Android的第二天,我居然才把AndroidStudio开发环境安装并配置好,我只能说“我太难了”,下了好几个版本,终于找到了一个合适的,得出一个结论外国的东西是真的不太好用啊, ...

  9. [Python] 前程无忧招聘网爬取软件工程职位 网络爬虫 https://www.51job.com

    首先进入该网站的https://www.51job.com/robots.txt页面 给出提示: 找不到该页 File not found 您要查看的页已删除,或已改名,或暂时不可用. 请尝试以下操作 ...

  10. Redis-03-集群搭建

    基于redis-3.2.4的Redis-Cluster集群搭建 原理 Redis 集群采用了P2P的模式,完全去中心化.Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis ...