> 백엔드 개발 > Golang > ginvalidator를 사용하여 Go에서 Gin 입력 검증 단순화

ginvalidator를 사용하여 Go에서 Gin 입력 검증 단순화

Linda Hamilton
풀어 주다: 2024-12-01 11:52:11
원래의
897명이 탐색했습니다.

Simplify Gin Input Validation in Go with ginvalidator

개요

ginvalidator는 다른 오픈 소스 패키지 validatorgo에서 제공하는 광범위한 유효성 검사기 및 살균제 컬렉션을 포함하는 Gin 미들웨어 세트입니다. 또한 JSON 필드 구문에 인기 있는 오픈 소스 패키지 gjson을 사용하여 JSON 개체에서 데이터를 효율적으로 쿼리하고 추출합니다.

Gin 요청을 검증하고 정리할 수 있도록 다양한 방법으로 이를 결합할 수 있으며 요청이 유효한지 여부, 검증자에 따라 어떤 데이터가 일치했는지 확인하는 도구를 제공합니다.

인기 있는 js/express 라이브러리 express-validator를 기반으로 합니다

지원하다

이 버전의 ginvalidator를 사용하려면 애플리케이션이 Go 1.16에서 실행되어야 합니다.
Gin 1.x.x에서도 작동하는 것으로 확인되었습니다.

이론적 해석

왜 사용하지 않으시나요?

  • 수기 유효성 검사기: 자신만의 유효성 검사 논리를 수동으로 작성할 수도 있지만 그렇게 하면 반복적이고 지저분해집니다. 새로운 유효성 검사가 필요할 때마다 동일한 종류의 코드를 계속해서 작성하게 됩니다. 실수하기 쉽고 유지 관리도 어렵습니다.
  • Gin의 내장 모델 바인딩 및 검증: Gin에는 검증 기능이 내장되어 있지만 모든 사람에게 이상적인 것은 아닙니다. 구조체 태그는 제한적이며 코드를 읽기 어렵게 만듭니다. 특히 복잡한 규칙이 필요한 경우 더욱 그렇습니다. 게다가 유효성 검사가 모델에 너무 밀접하게 연결되어 있어 유연성이 좋지 않습니다.
  • 기타 라이브러리(예: Galidator): 다른 라이브러리도 있지만 자신이 하는 일에 비해 너무 복잡하다고 느끼는 경우가 많습니다. 특히 간단하고 직접적인 검증 솔루션을 원하는 경우 예상보다 더 많은 설정과 작업이 필요합니다.

설치

컴퓨터에 Go가 설치되어 있는지 확인하세요.

1단계: 새로운 Go 모듈 생성

  1. 원하는 이름으로 빈 폴더를 만듭니다.
  2. 터미널을 열고 해당 폴더로 이동(cd)한 후 새 Go 모듈을 초기화합니다.
go mod init example.com/learning
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

2단계: 필수 패키지 설치

go get을 사용하여 필요한 패키지를 설치하세요.

  1. Gin 설치:
go get -u github.com/gin-gonic/gin
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  1. ginvalidator 설치:
go get -u github.com/bube054/ginvalidator
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

시작하기

무언가를 배우는 가장 좋은 방법 중 하나는 모범을 보이는 것입니다! 이제 소매를 걷어 올리고 코딩을 시작해 보겠습니다.

설정

가장 먼저 필요한 것은 Gin 서버를 실행하는 것입니다. 누군가에게 인사하는 것을 구현해 봅시다. 이를 위해 main.go를 생성한 후 다음 코드를 추가하세요:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이제 터미널에서 go run main.go를 실행하여 이 파일을 실행하세요.

go mod init example.com/learning
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

HTTP 서버가 실행 중이어야 하며 http://localhost:8080/hello?person=John을 열어 John에게 경의를 표할 수 있습니다!

? 팁:
Go 및 Gin과 함께 Air를 사용하여 실시간 재로드를 구현할 수 있습니다. 파일이 변경될 때마다 자동으로 서버를 다시 시작하므로 직접 수행할 필요가 없습니다!

유효성 검사기 추가

서버는 작동하고 있는데 문제가 있는 것 같네요. 특히 이름이 설정되지 않은 사람에게는 인사하고 싶지 않습니다.
예를 들어 http://localhost:8080/hello로 이동하면 "Hello"가 인쇄됩니다.

