Чаще всего, в таких случаях, используют секретный ключ, который передают или в параметрах запроса (так лучше не делать, т.к. секретный ключ будет виден в логах промежуточных прокси и сервера) или в HTTP заголовке (этот вариант безопаснее, чем передача в параметрах запроса).
Реже используют вариант с цифровой подписью запроса. Этот вариант ощутимо безопаснее, чем передавать секретный ключ в открытом виде. При таком варианте вы не только знаете о том, что запрос отправил нужный вам сервер, но и о том, что запрос не был изменён никем (например прокси сервером).
Но оба эти варианта требуют доработки со стороны отправляющего запрос сервера.
Как я понимаю для вас этот вариант не доступен.
В принципе вариант защиты по IP адресу вполне нормальный.
Самый простой способ - настроить firewall, т.е. закрыть доступ всем к вашему сервису и открыть только для IP сервера, который делает запросы.
Если вариант с firewall не подходит - можно обеспечивать защиту на стороне Go.
IP можно получать из запроса HTTP
https://pkg.go.dev/net/http#Request
Вот готовый пример
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Your IP is %s", r.RemoteAddr)
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Иногда (зависит от настроек веб сервера) реальный IP может приходить в HTTP заголовках запроса
ip := r.Header.Get("X-Forwarded-For")
// или
ip := r.Header.Get("X-Real-IP")