모듈에서 사용자 ip 가져오는법이 어떻게 되나요?
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.3 |
다른 모듈을 보니 사용자의 ip를 $_SERVER['REMOTE_ADDR'] 로 가져오던데 사용해보니 서버의 주소가 출력되네요.
https://gist.github.com/kijin/25be59ac4b0d7c5ef722 여길보니
라이믹스는 클플을 사용해도 정상적으로 작동되는 것 같은데, 현재 바뀐내용이 있나요?
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.3 |
다른 모듈을 보니 사용자의 ip를 $_SERVER['REMOTE_ADDR'] 로 가져오던데 사용해보니 서버의 주소가 출력되네요.
https://gist.github.com/kijin/25be59ac4b0d7c5ef722 여길보니
라이믹스는 클플을 사용해도 정상적으로 작동되는 것 같은데, 현재 바뀐내용이 있나요?
댓글 5
는 라이믹스든 XE 든 무관하게 작동합니다.
config/config.user.inc.php 파일에 넣어 사용할 것 ( * 파일이 존재하지 않을 경우 생성 )
이라고 되어있네요 ( 실제 잘 작동합니다 )
바뀐 것은 없습니다. 라이믹스에서는 링크하신 스크립트가 필요하지 않습니다. 라이믹스에서 저걸 중복으로 사용하실 경우 어떤 결과가 나올지는 확인해본 바 없습니다.
단, 로드밸런서 사용 여부나 서버 구성에 따라 $_SERVER['REMOTE_ADDR']가 정확하지 않을 수 있습니다. 구체적으로 어떤 구성으로 되어 있고 어떤 증상이 나타나는지 말씀해 주시면 원인을 찾아볼 수 있겠습니다.
여기서 $_SERVER['REMOTE_ADDR']가 서버의 프라이빗 ip를 출력하네요.. haproxy설정을 변경해야되는 부분이 있을까요?
앞단에 haproxy가 있다면 복잡해지지요. 클플을 포함하여 2개의 프록시를 뚫고 방문자의 실제 IP를 알아내야 하는 상황이니...
라이믹스나 위의 스크립트나 작동방식은 똑같습니다. $_SERVER['REMOTE_ADDR']에 들어 있는 IP가 클플 IP 대역인 경우 CF-Connecting-IP 헤더를 참조하여 실제 IP를 알아냅니다. 그런데 $_SERVER['REMOTE_ADDR']에 내부망 IP가 들어 있으면 클플 IP 대역이 아니니까 작동하지 않지요. 이렇게 구현해놓은 이유는 맨 아래 문단에서 다시 설명드리겠습니다.
클플 IP 대역 목록: https://www.cloudflare.com/ips/
아무튼 이런 상황이라면 haproxy에서 특정 헤더를 사용하여 클플 IP 또는 실제 IP를 넘겨주고, 뒷단의 서버에서 mod_remoteip 등을 사용하여 그 정보를 $_SERVER['REMOTE_ADDR']에 담아주도록 해야 합니다. haproxy와 뒷단 서버 모두의 협력이 필요하지요. 헤더는 CF-Connecting-IP 그대로 넘겨주어도 되고, X-Forwarded-For나 X-Real-IP 등을 사용하기도 하지만 이름은 중요하지 않고 양쪽이 같은 헤더를 참조하기만 하면 됩니다.
common/framework/filters/ipfilter.php에서 getCloudFlareRealIP() 함수를 수정하여 클플 IP 대역인지 아닌지 상관없이 무조건 IP를 대체하도록 하는 방법도 있습니다만, 이 경우 엉뚱한 사람이 CF-Connecting-IP 헤더를 임의로 추가하여 자기 IP를 숨기려고 하는 경우를 잡아낼 수 없기 때문에 권장하는 방법은 아닙니다.