>  기사  >  백엔드 개발  >  Go 언어에서 JWT를 사용하여 간단하고 안전한 사용자 인증 구현

Go 언어에서 JWT를 사용하여 간단하고 안전한 사용자 인증 구현

王林
王林원래의
2023-06-15 18:52:081809검색

네트워크 기술의 급속한 발전으로 인해 점점 더 많은 웹사이트와 애플리케이션에서 사용자 인증 기능을 구현해야 합니다. 그러나 기존의 사용자 이름과 비밀번호 인증 방법은 일반적으로 데이터베이스에 저장되기 때문에 보안 위험이 있습니다. 데이터베이스가 공격을 받으면 사용자 정보가 유출됩니다. 이 문제를 해결하기 위해 JWT(JSON Web Token)가 탄생했습니다. JWT는 검증되고 신뢰할 수 있는 정보를 전송하는 간단하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519)입니다. 이 기사에서는 Go 언어에서 JWT를 사용하여 간단하고 안전한 사용자 인증을 구현하는 방법을 소개합니다.

JWT 작동 방식

Go 언어에서 JWT를 사용하는 방법을 소개하기 전에 먼저 JWT 작동 방식을 이해해 보겠습니다. JWT는 세 부분으로 구성됩니다.

  • Header: 이 부분에는 일반적으로 SHA256 암호화를 사용하는 토큰 유형 및 알고리즘 정보가 포함됩니다.
  • 페이로드: 이 부분은 사용자 이름, 권한 등과 같이 전송될 정보를 저장하며 일부 사용자 정의 필드를 포함할 수도 있습니다.
  • 서명: Header와 Payload로 구성된 문자열을 암호화하여 생성한 서명입니다.

JWT에서 생성된 토큰은 HTTP 헤더 또는 URL 매개변수를 통해 전달될 수 있습니다. 클라이언트가 서버에 요청하면 서버는 요청 헤더 또는 URL 매개변수에서 JWT 토큰을 확인합니다. 토큰이 유효한 경우 클라이언트가 요청한 데이터를 반환합니다. 토큰이 유효하지 않으면 오류 메시지가 반환됩니다.

실제 애플리케이션에서는 JWT 생성 시 서버에서 유효 기간을 설정해야 합니다. 만료 후 클라이언트는 새로운 JWT 토큰을 다시 얻어야 합니다.

Go 언어에서 JWT 사용하기

Go 언어에서는 타사 라이브러리를 사용하여 JWT 기능을 빠르고 쉽게 구현할 수 있습니다. 이 기사에서는 JWT 생성 및 검증을 지원하고 유형 안전성과 고성능이라는 장점이 있는 jwt-go 라이브러리 사용을 권장합니다.

jwt-go 라이브러리 설치

터미널에 다음 명령을 입력하면 go get 명령을 사용하여 jwt-go 라이브러리를 설치할 수 있습니다.

go get github.com/dgrijalva/jwt-go

Generate JWT

Go 언어에서는 다음 코드로 JWT를 생성할 수 있습니다.

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 创建JWT头信息
    token := jwt.New(jwt.SigningMethodHS256)
    // 设置有效期
    token.Claims = jwt.MapClaims{
        "exp": time.Now().Add(time.Hour * 72).Unix(),
        "iat": time.Now().Unix(),
        "sub": "1234567890",
    }
    // 对生成的JWT令牌进行签名
    signedToken, err := token.SignedString([]byte("secret-key"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(signedToken)
}

코드에서 jwt.New() 함수를 사용하여 JWT 헤더 정보를 생성하고 유효 기간 및 전송 정보를 설정합니다. (예제에서는 sub라는 필드가 전송됨) 그런 다음 SignedString() 함수를 사용하여 JWT 토큰에 서명합니다.

JWT 확인

Go 언어에서는 다음 코드를 사용하여 JWT 확인을 구현할 수 있습니다.

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 待验证的JWT令牌
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTAzMDAzMTAsImlhdCI6MTYxMDgwNTExMCwic3ViIjoiMTIzNDU2Nzg5MCJ9.5AtrChvChVuWI3TkazGt1mDhbscT8-Qal5U6Qc4dqhc"
    // 解析JWT头信息
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return []byte("secret-key"), nil
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    // 验证JWT有效期
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        expirationTime := time.Unix(int64(claims["exp"].(float64)), 0)
        if expirationTime.Before(time.Now()) {
            fmt.Println("JWT has expired")
        } else {
            fmt.Println("JWT is valid")
        }
    } else {
        fmt.Println("JWT is not valid")
    }
}

코드에서 jwt.Parse() 함수를 사용하여 확인할 JWT 토큰을 구문 분석한 다음 전달된 서명을 사용합니다. 확인하는 키입니다. 확인하는 동안 먼저 Claims() 함수를 사용하여 JWT의 유효 시간을 얻은 다음 이를 현재 시간과 비교하십시오. 토큰이 만료되면 오류 메시지가 반환됩니다.

요약

JWT는 안전하고 간단한 인증 방법으로 웹 개발에 널리 사용되고 있습니다. 이 기사에서는 Go 언어에서 jwt-go 라이브러리를 사용하여 JWT 기능을 빠르고 간단하게 구현하는 방법을 소개합니다. JWT는 사용자 인증뿐만 아니라 데이터 전송, API 인증 및 기타 시나리오에도 사용할 수 있습니다. 실제 적용에서는 JWT의 유효 기간과 서명 키의 보안 보호에 주의를 기울여야 합니다.

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

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