관련지식
nginx, referer, whitelist

만약 당신이 AWS와 같은 클라우드 서비스에서 쇼핑몰을 운영하고 있다면 네트워크 트래픽에 매우 민감할지도 모릅니다. 발생하는 트래픽이 곧 지출 금액이 될것이고, 이 금액이 커진다면 아무리 열심히 팔아도 수익이 덜 나겠죠. 그런데 친절한 파워블로거 분들이 쇼핑몰의 상품 이미지 URL을 알아내어 홍보의 목적으로 블로그에 올렸다면… 트래픽이 얼마나 발생할까요? 또는 Crawler 같은것으로 쇼핑몰의 이미지를 무단으로 수집하는 사용자가 있다면?

의도치 않는 비정상적인 URL접근을 막는 방법은 몇 가지가 있습니다. 여기선 referer 정보를 이용하여 허가된 도메인에서만 URL 호출이 가능하도록 해보겠습니다. URL을 호출할때 클라이언트에서 referer 값을 조작해서 호출할수 있지만, 적어도 불특정 홈페이지에서 iframe, img 태그등으로 호출하는것은 전부 차단 가능하니다.

먼저 아래와 같이 map 설정을 해야 합니다.

  1. map $http_referer $allow_referer {
  2. default 0;
  3. "~www.google.com" 1;
  4. "~www.naver.com" 1;
  5. }
  6. map $allow_referer $disallow_referer {
  7. 0 1;
  8. 1 "";
  9. }

map 설정은 http 영역 내에서만 가능하므로 설정 후 재기동시 문제가 있다면 선언된 위치를 잘 확인해보시기 바랍니다.

map
http://nginx.org/en/docs/http/ngx_http_map_module.html

그리고 정책을 차단하려는 리소스에 조건을 추가하면 됩니다. 아래 예제는 /img 로 시작하는 모든 호출에 대해 referer 값이 허용되지 않을 경우 401 에러를 내는 설정입니다. 401 이외에도 원하는 http status 코드를 지정할수 있습니다.

  1. location /img {
  2. if ($disallow_referer) {
  3. return 401;
  4. }
  5. ...
  6. }

저장후 service nginx reload 또는 service nginx restart 명령어를 실행하면 적용됩니다. 위 설정과 동일하게 하신다면 /img 로 시작하는 url은 구글과 네이버를 통해 호출된것만 정상적으로 호출이되고 그외엔 401 에러가 발생합니다. 원하는 도메인만 허용하는 화이트리스트 정책이 적용되었습니다.

위 내용을 적용하면 sites_available/설정 파일은 아래와 같은 형태가 될 것입니다.

  1. map $http_referer $allow_referer {
  2. default 0;
  3. "~www.google.com" 1;
  4. "~www.naver.com" 1;
  5. }
  6. map $allow_referer $disallow_referer {
  7. 0 1;
  8. 1 "";
  9. }
  10. server {
  11. server_name www.anony.com;
  12. listen 80;
  13. root /nodejs/public;
  14. location /img {
  15. if ($disallow_referer) {
  16. return 401;
  17. }
  18. }
  19. location / {
  20. ...
  21. }
  22. }