jwt-go

https://github.com/dgrijalva/jwt-go



JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。



直白的讲jwt就是一种用户认证(区别于session、cookie)的解决方案。

session有两个弊端:



1、无法实现跨域。



2、由于session数据属于集中管理里,量大的时候服务器性能是个问题。



优点:



1、session存在服务端,数据相对比较安全。



2、session集中管理也有好处,就是用户登录、注销服务端可控。



cookie
cookie也是一种解决网站用户认证的实现方式,用户登录时,服务器会发送包含登录凭据的Cookie到用户浏览器客户端,浏览器会将Cookie的key/value保存用户本地(内存或硬盘),用户再访问网站,浏览器会发送cookie信息到服务器端,服务器端接收cookie并解析来维护用户的登录状态。



cookie避免session集中管理的问题,但也存在弊端:



1、跨域问题。



2、数据存储在浏览器端,数据容易被窃取及被csrf攻击,安全性差。



优点:



1、相对于session简单,不用服务端维护用户认证信息。



2、数据持久性。



jwt
jwt通过json传输,php、java、golang等很多语言支持,通用性比较好,不存在跨域问题。传输数据通过数据签名相对比较安全。客户端与服务端通过jwt交互,服务端通过解密token信息,来实现用户认证。不需要服务端集中维护token信息,便于扩展。当然jwt也有其缺点。



缺点:



1、用户无法主动登出,只要token在有效期内就有效。这里可以考虑redis设置同token有效期一直的黑名单解决此问题。



2、token过了有效期,无法续签问题。可以考虑通过判断旧的token什么时候到期,过期的时候刷新token续签接口产生新token代替旧token。



jwt构成:
Header:TOKEN 的类型,就是JWT,签名的算法,如 HMAC SHA256、HS384
Payload:载荷又称为Claim,携带的信息,比如用户名、过期时间等,一般叫做 Claim
Signature:签名,是由header、payload 和你自己维护的一个 secret 经过加密得来的



https://segmentfault.com/a/1190000022792874



https://blog.fatedier.com/2020/03/28/golang-jwt/



https://betterprogramming.pub/hands-on-with-jwt-in-golang-8c986d1bb4c0


Category golang