자바 면접 에서 클 라 이언 트 의 실제 IP 를 어떻게 얻 습 니까?

머리말
작은 게임 개발 을 할 때 우리 가 자주 주목 하 는 기능 중 하 나 는 바로 공유 이다.공유 에 대해 저 희 는 각 도시 나 지역 에 따라 서로 다른 공유 문안 을 가지 고 지역 을 식별 하 는 기능 이 서버 에서 이 루어 지면 클 라 이언 트 의 실제 IP 를 알 아야 합 니 다.오늘 은 서버 가 클 라 이언 트 의 실제 IP 를 어떻게 얻 었 는 지 살 펴 보 겠 습 니 다.

nginx 설정
우선,하나의 요청 은 요청 헤더 와 요청 체 로 나 눌 수 있 고 우리 클 라 이언 트 의 IP 주소 정 보 는 일반적으로 요청 헤더 에 저 장 됩 니 다.서버 가 Nginx 로 부하 균형 을 맞 추 려 면 location 에 X-Real-IP 와 X-Forward-For 요청 헤드 를 설정 해 야 합 니 다.

  location ^~ /your-service/ {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:60000/your-service/;
  }
X-Real-IP
에서 이런 말 이 있다.
역방향 프 록 시 를 거 친 후 클 라 이언 트 와 웹 서버 사이 에 중간 층 이 증가 하기 때문에 웹 서버 는 클 라 이언 트 의 ip 를 직접 받 을 수 없습니다.$remoteaddr 변 수 는 프 록 시 서버 의 ip 주 소 를 되 돌 릴 것 입 니 다.
이 말 은 nginx 역방향 서버 를 사용 한 후 웹 에서 request.getRemoteAddr()를 사용 한 다 는 뜻 이다.addr),nginx 의 주소,즉$remote 를 얻 었 습 니 다.addr 변수 에 포 장 된 것 은 nginx 의 주소 입 니 다.물론 사용자 의 실제 ip 을 얻 을 수 없습니다.그러나 nginx 는 사용자 의 실제 ip 을 얻 을 수 있 습 니 다.즉,nginx 는$reote 를 사용 합 니 다.addr 변 수 는 사용자 의 실제 ip 을 얻 을 수 있 습 니 다.웹 에서 사용자 의 실제 ip 을 얻 으 려 면 nginx 에서 할당 작업 을 해 야 합 니 다.즉,제 가 위 에 있 는 설정 입 니 다.

proxy_set_header X-Real-IP $remote_addr;
X-Forwarded-For
X-Forward-For 변 수 는 squid 로 개발 되 었 습 니 다.HTTP 프 록 시 나 부하 분산 기 원시 IP 를 통 해 웹 서버 에 연 결 된 클 라 이언 트 주소 의 비 rfc 기준 을 식별 하 는 데 사 용 됩 니 다.X-Forward-for 설정 이 있 으 면 proxy 퍼 가기 를 거 칠 때마다 기록 되 어 있 습 니 다.형식 은 client 1,proxy 1,proxy 2 는 쉼표 로 각 주 소 를 구분 합 니 다.rfc 기준 이 아니 기 때 문 입 니 다.그래서 기본적으로 없습니다.강제로 추가 해 야 합 니 다.기본 적 인 상황 에서 proxy 퍼 가기 요청 을 통 해 백 엔 드 에서 원 격 주 소 는 proxy 엔 드 의 ip 입 니 다.즉,기본 적 인 상황 에서 request.getAttribute("X-Forward-for")를 사용 하여 사용자 의 ip 를 얻 을 수 없습니다.이 변 수 를 통 해 사용자 의 ip 를 얻 으 려 면 nginx 에 설정 을 추가 해 야 합 니 다.

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
$proxyadd_x_forwarded_for 는 X-Forward-FOR 에 가서 덮어 쓰 는 것 이 아니 라 증가 하 는 것 을 주의 하 십시오.물론 기본 적 인 X-Forward-FOR 값 이 비어 있 기 때문에 X-Forward-FOR 값 은$proxy 와 같다 고 생각 합 니 다.add_x_forwarded_for 의 값 은 실제 적 으로 nginx 두 대 를 서로 다른 ip 에 구축 하고 이 설정 을 사용 하면 웹 서버 에서 request.getAttribute("X-Forward-for")를 통 해 클 라 이언 트 ip 과 첫 번 째 nginx 의 ip 을 얻 을 수 있 습 니 다.
그럼$proxyadd_x_forwarded_for 또 뭐야?
$proxy_add_x_forwarded_for 변 수 는 클 라 이언 트 요청 헤더 의 X-Forward-for 와$remote 를 포함 합 니 다.addr 두 부분,그들 사 이 는 쉼표 로 나 뉜 다.
예 를 들 어 하나의 웹 응용 프로그램 이 있 는데 그 전에 두 개의 nginx 를 통 해 전송 되 었 습 니 다.www.linuxidc.com 은 사용자 가 이 웹 을 방문 하여 두 대의 nginx 를 통 해 전달 되 었 습 니 다.
첫 번 째 nginx 에서 사용:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
현재$proxyadd_x_forwarded_for 변수의 X-Forward-For 부분 이 비어 있 기 때문에$remote 만 있 습 니 다.addr,그리고$remoteaddr 의 값 은 사용자 의 ip 입 니 다.따라서 값 을 부여 한 후에 X-Forward-for 변수의 값 은 사용자 의 실제 ip 주소 입 니 다.
두 번 째 nginx 에 도착 하면 사용:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
현재$proxyadd_x_forwarded_for 변수,X-Forward-For 부분 은 사용자 의 실제 ip,$remote 를 포함 합 니 다.addr 부분의 값 은 이전 nginx 의 ip 주소 입 니 다.그래서 이 할당 을 통 해 현재 의 X-Forward-For 의 값 은'사용자 의 실제 ip,첫 번 째 nginx 의 ip'이 되 었 습 니 다.그러면 알 수 있 습 니 다.
서버 에서 실제 IP 가 져 오기
코드:

 public static String getIpAddress(HttpServletRequest request) {
 String Xip = request.getHeader("X-Real-IP");
 String XFor = request.getHeader("X-Forwarded-For");

 if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
  //           ip ,   ip    ip
  int index = XFor.indexOf(",");
  if (index != -1) {
  return XFor.substring(0, index);
  } else {
  return XFor;
  }
 }
 XFor = Xip;
 if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
  return XFor;
 }
 if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
  XFor = request.getHeader("Proxy-Client-IP");
 }
 if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
  XFor = request.getHeader("WL-Proxy-Client-IP");
 }
 if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
  XFor = request.getHeader("HTTP_CLIENT_IP");
 }
 if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
  XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
 }
 if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
  XFor = request.getRemoteAddr();
 }
 return XFor;
 }
