登录科普(二)JWT

本篇主要讲述 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本身是不可伪造,不可篡改的,但是不代表非法用户冒充正常用法发起请求,所以常规的几个安全策略在实际项目中都应该使用:

  1. 使用https
  2. 管理好密钥
  3. 防范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设计单点登录

你可能感兴趣的:(登录科普(二)JWT)