Golang을 사용하여 사용자 지정 헤더로 정적 파일 제공
기본 Golang 정적 파일 서버
Golang의 일반적인 용도 중 하나는 콘텐츠를 제공하는 서버를 생성하는 것입니다. 이는 API이거나 일부 파일을 제공하는 것입니다. API를 충분히 오래 개발하면 곧 HTML, JS, CSS와 같은 정적 콘텐츠를 제공해야 하는 자신을 발견하게 될 것입니다.
다음을 예로 들어 보겠습니다.
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Basic HTML Document</title>
</head>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x"
crossorigin="anonymous"
/>
<link rel="stylesheet" href="style.css">
<body>
<h1><TITLE></TITLE></h1>
<script src="script.js"></script>
<div class="blue">This is Blue</div>
<button class="btn btn-primary m-5">Bootstrap Button</button>
</body>
</html>
script.js:
document.write('this comes from a script')
스타일.css:
.blue {
background-color: blue;
color: white;
}
첫 번째 단계는 다음 파일을 우리가 편리하게 이름을 지정한 폴더 안에 넣는 것입니다
static
. 다음으로 루트 디렉터리에 main.go
를 만들고 프로젝트의 폴더 구조는 다음과 같습니다..
├── main.go
└── static
├── index.html
├── script.js
└── style.css
Go로 작성된 파일 제공 서버의 간단한 버전은
http.FileServer
방법을 활용합니다.main.go:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./static"))
http.Handle("/", fs)
fmt.Printf("Server started at port 3000")
err := http.ListenAndServe(":3000", nil)
if err == nil {
log.Fatal(err)
}
}
go run main.go
로 위를 실행하고 http://localhost:3000 탐색하면 다음 페이지가 표시됩니다.정적 사이트 예
이제 그것이 당신에게 필요한 전부라면 여기서 멈추고 당신의 즐거운 길을 가는 것이 좋을 것입니다. 그러나 프로덕션 환경에서 문서에 특정 헤더를 추가해야 하는 경우가 종종 있습니다.
nt는 보안 목적으로 응답을 요청합니다.
X-Frame-Options 헤더 램블링
이러한 헤더의 예는
X-Frame-Options
헤더입니다. 클릭재킹 공격의 일부는 공격자가 기본 사이트를 <iframe>
태그에 포함할 수 있으므로 공격자의 사이트가 다른 사이트를 사칭하면서 사용자의 입력을 스누핑할 수 있다는 것입니다.클릭재킹 예
X-Frame-Options
헤더가 하는 일은 legitsite.com
의 도메인만 <iframe>
태그 안에 응답을 넣을 수 있도록 허용한다고 브라우저에 알려주는 것입니다. 따라서 불법leg1tsite.com
은 legitsite.com
내부의 <iframe>
브라우저가 렌더링에 동의하지 않기 때문입니다.클릭재킹 방지
물론 이것은 웹 사이트를 보호하는 데 필요한 유일한 보안 헤더는 아니지만 일반적인 웹 취약성에 대한 자세한 내용은 확인하십시오owasp.org.
http.FileServer를 사용하여 헤더 구현
따라서 헤더를 구현한다는 아이디어는 미들웨어 역할을 하는
fs
변수 위에 래퍼를 만드는 것입니다. 물론 래퍼에 X-Frame-Options
헤더를 적용하는 동안 래퍼에서 모든 종류의 전처리를 수행할 수 있으므로 단순히 헤더를 추가하는 것보다 더 많은 문제를 해결할 수 있습니다. main.go
는 다음과 같이 변경됩니다.main.go:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./static"))
http.Handle("/", addHeaders(fs))
fmt.Printf("Server started at port 3000")
err := http.ListenAndServe(":3000", nil)
if err == nil {
log.Fatal(err)
}
}
func addHeaders(fs http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("X-Frame-Options", "DENY")
fs.ServeHTTP(w, r)
}
}
이렇게 변경하면 완료됩니다! localhost에 대한 모든 문서 요청에는
X-Frame-Options
헤더와 추가하려는 헤더가 있습니다.헤더가 추가된 응답
Reference
이 문제에 관하여(Golang을 사용하여 사용자 지정 헤더로 정적 파일 제공), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mecode4food/serving-static-files-with-custom-headers-using-golang-426h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)