服务器端维护登陆状态,使用传统Cookie和Session方案,扩展性很差。而JWT可实现服务器无状态,扩展性好。html
在单点登陆的时候,共享登陆状态信息的实现有如下两种方案:前端
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间做为JSON对象安全地传输信息。 此信息能够经过数字签名进行验证和信任。 JWT可使用HMAC对称加密算法或RSA (ECDSA) 非对称加密算法进行签名。web
服务器认证之后,生成一个json对象,发回给客户端。以后,客户端与服务端通讯,回传这个JSON对象。服务器靠这个对象认定用户身份。为防止用户篡改数据,服务器生成这个对象的时候,会加上签名。服务器再也不保存任何session数据,实现了服务无状态,从而比较容易实现扩展。算法
Header.Payload.Signature数据库
Base64URL算法json
Base64编码后的字符串中可能包含 + 、/ 和 = 三个字符,在 URL 里面有特殊含义,因此要被替换掉:= 被省略、+ 替换成-,/ 替换成 _ 。这就是 Base64URL 算法。api
JWT做为一个令牌(token),有些场景可能会放到URL(如:api.example.com/?token=xxx),所以须要采用Base64URL 算法将Header 和 Payload 转化为字符串。浏览器
JWT可选择的客户端存储位置包括sessionStorage、localStorage和cookie。三个位置各有优缺点,具体比较以下。安全
优势 | 缺点 | |
---|---|---|
sessionStorage | 浏览器关闭即自动清除数据 | 存在不可跨浏览器窗口共享数据,跨窗口需从新登陆;可被JS读取,可能受到XSS攻击 |
localStorage | 可跨窗口共享数据,过时时间前可实现自动登陆 | 退出登陆或JWT过时需主动清除数据;可被JS读取,可能受到XSS攻击 |
cookie | 可设置httpOnly属性防止被JS读取,防止XSS攻击;可设置secure保证JWT只在HTTPS下传输 | 容易受到CSRF攻击 |
Token的初衷是防范CSRF攻击。防范大概的原理是,cookie会被浏览器自动带上,而token 或 JWT须要在发送请求前,前端代码中去设置请求头,防范了CSRF的攻击。XSS攻击的防范比较容易,所以笔者我的不推荐将JWT存在cookie里(我的意见,不喜勿碰)。服务器
优势:
缺点:
若是在用户使用过程当中,JWT失效(过时时间到了),页面跳转至登陆页,这样会形成很差的用户体验。
从范围来说,JWT属于Token,Token的形式能够多种多样,不限于JWT这种Header.Payload.Signature样子。JWT的特色大部分都适用于Token,固然Token也有本身的特性,本文(本次讨论)没有详细讨论Token相关内容,感兴趣的小伙伴能够自行发掘。