JWT 简介
什么是 JWT
全称 JSON Web Token
, 是目前最流行的跨域认证解决方案。基本的实现是服务端认证后,生成一个 JSON
对象,发回给用户。用户与服务端通信的时候,都要发回这个 JSON
对象。
该 JSON
类似如下:
{ "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" }
为什么需要 JWT
先看下一般的认证流程,基于 session_id
和 Cookie
实现
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话( session
)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id
,写入用户的 Cookie
。
4、用户随后的每一次请求,都会通过 Cookie
,将 session_id
传回服务器。
5、服务器收到 session_id
,找到前期保存的数据,由此得知用户的身份。
但是这里有一个大的问题, 假如是服务器集群,则要求 session 数据共享,每台服务器都能够读取 session 。这个实现成本是比较大的。
而 JWT
转换了思路,将 JSON
数据返回给前端的,前端再次请求时候将数据发送到后端,后端进行验证。也就是服务器是无状态的,所以更加容易拓展。
JWT 的数据结构
JWT
的三个部分依次如下:
Header
(头部),类似如下
{ "alg": "HS256", "typ": "JWT" }
alg
属性表示签名的算法( algorithm
),默认是 HMAC SHA256
(写成 HS256
)。 typ
属性表示这个令牌( token
)的类型( type
), JWT
令牌统一写为 JWT
Payload
(负载)。也是一个 JSON
,用来存放实际需要传递的数据。 JWT
规定了 7 个官方字段。如下所示
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
当然也可以自定义私有字段。 但是要注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
Signature
(签名)。 Signature
部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥( secret
)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header
里面指定的签名算法(默认是 HMAC SHA256
),按照下面的公式产生签名。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出签名以后,把 Header
、 Payload
、 Signature
三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。如下所示
JWT 的安全
-
JWT
默认是不加密,但也是可以加密的。JWT
不加密的情况下,不能将秘密数据写入JWT
-
JWT
本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT
的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证 - 为了减少盗用,
JWT
不应该使用HTTP
协议明码传输,要使用HTTPS
协议传输
Node 简单demo—— Koa JWT 的实现
说完理论知识,我们来看下如何实现 JWT
,大致的流程如下:
首先,用户登录后服务端根据用户信息生成并返回 token
给到客户端,前端在下次请求中把 token
带给服务器,服务器验证有效后,返回数据。无效的话,返回 401
状态码
这里我们用 Node
实现,主要用到的两个库有
Node.js 应用:Koa2 使用 JWT 进行鉴权
到此这篇关于Node使用koa2实现一个简单JWT鉴权的方法的文章就介绍到这了,更多相关Node koa2 JWT鉴权内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!
Node使用koa2实现一个简单JWT鉴权的方法
- Author -
Gopal声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@