>  기사  >  백엔드 개발  >  golang에서 클라이언트 IP를 얻는 방법은 무엇입니까?

golang에서 클라이언트 IP를 얻는 방법은 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-06-20 10:13:304951검색

golang에서 클라이언트 IP를 얻는 방법은 무엇입니까?

golang에서 클라이언트 IP를 얻는 방법은 무엇입니까?

Golang의 클라이언트 IP 획득 방법:

ClientIP 방법은 하나는 http 프로토콜 계약에 따라 클라이언트 IP를 얻고 다른 하나는 http 프로토콜 계약에 따라 공용 네트워크 IP를 찾는다는 점을 제외하면 ClientPublicIP 방법의 구현과 유사합니다. 합의된 형식.

복잡한 네트워크 및 서비스 아키텍처와 비즈니스 로직이 있는 환경에서는 HTTP 프로토콜에 따라 실제 IP를 얻는 것이 항상 가능한 것은 아닙니다. 당사 비즈니스에서 사용자 트래픽은 여러 수준에서 세 당사자를 통해 전달됩니다(모두 구현됨). 3자 자체) http 클라이언트), 이때는 필연적으로 일부 실수가 있을 수 있습니다. 이때, 향후 서비스에서 사용자의 실제 IP를 얻는 것이 더 어려워질 것입니다. 얻은 IP가 진짜인지조차 알 수 없습니다.

그러나 고객이 3자를 통해 전달한 트래픽은 테스트를 제외하더라도 대부분의 고객이 공용 네트워크 사용자입니다. ClientPublicIP와 ClientIP 방법을 결합하면 항상 사용자의 실제 IP를 더 잘 얻을 수 있습니다

// var r *http.Request
ip := exnet.ClientPublicIP(r)
if ip == ""{
  ip = exnet.ClientIP(r)
}

위의 방법은 항상 효과적으로 사용할 수 있습니다. 사용자의 실제 IP 주소를 얻습니다. 두 가지 방법의 구체적인 구현은 아래에서 분석됩니다.

// ClientIP 尽最大努力实现获取客户端 IP 的算法。
// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
func ClientIP(r *http.Request) string {
xForwardedFor := r.Header.Get("X-Forwarded-For")
ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
if ip != "" {
return ip
}
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
if ip != "" {
return ip
}
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
return ip
}
return ""
}

ClientIP는 먼저 X-Forwarded-For 헤더에서 구분된 첫 번째 IP 주소를 읽습니다. 이 주소가 존재하지 않으면 X-Real-Ip 헤더에서 가져옵니다. , 설명합니다. 트래픽은 역방향 프록시에 의해 전달되지 않고 클라이언트가 직접 서비스를 요청합니다. 이때 http.Request.RemoteAddr 필드를 통해 IP 주소에서 포트 번호를 뺀 값을 가로채게 됩니다.

이 방법은 매우 간단합니다. X-Forwarded-For 및 X-Real-Ip 헤더가 nginx 또는 haproxy와 같은 역방향 프록시로 채워지는 http 규칙 형식에 따라 가져오는 것입니다.

// ClientPublicIP 尽最大努力实现获取客户端公网 IP 的算法。
// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
func ClientPublicIP(r *http.Request) string {
var ip string
for _, ip = range strings.Split(r.Header.Get("X-Forwarded-For"), ",") {
ip = strings.TrimSpace(ip)
if ip != "" && !HasLocalIPddr(ip) {
return ip
}
}
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
if ip != "" && !HasLocalIPddr(ip) {
return ip
}
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
if !HasLocalIPddr(ip) {
return ip
}
}
return ""
}

ClientPublicIP는 매우 간단합니다. ClientIP 방식은 X-Forwarded-For 목록에서 공용 네트워크 IP를 찾으려고 시도합니다. 공용 네트워크 IP를 확인한 후 http .Request.RemoteAddr을 확인하십시오. 공용 IP 주소입니까? 공용 IP 주소를 찾을 수 없으면 빈 문자열이 반환됩니다.

이 방법을 사용하면 사용자의 공개 IP를 먼저 얻을 수 있는 기회를 얻을 수 있으며, 종종 공개 IP가 우리에게 더 가치가 있습니다.

추천 튜토리얼: "go 언어 튜토리얼"

위 내용은 golang에서 클라이언트 IP를 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.