美文网首页
登录科普(二)JWT

登录科普(二)JWT

作者: 靈08_1024 | 来源:发表于2018-01-30 10:54 被阅读289次

    本篇主要讲述 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与JWTjava-jwt的GitHubJWT官网.
    JWT入门:JWT入门JWT设计单点登录

    相关文章

      网友评论

          本文标题:登录科普(二)JWT

          本文链接:https://www.haomeiwen.com/subject/ysztzxtx.html