oss-JwtToken实现方式

    xiaoxiao2025-02-16  16

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。

    流程:

    客户端使用用户名、密码请求登录。服务端收到请求,去验证用户名、密码。验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端。客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里。客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

    使用Token验证的优势:

              无状态、可扩展

                       在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。

               安全性

                     请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,更加安全。

          JWT是一种紧凑自包含的,用于在多方传递JSON对象的技术。传递的数据可以使用数字签名增加其安全行。可以使用HMAC加密算法或RSA公钥/私钥加密方式。

              紧凑:数据小,可以通过URL,POST参数,请求头发送。且数据小代表传输速度快。

              自包含:使用payload数据块记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高代码性能。

    JWT一般用于处理用户身份验证数据信息交换

               用户身份验证:一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

               数据信息交换:JWT是一种非常方便的多方传递数据的载体,因为其可以使用数据前面来保证数据的有效性和安全性。

    JWT组成: JWT数据结构 :A.B.C

       A - header 头信息

       B - payload (有效荷载?)

       C - Signature 签名

     

    header

         数据结构: {“alg”: “加密算法名称”, “typ” : “JWT”}

         alg是加密算法定义内容,如:HMAC SHA256 或 RSA

         typ是token类型,这里固定为JWT。

     

    payload

            在payload数据块中一般用于记录实体(通常为用户信息)或其他数据的。主要分为三个部分,分别是:已注册信息(registered claims),公开数据(public claims),私有数据(private claims)。

           payload中常用信息有:iss(发行者),exp(到期时间),sub(主题),aud(受众)等。前面列举的都是已注册信息。

         公开数据部分一般都会在JWT注册表中增加定义。避免和已注册信息冲突。公开数据和私有数据可以由程序员任意定义。

    注意:即使JWT有签名加密机制,但是payload内容都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。不推荐在payload中记录任何敏感数据。

     Signature

     

            签名信息。这是一个由开发者提供的信息。是服务器验证的传递的数据是否有效安全的标准。在生成JWT最终数据的之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head.加密后的payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。

    流程取自网上:

    注意:

    token保存位置

           使用JWT技术生成的token,客户端在保存的时候可以考虑cookie或localStorage。cookie保存方式,可以实现跨域传递数据。localStorage是域私有的本地存储,无法实现跨域。

    浏览器存储:

         webstorage可保存的数据容量为5M。且只能存储字符串数据。webstorage分为localStorage和sessionStorage。

           localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失。无法实现跨域。

            sessionStorage是会话相关的本地存储单元,生命周期是在仅在当前会话下有效。sessionStorage更当前浏览器窗口有关。

     案例:

    代码:https://github.com/timeday/oss-jwt-demo

    最新回复(0)