Go에서 embed 패키지를 사용하여 소중한 것을 포함하지 마십시오.

4127 단어 5

TL;DR


  • Go 1.16부터 파일 내용을 바이너리에 포함시키는 embed 패키지와 지시문이 추가되었습니다.
  • 단지, 패스워드나 API 토큰등의 발레 하면(자) 끔찍한 데이터는 포함하지 않는 것
  • 실행 파일에 그대로 포함되어 있으므로
  • 아무래도 임베드하고 싶다면 미리 crypto 패키지로 해시화해 둔 내용을 임베드하는 등
  • 그래도 배럴 때는 바레


  • 이것은 Go에 한정된 이야기가 아니다.
  • Windows에서 말하는 리소스 파일 의 구조와 같은 것

  • 민감한 정보는 안전하게 포함되지 않습니다

  • embed 사용법



    아래 코드에서 embed_data.json의 내용을 실행 바이너리에 포함시킬 수 있습니다.

    main.go
    package main
    
    import (
        _ "embed"
        "encoding/json"
        "fmt"
    )
    
    //go:embed embed_data.json
    var embedData []byte
    
    // UserData ユーザーデータ(例:API実行用のユーザー)
    type UserData struct {
        Key1 string `json:"user"`
        Key2 string `json:"password"`
    }
    
    func main() {
        userData := UserData{}
    
        err := json.Unmarshal(embedData, &userData)
        if err != nil {
            panic(err)
        }
    
        // 試しにデータを見る
        fmt.Printf("%v\n", userData)
    }
    

    embed_data.json
    {
        "user": "hogehoge",
        "password": "fugafuga"
    }
    

    실행 결과
    $ ./embed_test.exe 
    {hogehoge fugafuga}
    

    실행 파일을 들여다 보면 ...?


  • 단단히 원시 데이터가 실행 바이너리에 내장되어 있습니다.
  • 즉 바이너리를 들여다 보면 중요한 데이터가 빠져 나올 가능성이 있다



  • embed는 무엇에 사용해야합니까?



    여러 가지가 있다고 생각하지만, 개인적으로는
  • 템플릿 파일
  • 자동으로 Markdown이나 텍스트 데이터를 내고 싶을 때의 바탕을 묻는다

  • 기본 설정 파일
  • 사용자 구성 파일이 없을 때 사용할 구성 파일

  • 의존 데이터를 없애고 싶을 때의 데이터 매입 수단
  • "어쨌든 바이너리만으로 움직이고 싶다!"라고 할 때

  • etc ...

  • 참고문헌


  • Go 1.16에서 출시된 go:embed란?
  • 좋은 웹페이지 즐겨찾기