>  기사  >  백엔드 개발  >  golang 정적 서비스 숨김

golang 정적 서비스 숨김

WBOY
WBOY원래의
2023-05-10 15:41:37610검색

Go 언어를 사용하여 프로젝트나 서비스를 개발할 때 프로젝트에 스타일 시트, 그림, HTML 파일 등과 같은 정적 파일이나 리소스를 제공해야 하는 경우가 있습니다. 그러나 이러한 리소스를 제공하는 동안 일부 보안 문제가 발생할 수 있으므로 이러한 파일을 공용 네트워크에 노출하고 싶지 않습니다. 따라서 이 기사에서는 Go 언어를 사용하여 정적 파일이나 리소스를 제공하고 숨기는 방법을 살펴보겠습니다.

전통적인 방법

전통적인 방법에서는 프로그램에서 정적 파일이나 리소스의 경로를 읽고 이 경로를 브라우저에 전송하여 정적 파일이나 리소스를 제공할 수 있습니다. 이 프로세스에는 대개 다음 단계가 포함됩니다.

  1. 경로 프로세서를 만듭니다.
  2. 요청 경로를 구문 분석하고 이를 로컬 파일 경로에 매핑합니다.
  3. 파일이 있으면 열어서 브라우저로 보내주세요.
  4. 파일이 존재하지 않으면 404 오류 코드가 반환됩니다.

이 방법의 단점은 파일에 접근할 때 브라우저의 주소 표시줄에 전체 파일 경로가 노출된다는 것입니다. 공격자가 공격을 시작하기 위해 브라우저에서 경로 정보를 얻을 수 있으므로 이 보안 결함으로 인해 취약점이 발생할 수 있습니다.

파일 숨기기

파일 디렉터리를 숨기려면 Go 언어의 내장 net/http 패키지에 있는 FileServer 기능을 사용할 수 있습니다. FileServer 기능은 로컬 파일 시스템 디렉터리에 액세스하여 파일 내용을 반환할 수 있으며 HTTP 요청 등을 자동으로 처리할 수도 있습니다. FileServer 기능을 사용하려면 먼저 새 경로 프로세서를 생성하고 이를 파일 서버에 매핑해야 합니다.

func main() {
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
    http.ListenAndServe(":8080", nil)
}

여기서 /static/은 사용하려는 가상 디렉터리이고 static은 로컬 파일 시스템 테이블의 실제 디렉터리입니다. 내용의. http.StripPrefix() 함수를 사용하면 정적 파일의 경로 접두사를 제거하는 데 도움이 될 수 있습니다. http.FileServer() 함수는 새 파일 서버 인스턴스를 만듭니다.

파일 경로

이 방법을 사용하면 브라우저에 표시되는 경로에는 우리가 설정한 가상 디렉터리만 표시됩니다. 이러한 방식으로 파일 디렉토리를 숨길 수 있습니다. 예를 들어 test.html이라는 파일을 로컬 파일 시스템의 /static 디렉토리에 배치하면 http://localhost:8080/static/test.html을 통해 액세스할 수 있습니다.

Gzip 압축 사용

파일 경로를 숨기는 것 외에도 gzip 압축 기술을 사용하여 성능을 더욱 향상시킬 수도 있습니다. gzip 압축을 사용하면 클라이언트로 전송되는 파일 크기를 줄여 로딩 속도와 클라이언트 응답 시간을 향상시킬 수 있습니다. gzip 압축을 사용하려면 경로 프로세서에 몇 가지 코드를 추가해야 합니다.

func main() {
    staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
    http.Handle("/static/", gzipFileServer(staticHandler))
    http.ListenAndServe(":8080", nil)
}

func gzipFileServer(handler http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            w.Header().Set("Content-Encoding", "gzip")
            gz := gzip.NewWriter(w)
            defer gz.Close()
            gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w}
            handler.ServeHTTP(gzr, r)
            return
        }
        handler.ServeHTTP(w, r)
    }
}

type gzipResponseWriter struct {
    io.Writer
    http.ResponseWriter
}

func (w gzipResponseWriter) Write(b []byte) (int, error) {
    return w.Writer.Write(b)
}

이 경로 프로세서는 요청을 처리하기 위해 새로운 gzipFileServer 함수를 사용한다는 점을 제외하면 이전 경로 프로세서와 여전히 유사합니다. 여기서는 요청 헤더의 Accept-Encoding 필드를 구문 분석하고, 여기에 gzip이 포함되어 있으면 gzip 압축을 사용하여 파일을 처리합니다. 그렇지 않으면 원본 파일을 사용하여 처리합니다.

압축이 완료되면 클라이언트가 응답을 올바르게 압축 해제할 수 있도록 응답 헤더의 Content-Encoding을 gzip으로 설정해야 합니다.

사실 이는 단순한 예시일 뿐입니다. 실제로 우리는 위의 코드를 우리 서비스에 통합하고 더 많은 테스트와 최적화를 수행해야 합니다.

요약

Go 언어에서 제공하는 FileServer 기능을 사용하면 정적 파일이나 리소스를 숨겨서 보안을 유지할 수 있습니다. 또한 gzip 압축 기술을 사용하여 성능을 향상시킬 수도 있습니다. 이러한 기술은 보다 안전하고 효율적인 정적 파일이나 리소스 서비스를 구축하는 데 도움이 될 수 있으며 Go 언어를 사용하여 개발할 때 모두 매우 실용적인 기술입니다.

위 내용은 golang 정적 서비스 숨김의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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