[go] net/http 패키지를 사용한 서버 보안 설정

이 기술 블로그 게시물에서는 Go 언어의 net/http 패키지를 사용하여 웹 서버의 보안 설정에 대해 알아보겠습니다.

TLS (Transport Layer Security) 설정

TLS는 데이터 통신 보안을 위한 프로토콜로, HTTPS 통신을 가능하게 합니다. net/http 패키지를 사용하여 서버에 TLS를 적용하려면 다음과 같이 작성할 수 있습니다.

package main

import (
	"net/http"
	"log"
	"fmt"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, TLS!")
	})

	err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
	if err != nil {
		log.Fatal("ListenAndServeTLS: ", err)
	}
}

위 코드에서 server.crtserver.key는 각각 서버 인증서와 비밀키 파일의 경로를 나타냅니다.

보안 헤더 설정

웹 서버의 보안을 높이기 위해 HTTP 응답 헤더에 다양한 보안 헤더를 설정할 수 있습니다. 이를 통해 XSS, Clickjacking, MIME 스니핑 등과 같은 공격을 방지할 수 있습니다.

func main() {
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("X-Content-Type-Options", "nosniff")
		w.Header().Set("X-Frame-Options", "SAMEORIGIN")
		w.Header().Set("X-XSS-Protection", "1; mode=block")
		// ... 다른 보안 헤더 설정
	})
	http.ListenAndServe(":80", handler)
}

IP 및 포트 제한

특정 IP 주소나 포트를 통한 접근을 제한하여 보안을 강화할 수 있습니다.

func main() {
	server := &http.Server{
        Addr: ":8080",
        Handler: handler,
    }

	// 특정 IP 주소에만 바인딩
    listener, err := net.Listen("tcp", "192.168.1.100:8080")
    if err != nil {
        log.Fatal(err)
    }
    server.Serve(listener)
}

이렇게 net/http 패키지를 사용하여 웹 서버의 보안을 설정할 수 있습니다. 위 예제 코드를 참고하여 웹 서버를 더욱 안전하게 운영할 수 있습니다.

참고 자료