Go实现jwt

本文介绍了JWT在Go语言中的实现,包括JWT的基础知识、JWT与Session的对比,以及使用jwt-go库创建JWT的详细步骤。文章探讨了如何在用户主动退出登录时处理JWT的有效性,并提出了使用双重token以增强安全性。
摘要由CSDN通过智能技术生成

版权声明:本文为博主原创文章,博客地址:
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实现,概念只做大致介绍

对于初次接触登录系统设计或开发的同学,先对相关概念和设

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值