Golang中的JWT基础 | 青训营

121 阅读2分钟

Golang中的JWT基础使用学习笔记

JSON Web Token(JWT)是一种跨域身份验证的解决方案,可以在双方安全地传输信息。使用JWT可以在Go语言程序中实现身份认证功能。

JWT的组成

一个JWT由三部分组成:Header(头部)、Payload(负载)、Signature(签名)。

Header 用于描述关于该JWT的基本信息,如所使用的哈希算法。

Payload 用于存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分:

  1. 标准中注册的声明

  2. 公共的声明

  3. 私有的声明

Signature 由编码后的header和payload、秘钥通过header中指定签名算法生成。

三段信息经过Base64Url编码组成了一个JWT:

header.payload.signature

Golang中使用JWT

Golang中可以使用像github.com/dgrijalva/jwt-go这样的三方库来使用JWT。

import "github.com/dgrijalva/jwt-go"

// 生成JWT
func GenerateToken(user User) (string, error) {
  token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "username": user.UserName,
    "exp": time.Now().Add(time.Hour * 24).Unix()  
  })

  tokenString, err := token.SignedString(mySecret)

  return tokenString, err
}

// 解析JWT
func ParseToken(tokenString string) (*jwt.Token, error) {
  return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
      return mySecret, nil
  })
}

上面代码演示了使用jwt-go库生成和解析JWT的简单例子。

主要步骤是:

  1. 定义claims,可以包含标准注册的声明,也可以添加自定义声明

  2. 使用声明生成token对象

  3. 使用签名算法和密钥签名token,生成token字符串

  4. 解析token字符串,recover claims

标准声明可以用于识别用户身份,自定义声明可用于存放附加信息。JWT作为一个令牌,可以在不同服务间安全地传递用户信息,实现无状态的认证机制。

JWT使用时的注意事项

  • 不要在JWT的Payload中存放敏感信息,Payload是可以破解的。敏感信息比如密码可以存放在自定义Claim中,但一定不要明文存储。

  • 设置较短的token有效时间,降低token被破解的窗口期。

  • 使用HTTPS来传输JWT可以防止抓包获取token。

  • 不要使用对称加密来签发token,这样密钥一旦泄露,所有token立刻不安全。

总结

JWT作为一种流行的跨域认证解决方案,使用便利。但正确的使用方式很重要。需要充分考虑安全方面,采取必要措施来减少误用和被攻击的风险。

以上是我关于Go语言中JWT使用的一些笔记,讲解了JWT的组成结构、Go语言中的基本使用方式、以及需要注意的安全性问题。希望这些笔记可以帮助大家更好地理解和使用JWT。