CDN 사용시 스팸필터 에러
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.1 |
현재 LB + CDN 을 사용하고 있습니다. dns 에서 lb 서버 ip 로 등록했구요. 헤더 체크하고 캐시설정 되어있으면 cdn 에서 몽땅 해결하는 방식이네요.
문제는 cdn 을 사용하면 스팸필터가 말을 제대로 안듣습니다.
비회원들은 무조건 recaptcha 를 사용하게 했는데, 스팸필터에 ip 를 등록하면 몇분후에 (cdn 캐싱 후 추정) 비회원들이 recaptcha를 성공해도 “블록된 ip” 메세지가 뜹니다.
DB - 서버 - xe캐시 - 스팸필터 - cdn
어딘가에 쿵짝이 안맞아서 나는 에러같은데요. 서버에서 무언가가 캐싱되면 스팸필터가 제대로 작동 안하는거 같아요. 어느파일을 캐싱 안해줘야 스팸필터가 제대로 작동할런지 궁금합니다. 참고로 cdn 끄면 또 잘되요.
효율적으론 서버 방화벽에서 ip 블록하는게 가장 좋은거같긴한데, 나중에라도 사이트 관리를 양도하게되면 스팸필터 기능을 전달드리고 싶어서요. 그분들은 방화벽 사용이 벅차실 듯...
댓글 14
LB와 CDN을 거치면서 이용자들의 실제 IP 주소가 제대로 파악되지 않고 있는 것 아닐까요? 예를 들어 클라우드플레어를 사용하면서 별도의 조치를 취하지 않으면 모든 이용자의 IP가 불과 수십 개의 클플 IP로 집중되어서, 한 명이라도 차단하면 해당 클플 IP에 배정된 모든 이용자가 차단되어 버리는 문제가 있습니다.
XE에서 생성하는 모든 웹페이지에는 캐시 방지 헤더가 붙어 있기 때문에 (슈퍼캐시 모듈에서 경고를 무시하고 쓸데없이 강력한 캐시 기능을 켜지 않는 한) 웹페이지 자체가 캐싱되는 일은 없습니다.
답변 감사합니다.
아파치에서 직접 캐싱 옵션을 조정해주고. CDN 모니터링을 보니까 캐싱이 실제로 잘 되고 있더라구요. 로딩속도도 좋고, PoP 들도 많고, 방문자들 99%가 미국에 있어서 일단 CDN 은 킵하려구요. xe 라서 슈퍼캐시 모듈은 없는 듯 해요.
LB 레벨로는 ip deny 지원을 안해서, 서버 방화벽에서 ip deny 해보니 블록이 잘 먹히더라구요. 이걸 보면 LB 에서 서버로 ip 전달을 잘 하고 있는 것 같아요.
남은건 xe 자체 캐싱을 exclude 하는건데 애당초 xe 가 지원하는 캐싱시스템을 exclude 하면서 CDN 을 사용하면 무슨 side effect 가 생길지 겁나네요. php 디버깅 할 실력도 못되고.
그냥 서버 방화벽에서 deny 하는걸로 만족해야하려나요.
첫 댓글에서 "별도의 조치"라고 하셨는데 혹시 어떤 조치를 취해야하는지 알려주실 수 있나요? 희망이 보이네요!
https://gist.github.com/kijin/25be59ac4b0d7c5ef722
아파치에 mod_cloudflare 설치하시는 방법도 있는데, LB 구성에 따라서는 안 먹힐 수도 있습니다.
(LB에서 넘겨줄 때 내부망 IP가 나오는 것을 CDN IP로 이미 한 번 변환해 놓은 상태일 테니...)
위의 소스는 XE에서 직접 처리하기 때문에 웹서버 구성의 영향을 받지 않습니다.
클플 이외의 CDN이라면 헤더나 IP 대역이 다를 테니 위의 소스를 참고하여 적당히 응용하세요.
아파치 2.4 이상 버전이라면 mod_remoteip를 사용하여 직접 설정할 수도 있고요.
제가 쓰는 CDN ip 목록은 public 이 아니네요. 여러군데 찾아서 해봐도 막상 글 써보면 ip 가 다르구요. 일단 CDN 빼고 사용하면서 ip range 하나둘씩 모아봐야겠어요. 과연 리스트 완성이 될런지...
좋은 클라우드 기능들 써보려고 클라우드 준비가 안된 cms 를 코딩머리 없이 억지로 쓰려니 탈이 나는가봅니다. 공부 한참 더 해야겠네요. 정말 좋은 도움 많이 주셔서 감사합니다.
X-Forwarded-For: 1.2.3.4, 5.6.7.8, 9.10.11.12
이런 헤더 보신 적 있나요? 실제 존재하는 규격입니다. 이거 어떻게 처리할 건가요? ㅎㅎ
파면 팔수록 들어가 버리는 코딱지네요.
doc 읽어보니 제가 사용하는 CDN 회사는 LB 가 알아서 처리한다는 문구가 있는데... 제가 제대로 테스트 해보기 전까진 모를 듯...
헤더는 x-forwarded-for 를 넣는게 맞는거 같은데, value 는 무얼 넣어야 xe (혹은 서버)가 이해할 수 있을까요? <unverified IP>, <immediate client IP>, <global forwarding rule external IP>, <proxies> 이렇게 4개가 리턴되는거 같은데 value 에 뭘 넣어야 2번째인 <immediate client IP> 이걸 xe 로 전달할 수 있을지요?
제가 이용하는 회사는 x-forwarded-for 를 보니 쉼표로 나눠서 ip 주소들을 2개 보내네요. Request Header 를 바꿔서 (1.2.3.4) 해보니 그걸 앞에 하나 더 붙혀서 3개를 보내구요. 쉼표들로 나눠오는 ip 주소들을 어떻게 해야할지 검색해보니 explode 사용하면 알아서 array 로 정해주네요. 그걸 count - 2 하니까 2개를 보내던 3개를 보내던 원하는 verified client IP 를 받을 수 있었습니다.
코딩 하나도 모르는 상태에서 하려니 오래 걸렸어요 ㅎㅎㅎ 힌트 주신 두분께 감사드립니다.