暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JWT

花好夜猿 2019-02-26
489

JWT


何为 JWT?


JWT 官网针对其制定的规范如下


JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.


The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as


the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.


大体意思如下:


JWT 是一种双方 URL 安全信息传输的协议(约定)。 JWT 是一串加密的 JSON 编码,可以是一串用作 web 认证的json串,可以是一串进行认证的明文,也可以是一串加密的认证信息。


可以直接理解为,JWT 就是将用户信息通过复杂加密后得到的一串字符串。


随着 REST 成为 主流,请求的无状态化开发 也 渐渐成为了主流。JWT 和 HTTP 一样 都是一种无状态 的协议。所以在完成请求无状态设计过程中,JWT 是身份认证实现方式最好的选择之一。


JWT 工作方式


JWT工作方式很简单

一、用户使用用户密码进行身份认证,服务器 返回给 用户一个唯一的加密的身份标识,

二、用户每次请求携带这个标识进行访问,这个标识为接口访问的凭证

三、针对需要凭证的接口进行请求拦截,验证凭证有效性。


传统的 session 认证


在web服务请求中,我们通常使用 HTTP 协议进行 服务器资源,信息,数据的请求。而 HTTP 属于无状态的请求,换句话说就是,HTTP 的每一次请求对于 服务器来说都是没有区别的,这个导致了服务器无法通过请求区分本次请求是哪个用户发起的。 


为了解决这个问题, session 出现在了人们的视野中。


我们可简单的认为 session的就两部分:用户身份信息 以及 凭证。
session 通过在服务器中维护一个用户身份信息和凭证对应关系的列表数据 ,然后通过比对每次请求中携带的凭证与列表中的数据来完成用户身份认证。


对比 session 认证 和 JWT 认证


从上面来看,session 和 jwt 在完成身份认证的方式,大同小异。不过 session 和 JWT 还是存在一定差异的。

session 的使用 需要维护一个身份列表,而用户越多,所需要维护的数据就越多占用的内存就越多。而 JWT 只管签发 身份凭证 token ,并不做身份信息保存,所以无需占用内存。


分布式环境中,session 存在 session 共享的问题,而 JWT 由于只管签发,不需要保存,所以不存在需要共享数据的问题。


不过 JWT也存在问题,JWT 在定义时就明确,用户身份凭证 token 一旦签发就无法收回,在限定的有效期内该token将会一直有效,并且由于没有记录无法对这个 token 进行废弃操作,而一旦这个 token 泄露,任何人都可以通过这个 token 进行接口访问。从而导致了可能存在用户信息泄露安全的问题。


传统session认证 或者 JWT 实现身份认证 如何抉择


对于如何选择,只能看具体的应用场景,无论是 session 还是 JWT 都有其优势和劣势。就拿 session 认证来说,虽然 session 存在共享数据的问题,但是在业内也已有了成熟的解决办法,可以通过单点登录,或者将其存入如 redis 等数据存储系统节点中,解决session 共享的问题。

在安全方面的考虑,session 存在 cookiie 丢失导致的跨站请求伪造攻击。而 JWT 也可能存在 加密秘钥丢失导致黑客能够模拟用户请求,随意获取,篡改用户数据。


JWT 构成


定义:JWT签发的身份凭证就是一串加密的 JSON字符串。


且该 JSON 串是有规则的字符串:

(可以查看:https://jwt.io/introduction/)


JWT 字符串格式定义: xxxxxx.yyyyyy.zzzzzz。其显示如下图:

其由三部分组成:

  1. Header(xxxxxx) 
    主要用来声明加密算法

  2. payload(yyyyyy)
    用来承载token相关声明信息,包括注册声明、公共声明,私有声明。


  3. signature(zzzzzz)
    代表签证信息。这个签证信息由三部分组成:
     a、base64后的 Header 
     b、base64后的 payload
     c、secrect
    通过如下算法计算得到:


由于 JWT 相关实现代码在网络上有很多(其实就是懒),这里就不贴代码了。


使用JWT 做跨域身份验证需要注意那些?


  1. 由于JWT默认不加密,所以在传输过程中私密性数据无法通过 JWT 进行传输。所以在传输前,针对JWT 在进行一次加密保证传输过程中的数据安全。但是处于安全考虑,在 JWT 字符串中最好不要存放过多私密性数据。

  2. JWT 一旦签发无法撤销,所以过期时间不宜过长,减少被盗用的概率。

  3. 使用 HTTP 协议传输最好为其配置证书,使用 HTTPS 进行传输更安全。


  长按二维码关注,一起共同成长!

文章转载自花好夜猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论