클라우드플레어와 방문자 IP 주소

Twitter icon류광, 2019-02-04 18:02
GpgStudy에 클라우드플레어를 적용하면서 겪은 문제점과 그 해결책

제가 관리하는 닥북한국GpgStudy는 DDOS 방지 및 HTTPS 적용을 위해 클라우드플레어를 사용하고 있습니다. 닥북 한국에 적용한 것은 몇 달 되었고, GpgStudy는 며칠 전에 적용했습니다.

클라우드플레어를 적용하는 것은 기본적으로 상당히 간단합니다. 저는 신현석 님의 클라우드플레어와 HTTPS 적용을 참고해서 별 수고 없이 HTTPS 적용까지 마쳤습니다.

포럼과 게임 개발 소식에서 로그인이 풀리는 문제

그런데 GpgStudy의 경우에는 좀 더 손 볼 부분이 있었습니다. 우선, GpgStudy 포럼게임 개발 소식의 로그인이 자꾸 풀리는 문제가 있었습니다. 원래 한 번 로그인 하면 적어도 2주는 로그인된 상태로 남아야 하는데, 클라우드플레어를 적용하니 로그인하고 얼마 후에 다시 접속하면 로그아웃된 상태로 변했습니다.

원인과 해결책은 의외로 간단했습니다. 클라우드플레어의 작동 방식을 간단히 이야기하면, 클라이언트(웹 브라우저)가 웹사이트에 어떤 자원(웹페이지 등)을 요청하면 그것을 웹사이트가 있는 웹 서버가 아니라 클라우드플레어의 서버를 먼저 받아서 자신의 캐시에 있는 버전을 보내 주거나 실제 웹서버에게 해당 자원을 요청해서 전달해 줍니다. 어떤 경우이든 웹 서버는 클라우드플레어와 통신하며, 따라서 웹 서버가 인식하는 원격 클라이언트 주소는 항상 클라우드플레어 서버의 주소입니다.

포럼과 게임 개발 소식은 사용자를 식별할 때 여러 요소와 함께 원격 클라이언트 주소를 사용하는데, 구체적으로는 아파치 서버를 통해서 PHP에 전달된 REMOTE_ADDR 서버 환경 변수를 원격 주소로 사용합니다. 이것이 표준적인 방식인데, 클라우드플레어를 사용하는 경우 REMOTE_ADDR은 클라우드플레어의 주소이므로 사용자를 제대로 식별할 수 없었습니다.

다행히 이런 문제를 웹서버 엔진 개발자들도 인식하고 해결책을 마련해 두었습니다. 바로 HTTP_CF_CONNECTING_IP라는 또 다른 환경 변수인데요. 중간에 있는 CF는 아마 CloudFlare겠죠? 어쨌든, 이 환경 변수에는 실제 브라우저의 IP 주소가 들어 있으므로 이것을 사용자 식별의 한 요소로 사용하면 됩니다.

현재 포럼은 phpBB 3.2.x를 사용하는데, 다행히도 이 문제를 위한 CloudFlare IP라는 확장 플러그인이 있어서 간단하게 해결했습니다.

게임 개발 소식의 시스템은 제가 만든 것이라서 안타깝게도 누군가가 확장 플러그인을 만들어 주지는 않았지만, 그냥 한 PHP 파일에서 $_SERVER['REMOTE\_ADDR']$_SERVER['HTTP_CF_CONNECTING_IP']로 바꾸는 것만으로 해결이 되었습니다. 게임 개발 소식 시스템은 GpgStudy에서만 사용하고 앞으로도 클라우드플레어를 계속 사용할 생각이라서 그냥 무조건 $_SERVER['HTTP_CF_CONNECTING_IP']를 사용하는 식으로 바꾸었지만, 불특정 다수에게 제공하는 시스템이나 환경이 바뀔 수도 있는 시스템이라면 다음처럼[1] 동적으로 처리하는 게 바람직하겠죠.

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
  $_SERVER['REMOTE\_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];

}

Disqus 댓글 시스템과 관련된 문제

그밖에, 게임 개발 소식에서 Disqus 댓글 창과 기존 댓글들이 나타나지 않는 문제도 있었습니다. 크롬의 개발자 도구로 살펴본 결과, Disqus 댓글 창을 불러오는 JavaScript 코드 중 다음과 같은 줄이 문제였습니다.

dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';

클라우드플레어 적용으로 GpgStudy 전체가 HTTPS 사이트로 변했기 때문에 HTTPS 페이지에서 HTTPS가 아닌 JavaScript 파일을 요청하는 상황이 벌어졌고, 그것이 보안 원칙 위반이라서 브라우저가 요청을 거부한 게 문제의 원인이었습니다. 그냥 'http://''https://'로 수정하니 댓글 창이 다시 나타났습니다.

그래도 기존 댓글들이 나타나지 않는 문제는 바로 해결되지 않았는데, 댓글이 있는 페이지들을 Disqus가 다시 긁어가게 하면 된다는 이야기를 웹에서 찾아내고는 적용했습니다. 간단히만 이야기하면, Disqus의 해당 Admin 페이지에서 Community -> Migration Tools의 Redirect Crawler (Advanced)를 실행했는데요. 그게 효과가 있었는지 아니면 그냥 시간이 지나서 저절로 해결되었는지는 모르겠지만, 얼마 후에 게임 개발 소식들의 기존 댓글들(그리고 GpgStudy 메인 페이지의 댓글 개수들)이 정상적으로 나타났습니다.

태그: 프로그래밍

comments powered by Disqus