如何实现jwt鉴权机制?
JWT(JSON Web Token),本质就是一个字符串书写规范,作用是用来在用户和服务器之间传递安全可靠的信息
- 为什么需要token
在后台管理系统中,我们通常使用cookie-session的方式用于鉴权, jwt实现token鉴权(nodejs koa) 但这种方式存在着以下问题:
1、比如cookie的容量太小、
2、浏览器端和app端发送http请求时携带cookie会有差异、
3、分布式系统和服务器集群保证如何保证sessionId是相同,
基于以上问题,有了token这种方式,token的鉴权不受浏览器或app端的限制,通用性安全性都更强。
实现token的鉴权方式通常使用jwt,即json web token,jwt的格式如 xxx.yyy.zzz
- 头部(Header) xxx的部分用来描述使用什么样的加密方式
- 载荷(Payload) yyy的部分是携带的数据,比如id,name,通常还会携带 iat(issue at)发布时间, exp(expiration time)过期时间,用于鉴权的时候判断此token是否在有效期内,以上xxx和yyy都是对json数据以base64编码的方式进行转换,
- 签名(Signature)而zzz是对xxx.yyy再加上密钥进行加密,加密的方式在header中。
在目前前后端分离的开发过程中,使用token鉴权机制用于身份验证是最常见的方案,流程如下:
- 服务器当验证用户账号和密码正确的时候,给用户颁发一个令牌,这个令牌作为后续用户访问一些接口的凭证
- 后续访问会根据这个令牌判断用户时候有权限进行访问
如何实现JWT鉴权(总结)
Token的使用分成了两部分:
- 生成token:登录成功的时候,颁发token
- 验证token:访问某些资源或者接口时,验证token
使用JWT鉴权的优缺点
优点:
- json具有通用性,所以可以跨语言
- 组成简单,字节占用小,便于传输
- 服务端无需保存会话信息,很容易进行水平扩展
- 一处生成,多处使用,可以在分布式系统中,解决单点登录问题
- 可防护CSRF攻击
缺点: - payload部分仅仅是进行简单编码,所以只能用于存储逻辑必需的非敏感信息
- 需要保护好加密密钥,一旦泄露后果不堪设想
- 为避免token被劫持,最好使用https协议