欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > javascript >内容正文

javascript

jwt(json web token)简介 -凯发k8官方网

发布时间:2025/1/21 javascript 16 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 jwt(json web token)简介 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 一、jwt是什么
    • 二、跨域认证问题
    • 三、jwt原理
    • 四、jwt数据结构
      • 1、header(头部)
      • 2、payload(负载)
      • 3、signature
    • 五、jwt是如何工作的

一、jwt是什么

json web token (jwt)是一个开放标准(rfc 7519),它定义了一种紧凑的、自包含的方式,用于作为json对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

二、跨域认证问题

互联网服务离不开用户认证,一般流程如下:

  • 用户向服务器发送用户名和密码。
  • 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  • 服务器向用户返回一个 session_id,写入用户的 cookie。
  • 用户随后的每一次请求,都会通过 cookie,将 session_id 传回服务器。
  • 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
  • 这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

    一种凯发k8官方网的解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

    另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。jwt 就是这种方案的一个代表。

    三、jwt原理

    jwt原理,服务器认证以后,生成一个 json 对象,发回给用户,就像下面这样

    {"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日0点0分" }

    以后,用户与服务端通信的时候,都要发回这个 json 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

    服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

    四、jwt数据结构

    实际返回给前端jwt数据结构是这样

    eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6i kpvag4grg9liiwiywrtaw4ionrydwv9.tjva95orm7e2cbab30rmhrhdcefxjoyzgefonfh7hg q

    是一个很长的字符串,中间以(.)分割。注意jwt没有换行的

    jwt三部分如下:

    header(头部) payload(负载) signature(签名)

    1、header(头部)

    header典型的由两部分组成:token的类型(“jwt”)和算法名称(比如:hmac sha256或者rsa等等)。

    {"alg": "hs256","typ": "jwt" }

    然后,用base64对这个json编码就得到jwt的第一部分

    2、payload(负载)

    jwt的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和private

    • registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
    • public claims : 可以随意定义。
    • private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
      官方给了7个字段供选用
    iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (not before):生效时间 iat (issued at):签发时间 jti (jwt id):编号

    除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

    {"sub": "1234567890","name": "john doe","admin": true }

    注意,不要在jwt的payload或header中放置敏感信息,除非它们是加密的。

    3、signature

    signature 部分是对前两部分的签名,防止数据篡改。

    首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 header 里面指定的签名算法(默认是 hmac sha256),按照下面的公式产生签名。
    看一张凯发k8官方网官网的图就明白了:

    五、jwt是如何工作的

    在认证的时候,当用户用他们的凭证成功登录以后,一个json web token将会被返回。此后,token就是用户凭证了,你必须非常小心以防止出现安全问题。一般而言,你保存令牌的时候不应该超过你所需要它的时间。

    无论何时用户想要访问受保护的路由或者资源的时候,用户代理(通常是浏览器)都应该带上jwt,典型的,通常放在authorization header中,用bearer schema。

    header应该看起来是这样的:

    authorization: bearer

    服务器上的受保护的路由将会检查authorization header中的jwt是否有效,如果有效,则用户可以访问受保护的资源。如果jwt包含足够多的必需的数据,那么就可以减少对某些操作的数据库查询的需要,尽管可能并不总是如此。

    如果token是在授权头(authorization header)中发送的,那么跨源资源共享(cors)将不会成为问题,因为它不使用cookie。

    鸣谢:
    http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html https://www.cnblogs.com/cjsblog/p/9277677.html

    总结

    以上是凯发k8官方网为你收集整理的jwt(json web token)简介的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图