imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
、、token 、JWT详解
不保存 id 了, 只是生成token , 然后验证token
cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
由服务器生成,发送给浏览器,浏览器把以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该发送给服务器。由于是存在客户端上的,所以浏览器加入了一些限制确保不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的数量是有限的。
session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。
也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 的方式。
服务器使用把用户的信息临时保存在了服务器上,用户离开网站后会被销毁。这种用户信息存储方式相对来说更安全,可是有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候会丢失。
Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 里,下次这个用户再向服务端发送请求的时候,可以带着这个 ,这样服务端会验证一个这个 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 ,我们需要在服务端存储为登录的用户生成的 ,这些 可能会存储在内存token 权限管理·(中国)官方网站,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 。
Token
在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中, 是多用户下处理认证的最佳方式。
以下几点特性会让你在程序中使用基于Token的身份验证
1.无状态、可扩展
2.支持移动设备
3.跨程序调用
4.安全
那些使用基于Token的身份验证的大佬们
大部分你见到过的API和Web应用都使用。例如, , +, 等。
基于Token的验证原理
基于Token的身份验证是无状态的,我们不将用户信息存在服务器或中。
这种概念解决了在服务端存储信息时的许多问题
意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。
基于Token的身份验证的过程如下:
1.用户通过用户名和密码发送请求。
2.程序验证。
3.程序返回一个签名的token 给客户端。
4.客户端储存token,并且每次用于每次发送请求。
5.服务端验证token并返回数据。
每一次请求都需要token。token应该在HTTP的头部发送从而保证了Http请求无状态。我们同样通过设置服务器属性--Allow-:* ,让服务器能接受到来自所有域的请求。需要主要的是,在ACAO头部标明()*时,不得带有像HTTP认证,客户端SSL证书和的证书。
实现思路:
1.用户登录校验,校验成功后就返回Token给客户端。
2.客户端收到数据后保存在客户端
3.客户端每次访问API是携带Token到服务器端。
4.服务器端采用过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
的优势:
无状态、可扩展、安全性、可扩展性()、多平台跨域、基于标准
JWT产生和验证Token
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
一、跨域认证的问题
HTTP协议是无状态的,也就是说,如果我们已经认证了一个用户,那么他下一次请求的时候,服务器不知道我是谁,我们必须再次认证。
互联网服务离不开用户认证。一般流程是下面这样。
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话()里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 ,写入用户的 。
4、用户随后的每一次请求,都会通过 ,将 传回服务器。
5、服务器收到 ,找到前期保存的数据,由此得知用户的身份。
这种模式的问题在于,扩展性()不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 数据共享,每台服务器都能够读取 。
举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
一种解决方案是 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。
另一种方案是服务器索性不保存 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
二、JWT 的原理
JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。
“姓名”: “张三”,
“角色”: “管理员”,
“到期时间”: “2018年7月1日0点0分”
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。服务器就不保存任何 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
三、JWT 的数据结构
实际的 JWT 大概就像下面这样。
..AJc
它是一个很长的字符串,中间用点(.)分隔成三个部分。
JWT 的三个部分依次如下。
(头部) 描述 JWT 的元数据
(负载) 用来存放实际需要传递的数据
(签名) 对前两部分的签名,防止数据篡改
写成一行,就是下面的样子。
..
下面依次介绍这三个部分。
1、
部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
“alg”: “HS256”,
“typ”: “JWT”
上面代码中,alg属性表示签名的算法(),默认是 HMAC (写成HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 算法(详见后文)转成字符串。
2、
部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 算法转成字符串。
3、
部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥()。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 里面指定的签名算法(默认是 HMAC ),按照下面的公式产生签名。
(
() + “.” +
(),
)
算出签名以后,把 、、 三个部分拼成一个字符串imToken钱包下载,每个部分之间用"点"(.)分隔,就可以返回给用户。
4、
前面提到, 和 串型化的算法是 。这个算法跟 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 /?token=xxx)。 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 算法。
四、JWT 的使用方式
在认证的时候,当用户用他们的凭证成功登录以后,一个JSON Web Token将会被返回。此后,token就是用户凭证了,你必须非常小心以防止出现安全问题。一般而言,你保存令牌的时候不应该超过你所需要它的时间。
客户端收到服务器返回的 JWT,可以储存在 里面,也可以储存在 。
此后,客户端每次与服务器通信,都要带上这个 JWT。
· 你可以把它放在 里面自动发送,但是这样不能跨域,
· 所以更好的做法是放在 HTTP 请求的头信息字段里面,因为它不使用。
· 另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点:
1、JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
2、JWT 不加密的情况下,不能将私密数据写入 JWT。
3、JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
4、JWT 的最大缺点是,由于服务器不保存 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
5、JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
6、为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
六、 JWT与的差异
1、相同点是,它们都是存储用户信息;然而,是在服务器端的,而JWT是在客户端的。
2、方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。
3、而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。
4、的状态是存储在服务器端,客户端只有 id;而Token的状态是存储在客户端。
七、基于Token的身份认证流程
基于Token的身份认证是无状态的,服务器或者中不会存储任何用户信息。没有会话信息意味着应用程序可以根据需要扩展和添加更多的机器,而不必担心用户登录的位置。
虽然这一实现可能会有所不同,但其主要流程如下:
1、用户携带用户名和密码请求访问
2、服务器校验用户凭据
3、应用提供一个token给客户端
4、客户端存储token,并且在随后的每一次请求中都带着它
5、 服务器校验token并返回数据
注意:
每一次请求都需要token。Token应该放在请求中。
八、使用Token的优点
1、无状态和可扩展性:存储在客户端。完全无状态,可扩展。我们的负载均衡器可以将用户传递到任意服务器,因为在任何地方都没有状态或会话信息。
2、安全:Token不是。(The token, not a .)每次请求的时候Token都会被发送。而且,由于没有被发送,还有助于防止CSRF攻击。即使在你的实现中将token存储到客户端的中,这个也只是一种存储机制,而非身份认证机制。没有基于会话的信息可以操作,因为我们没有会话。
3、token在一段时间以后会过期,这个时候用户需要重新登录。这有助于我们保持安全。还有一个概念叫token撤销,它允许我们根据相同的授权许可使特定的token甚至一组token无效。
九、JWT与OAuth的区别
1、是一种授权框架 ,JWT是一种认证协议。
2、无论使用哪种方式切记用HTTPS来保证数据的安全性
3、用在使用第三方账号登录的情况(比如使用weibo, qq, 登录某个app),而JWT是用在前后端分离, 需要简单的对后台API进行保护时使用。
~-5-.he
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。