2.5 機密情報を扱うフィールドを定義して出力書式をカスタマイズする

氏名、住所、クレジットカード番号といった個人情報や、顧客情報や仕入先のリストなどの機密情報は注意深く扱う必要があります。

このような情報をGoで扱う場合、構造体のフィールドとして扱うと思いますが、そのフィールドを含む項目が fmt.Printf("%v", credentials) のようなコードでログへ出力されてしまい、内容がアクセスする必要のない人にまでもれてしまう恐れがあります。

このような事故を避けるために、ログの内容をマスキングして出力させたいことがあると思いますが、Goの独自型を利用することで機密情報を含む項目を扱いやすくする方法を紹介します。

2.5.1 実装方法

次に示すfmtパッケージのインタフェース2つを満たすことで、誤ってログへ出力されると困る項目の出力書式をカスタマイズできます。

  • Stringer

  • GoStringer

それぞれの定義は以下のようになっています。

type Stringer interface {
        String() string
}

type GoStringer interface {
        GoString() string
}

このインタフェースを用いて拡張することで、たとえばクレジットカードのように注意深く扱う必要のある機密情報のログ出力を、ダミー値に置き換えられます。

package main

import (
	"encoding/json"
	"fmt"
)

type ConfidentialCustomer struct {
	CustomerID int64
	CreditCard CreditCard
}

type CreditCard string ...