sjn_hoho

sjn_hoho

about-token

关于 JWT

前文

公司一直采用 JWT 作为 Authorization 认证的方案,是前期同事选择的方案。近期在实际使用过程发现,Base64 解码能直接将 Token 中的信息解出来,让我不禁发出疑问,这样的机制不是不安全吗?为什么会大行其道呢?在去 jwt.io 一番了解后,终于知道了 JWT 的结构,跟我之前的想法不一样。

正文

JWT 全名 JsonWebToken,是一种公开的行业标准RFC 7519,用于双方安全地传递信息(英文原文:JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.) 它主要分为 3 个部分 Header 头部 Payload 负载 Signature 签名,使用.符号进行分割。其中 header 一般是 { "alg": "HS256", "typ": "JWT"}带了加密的算法和类型的信息,然后使用 Base64Url 编码为第一部分,然后 Payload 就是 token 中存储数据的部分,有一些已被使用的的字段如"iss","iat"。然后自己的数据举个例子{"sub": "1234567890","name": "John Doe","admin": true},同样被 Base64 编码后作为第 2 部分,然后这一串字符串(Header.Payload)再使用声明的加密方式生成 Signature 作为第三部分,完整的一个 JWT 就是这样 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 从上文中的介绍中可以看出,前面 2 部分其实就只是用 Base64 进行编码产生的,所以毫无疑问能被解出来,但是因为第三部分是实用 rsa 加密,一般来说难以破解,所以没有什么伪造 Token 的可能性,但是因为数据不够安全,所以不能像以前 cookie 或者 session 方案中将用户信息这些存进去。而且还有一个缺点因为 JWT 在服务端没有状态,所以我可以从浏览器控制台拿出一个 token 直接来请求 api。 所以我觉得 JWT 更适用于一次性的命令认证,颁发一个有效期极短的 JWT,即使暴露了危险也很小,由于每次操作都会生成新的 JWT,因此也没必要保存 JWT,真正实现无状态。

后言

原来我以为 Token 里带的信息是完全加密的,然后做的鉴权也是根据 Payload 里的字段做的校验,后来发现 base64 能解密,我的鉴权代码不是没有用了。经过理解了 JWT 的完整结构,就算别人能伪造 Payload 中的所有的数据,但是由于不知道加密方式,导致 Signature 无法被解出,所以相对而言,鉴权还有有效的= =。