版权声明:本文为博主原创文章,博客地址:
https://blog.csdn.net/zxy_666/article/details/80021331,未经博主允许不得转载。
基础知识前瞻
前言:
因为http协议是一种无状态协议,这就涉及用户访问系统的状态保持问题。
在登录系统的设计中,当用户访问系统时,服务器需要认证用户登录相关的信息,以决定用户能否登录到系统中。
这一设计一般有2种实现方式:session和jwt。每种开发语言都有其相应的实现包,本文主要介绍jwt在go中的实践。
jwt简介
JSON Web Token(jwt)是一种规范,常用于用户与服务器间的认证。
jwt结构
jwt由以下三部分构成:
* Header:头部 (对应:Header)
* Claims:声明 (对应:Payload)
* Signature:签名 (对应:Signature)
Header头部
Header中指明jwt的签名算法,如
{
"typ": "JWT",
"alg": "HS256"
}
Claims声明
声明中有jwt自身预置的,使用时可选。当然,我们也可以加入自定义的声明,
如uid,userName之类信息,但一定不要声明重要或私密的信息,因为这些信息是可破解的。
Signature签名
在生成jwt的token(令牌的意思)串时,先将Header和Claims用base64编码,再用Header中指定的加密算法,
将编码后的2个字符串进行加密(签名)。加密时需要用到一个signString签名串,我们可指定自己的signString,
不同的signString生成的加密结果不一样(解密时可能也需要同样的串,视加密算法而定)。
最后生成的jwt token串格式是:Header.Claims.Signature.如
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
(实际的token串不换行,这里只为展示清晰)
session VS jwt
- 二者最主要的区别是用户登录状态的保存机制。
session:将用户登录的状态信息保存在服务器,客户端只存储uid。
客户端访问服务器时,服务器拿着uid去获取相应的服务器session(一个数据结构),并判断用户登录状态是否有效,是则允许登录系统,否则返回客户端(重新登录)。
jwt:将用户登录状态信息保存在客户端(即token串,因为token只保存在客户端),token中可以设置token失效时间。
客户端访问服务器时,带着该token,服务器解析token,解析成功且登录状态有效可以放行,否则返回客户端(具体逻辑视个人情况而定)。
- 对服务器压力
session:因为session会话信息保存在服务器,会增加服务器I/O压力
jwt token:因服务器需要解析token(如base64解码,解密),会增加服务器计算压力。
但token中可以保存一些用户的基本信息,服务器解析即可获取,免去了查数据库的必要
2种方式各有各的好,至于使用哪种方式,视自身情况而定。
扩展
本文重点在于jwt的go实现,概念只做大致介绍
对于初次接触登录系统设计或开发的同学,先对相关概念和设