>  기사  >  백엔드 개발  >  Go 언어에서 JWT를 사용하여 인증을 구현하는 모범 사례

Go 언어에서 JWT를 사용하여 인증을 구현하는 모범 사례

王林
王林원래의
2023-06-17 12:54:102453검색

웹 애플리케이션의 인기와 애플리케이션 범위가 확대됨에 따라 사용자 데이터 및 신원 정보를 보호하는 것이 점점 더 중요해지고 있습니다. 애플리케이션에서의 인증은 매우 필요합니다. 이 기사에서는 JWT를 사용하여 Go 언어로 인증을 구현하는 방법에 대한 모범 사례를 소개합니다.

JWT란

JWT는 JSON Web Token의 약자로, 쿠키 등의 저장방식 없이 정보를 안전하게 전송할 수 있는 인증 메커니즘입니다.

A JWT는 세 부분으로 구성됩니다.

  • 헤더: 알고리즘 및 유형과 같은 정보가 포함됩니다.
  • 페이로드: 사용자 이름, ID 등 전달할 사용자 정보를 저장합니다.
  • 서명: 헤더, 페이로드 및 키에 의해 생성된 서명은 JWT가 변조되지 않았음을 보장합니다.

사용자가 로그인하면 서버는 사용자 정보를 확인합니다. 통과하면 서버는 JWT를 생성하여 클라이언트에 다시 반환합니다. 사용자를 식별하기 위해 서버를 사용하면 모든 요청에 ​​대해 세션을 인증하고 저장할 필요가 없습니다.

JWT를 사용하여 Go 언어로 인증을 구현하는 방법

설치

JWT를 사용하려면 관련 패키지를 설치해야 합니다. Go 언어에서는 쉽게 사용할 수 있는 github.com/dgrijalva/jwt-go 패키지가 공식적으로 제공됩니다. github.com/dgrijalva/jwt-go包,可以轻松使用。

go get github.com/dgrijalva/jwt-go

创建JWT令牌

我们可以使用以下代码创建JWT令牌

func createToken() string {
    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)
    claims["name"] = "张三"
    claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 1天过期
    tokenString, _ := token.SignedString([]byte("自定义密钥"))
    return tokenString
}

jwt.New(jwt.SigningMethodHS256)用于创建JWT令牌实例,其中jwt.SigningMethodHS256表示使用HS256算法。

令牌实例的Claims类型是一个map,通过向该map添加信息,可以在令牌中存储自定义的数据。进行身份验证时,可以获取Payload中的数据。

在Claims中,我们通过添加"name"和"exp"来定义了用户信息和过期时间,然后我们通过使用密钥进行签名生成了JWT令牌。

解析JWT令牌

当客户端向服务端发送JWT令牌时,服务端需要检查JWT令牌的有效性并解析获取用户信息。

func parseToken(tokenString string) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("预期的签名方法不正确:%v", token.Header["alg"])
        }
        return []byte("自定义密钥"), nil
    })
    if err != nil {
        fmt.Println("JWT解析失败")
        return
    }
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        fmt.Println(claims["name"], claims["exp"])
    } else {
        fmt.Println("无效的JWT令牌")
    }
}

在代码中,强制类型转换token.Claims.(jwt.MapClaims)获得map形式的jwt.Claims,并进行验证。

我们还需要提供密钥(这里是"自定义密钥")来验证签名,以确保传输过程中未被篡改。

如果JWT令牌验证通过,就可以从Claims中获取信息,包括存储在令牌中的自定义数据。

JWT使用实例

下面是一个完整的Go示例,展示创建JWT令牌和解析JWT令牌的完整过程。

package main

import (
    "fmt"
    "time"

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

func main() {
    // 创建JWT令牌
    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)
    claims["name"] = "张三"
    claims["exp"] = time.Now().Add(time.Hour * 24).Unix()

    // 签名密钥
    tokenString, _ := token.SignedString([]byte("自定义密钥"))
    fmt.Println("JWT创建成功", tokenString)

    // 解析JWT令牌
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("预期的签名方法不正确:%v", token.Header["alg"])
        }
        return []byte("自定义密钥"), nil
    })
    if err != nil {
        fmt.Println("JWT解析失败")
        return
    }
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        fmt.Println("JWT解析成功", claims["name"], claims["exp"])
    } else {
        fmt.Println("无效的JWT令牌")
    }
}

总结

在Web应用程序中进行身份验证非常必要,使用JWT凭据可以减少服务端处理开销和提高性能,同时也是更加安全和可靠的身份验证机制。在Go语言中,使用JWT非常方便,通过相关的包github.com/dgrijalva/jwt-gorrreee

JWT 토큰 만들기

다음 코드를 사용하여 JWT 토큰을 만들 수 있습니다🎜rrreee🎜jwt.New(jwt.SigningMethodHS256)는 JWT 토큰 인스턴스를 만드는 데 사용됩니다. 여기서 jwt.SigningMethodHS256은 다음을 의미합니다. HS256 알고리즘을 사용합니다. 🎜🎜토큰 인스턴스의 클레임 유형은 지도에 정보를 추가하여 맞춤형 데이터를 토큰에 저장할 수 있습니다. 인증 시 Payload에 있는 데이터를 획득할 수 있습니다. 🎜🎜클레임에서는 "name"과 "exp"를 추가하여 사용자 정보와 만료 시간을 정의한 다음 키로 서명하여 JWT 토큰을 생성했습니다. 🎜🎜JWT 토큰 분석🎜🎜클라이언트가 JWT 토큰을 서버에 보낼 때 서버는 JWT 토큰의 유효성을 확인하고 이를 구문 분석하여 사용자 정보를 얻어야 합니다. 🎜rrreee🎜코드에서 형 변환 token.Claims.(jwt.MapClaims)을 캐스팅하여 지도 형태로 jwt.Claims를 얻고 검증합니다. 🎜🎜또한 전송 중에 변조되지 않았는지 확인하기 위해 서명을 확인하기 위한 키(여기서는 "사용자 정의 키")를 제공해야 합니다. 🎜🎜JWT 토큰 확인이 통과되면 토큰에 저장된 사용자 정의 데이터를 포함하여 Claims에서 정보를 얻을 수 있습니다. 🎜🎜JWT 사용 예시🎜🎜다음은 JWT 토큰 생성 및 JWT 토큰 파싱의 전체 프로세스를 보여주는 완전한 Go 예시입니다. 🎜rrreee🎜요약🎜🎜JWT 자격 증명을 사용하면 서버 측 처리 오버헤드를 줄이고 성능을 향상할 수 있으며, 더욱 안전하고 안정적인 인증 메커니즘이 될 수 있습니다. Go 언어에서는 JWT를 사용하는 것이 매우 편리하며, 이는 관련 패키지 github.com/dgrijalva/jwt-go를 통해 쉽게 구현할 수 있습니다. 🎜🎜간단히 말하면 JWT는 매우 좋은 인증 방법입니다. JWT를 사용하면 사용자 데이터 및 신원 정보의 보안을 보호하고 웹 애플리케이션의 성능과 안정성을 향상시킬 수 있습니다. 🎜

위 내용은 Go 언어에서 JWT를 사용하여 인증을 구현하는 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.