本篇主要讲述 JWT。
初识JWT
随着互联网行业的一步步推进,人们对安全的意识越来越强。一个轻便的安全跨平台传输格式应运而生。
JWT(JSON web tokens):JSON网络令牌。
特点:1、轻便;2、安全;3、跨平台。
JWT的身份验证流程
• 客户端使用用户名和密码请求登录验证
• 服务端接受请求,进行身份验证
• 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
• 客户端收到 Token 后把它存起来
• 客户端每次向服务端请求时候就带上 Token
• 服务端收到 Token 后,去验证 Token ,如果验证通过,执行业务逻辑
JWT的构成
JWT由三部分字符串组成:Header(头部)、Payload(载荷)、Signature(签名)。第二部分有些文档叫Claims(声明)。
Header部分:
{
"alg": "HS256", // 加密算法
"typ": "JWT" // 类别
}
Payload部分:
{
"aud": "uuu", // 接受者
"iss": "xxx", // 签发者
"exp": "1498499261660", // 过期时间
"sub": "yyy", // 主题
"iat": "1498459261660", // 签发时间
"jti": "", // JWT的唯一身份标示
"nbf": "1498459261660", // 定义在什么时间之前,该jwt都是不可用的
... //自定义信息
}
最后我们把Header和Payload分别Base64编码,并用.
连接:Header.Payload
。
结果格式为:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiLnrb7lj5HkuroifQ
。
然后把该字串用上面提到的算法加密(本例中为HS256算法),得到一字串:
ZNcRKUyIUD9tPDKldPUoU54sVWmHFhTzLo6FsTULSlUyuvkXjY7UJ_uPCzSYNgd8c-3ex16_8-U1x_uBPzudhg
这一部分叫做签名。
最后把Header.Payload.Signature
拼接起来就是JWT。
JWT的安全性
正如上述讲到的,JWT是存于客户端的,所以需要在返回时添加HttpOnly
属性防止XSS攻击。
JWT的Header和Payload全部都是Base64编码(不可指定)!其签名的加密算法可以选择:
JWS | Algorithm | Description |
---|---|---|
HS256 | HMAC256 | HMAC with SHA-256 |
HS384 | HMAC384 | HMAC with SHA-384 |
HS512 | HMAC512 | HMAC with SHA-512 |
RS256 | RSA256 | RSASSA-PKCS1-v1_5 with SHA-256 |
RS384 | RSA384 | RSASSA-PKCS1-v1_5 with SHA-384 |
RS512 | RSA512 | RSASSA-PKCS1-v1_5 with SHA-512 |
ES256 | ECDSA256 | ECDSA with curve P-256 and SHA-256 |
ES384 | ECDSA384 | ECDSA with curve P-384 and SHA-384 |
ES512 | ECDSA512 | ECDSA with curve P-521 and SHA-512 |
JWT本身是不可伪造,不可篡改的,但是不代表非法用户冒充正常用法发起请求,所以常规的几个安全策略在实际项目中都应该使用:
- 使用https
- 管理好密钥
- 防范CSRF攻击。
单点登录
Session方式来存储用户id,一开始用户的Session只会存储在一台服务器上。对于有多个子域名的站点,每个子域名至少会对应一台不同的服务器,例如:
• www. taobao. com
• nv.taobao.com
• nz.taobao.com
• login.taobao.com
所以如果要实现在login.taobao.com登录后,在其他的子域名下依然可以取到Session,这要求我们在多台服务器上同步Session。
使用JWT的方式则没有这个问题的存在,因为用户的状态已经被传送到了客户端。因此,我们只需要将含有JWT的Cookie的domain设置为顶级域名即可,例如
Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.taobao.com
注意domain必须设置为一个点加顶级域名,即.taobao.com。这样,taobao.com和*.taobao.com就都可以接受到这个Cookie,并获取JWT了。
参考文献:
JWT与JAVA: Web安全通讯之Token与JWT;java-jwt的GitHub;JWT官网.
JWT入门:JWT入门;JWT设计单点登录
网友评论