각 요청 헤드 의 의 미 를 살 펴 보 겠 습 니 다.
X-Real-IP
nginx 대 리 는 일반적으로 이 요청 헤드 를 추가 합 니 다.
X-FORWARDED-FOR
이것 은 Squid 가 개발 한 필드 로 HTTP 프 록 시 나 부하 균형 서버 를 통과 할 때 만 이 항목 을 추가 합 니 다.
프 록 시-클 린 트-IP 와 WL-프 록 시-클 린 트-IP
이것 은 일반적으로 apache http 서버 의 요청 을 거 쳐 야 있 습 니 다.apache http 로 프 록 시 를 할 때 보통 Proxy-client-IP 요청 헤드 를 추가 합 니 다.WL-Proxy-client-IP 는 weblogic 플러그 인 에 추 가 된 헤드 입 니 다.
HTTP_CLIENT_IP
일부 프 록 시 서버 에 이 요청 헤드 를 추가 합 니 다.인터넷 에서 검색 해 보 니 다음 과 같은 말 이 있 습 니 다.
이것 은 일반적인 http header 입 니 다.위조 하기 쉬 우 니 사용자 의 입력 을 쉽게 믿 지 마 세 요.
curl -H 'client-ip: 8.8.8.8' lidian.club/phpinfo.php | grep _SERVER
보 실 수 있 습 니 다SERVER["HTTP_CLIENT_IP"]네.
client-ip 와 client-host 는 NAPT 가 보급 되 지 않 은 시대 에 기업 내 네트워크 가 가설 한 http 투명 에이전트 로 서버 에 전 달 된 header 는 극소수 업 체 만 사용 한 적 이 있 고 표준 이 아니 며 사실 기준 이 된 적 이 없다.
(여러분 이 가장 잘 아 는 사실 기준 은 x-forward-for)
나중에 나타 난 웹 프 록 시도 이 헤 더 를 사용 해 본 적 이 없다.
TCP/IP Illustrated Vol 3 은 이 header 를 말 한 적 이 없 으 며,인터넷 의 소문 은 믿 을 수 없다.
시험 가능 한 최초의 흔적 은 2005 년 에 일본 의 Perl/CGI 비적(9784798010779,270 페이지)이 client-ip 와 via 두 header 를 통 해 대리 사용자 의 방문 을 차단 했다.
HTTP_X_FORWARDED_FOR
XFF 헤드 라 고 부 릅 니 다.클 라 이언 트,즉 HTTP 요청 단의 실제 IP 입 니 다.HTTP 프 록 시(예 를 들 어 APACHE 프 록 시)나 부하 균형 서버 를 통과 할 때 만 이 항목 을 추가 합 니 다.RFC 에서 정의 하 는 표준 요청 헤더 정보 가 아 닙 니 다.squid 캐 시 프 록 시 개발 문서 에서 자세 한 설명 을 찾 을 수 있 습 니 다.이 메시지 가 있 으 면 프 록 시 서버 를 사 용 했 음 을 설명 합 니 다.주 소 는 뒤의 수치 입 니 다.위조 가 가능 합 니 다.표준 형식 은 다음 과 같 습 니 다.X-Forward-For:client 1,proxy 1,proxy 2
총결산
이상 은 제 가 클 라 이언 트 의 실제 IP 를 처리 하 는 방법 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 이 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기