여기서 ginvalidator가 유용하게 사용됩니다. 요청을 검증하는 데 사용되는 검증기, 살균제 및 수정자를 제공합니다.
이름이 비어 있는 유효성 검사기와 Not이라는 수정자를 사용하여 개인 쿼리 문자열이 비어 있을 수 없는지 확인하는 유효성 검사기와 수정자를 추가해 보겠습니다.

go get -u github.com/gin-gonic/gin
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

? 참고:

간결성을 위해 코드 예제에서는 gv가 ginvalidator의 별칭으로 사용되었습니다.

이제 서버를 다시 시작하고 다시 http://localhost:8080/hello로 이동하세요. 흠, 여전히 "Hello, !"가 인쇄됩니다... 왜일까요?

유효성 검사 오류 처리

ginvalidator 유효성 검사 체인은 유효성 검사 오류를 사용자에게 자동으로 보고하지 않습니다.
그 이유는 간단합니다. 더 많은 유효성 검사기를 추가하거나 더 많은 필드에 대해 오류를 어떻게 수집하시겠습니까? 모든 오류 목록을 필드당 하나씩, 전체적으로 하나씩만 원하십니까...

따라서 다음 단계는 위의 코드를 다시 변경하는 것입니다. 이번에는 ValidationResult 함수를 사용하여 유효성 검사 결과를 확인합니다.

go get -u github.com/bube054/ginvalidator
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이제 http://localhost:8080/hello에 다시 액세스하면 명확성을 위해 형식이 지정된 다음 JSON 콘텐츠가 표시됩니다.

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이것이 우리에게 말하는 것은

  • 이 요청에는 정확히 한 가지 오류가 있습니다.
  • 이 필드를 person이라고 합니다.
  • 쿼리 문자열(위치: "queries")에 있습니다.
  • 표시된 오류 메시지는 "잘못된 값"이었습니다.

이것은 더 나은 시나리오이지만 여전히 개선될 수 있습니다. 계속해보겠습니다.

더 나은 오류 메시지 만들기

모든 요청 위치 유효성 검사기는 오류 메시지 형식을 지정하는 데 사용되는 함수인 선택적 두 번째 인수를 허용합니다. nil이 제공되면 위의 예와 같이 기본 일반 오류 메시지가 사용됩니다.

go run main.go
로그인 후 복사
로그인 후 복사

이제 http://localhost:8080/hello에 다시 액세스하면 새로운 오류 메시지와 함께 다음 JSON 콘텐츠가 표시됩니다.

package main

import (
    "net/http"

    gv "github.com/bube054/ginvalidator"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", gv.NewQuery("person", nil).
        Chain().
        Not().
        Empty(nil).
        Validate(), func(ctx *gin.Context) {
            person := ctx.Query("person")
            ctx.String(http.StatusOK, "Hello, %s!", person)
        })

    r.Run()
}
로그인 후 복사
로그인 후 복사

검증/삭제된 데이터에 액세스

Ginvalidator가 검증 및/또는 삭제한 모든 데이터를 자동으로 수집하는 GetMatchedData를 사용할 수 있습니다. 그런 다음 MatchedData의 Get 메서드를 사용하여 이 데이터에 액세스할 수 있습니다.

go mod init example.com/learning
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

http://localhost:8080/hello?person=John을 열어 John에게 경의를 표하세요!

사용 가능한 위치는 BodyLocation, CookieLocation QueryLocation, ParamLocation 및 HeaderLocation입니다.
이러한 각 위치에는 검증/삭제된 데이터가 저장되는 위치를 반환하는 문자열 메서드가 포함되어 있습니다.

입력을 정리하는 중

사용자는 더 이상 빈 사람 이름을 보낼 수 없지만 페이지에 HTML을 삽입할 수는 있습니다! 이를 XSS(Cross-Site Scripting) 취약점이라고 합니다.
그것이 어떻게 작동하는지 봅시다. http://localhost:8080/hello?person=John로 이동하면 "안녕하세요, John!"이 표시됩니다.
이 예는 괜찮지만 공격자는 개인 쿼리 문자열을

저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