갑자기 파일서버의 네크워크 트래픽이 크게 증가 할 때가 있습니다.
분석을 해보면 운영 중인 서비스 사이트에서의 참조가 아닌 외부에서의 참조(img,video태그의 URL)가 원인으로 판명되는 경우가 다발합니다. 출처를 밝힌 참조라면 홍보에 도움이 되니 감당하지만 그렇지 않은 무단(출처 명기가 없으므로)참조의 경우는 제한을 해야합니다.
(네크워크의 계약된 대역폭을 넘게 되면 추가 요금이 발생합니다.)
특정 도메인에서만 참조하게 하려면 리퍼러(REFERER)를 체크하면 되는데 이미지나 동영상같은 리소스 파일에서는 불가능합니다.
웹어플리케이션에서 리소스파일을 읽고 리퍼러(REFERER)를 체크해서 스트림으로 출력하는 방법도 있지만 병목현상을 일으키기 딱 좋기 때문에 다수의 유저가 이용하는 서비스에는 맞지 않습니다.
IIS의 확장모듈인 "URL Rewrite(URL 재작성)"을 이용했습니다.
Match URL(대상) | |
Requested URL | Matches the Pattern |
Using | Regular Expressions |
Pattern | (.*) |
Ignore case | Check |
대소 구분없이 모든 URL을 대상으로 함 |
리소스파일만 있는 파일서버이므로 모든 URL을 대상으로 했습니다.
필요한 경우 특정확장자에만 적용하도록 패턴(Pattern)을 작성해도 되겠습니다.
Conditions(상태) | |
Condition Input | {HTTP_REFERER} |
Check if input string | Does Not Match the Pattern |
Pattern | ^http(s)?://(www\.)?sample.com |
Ignore case | Check |
HTTP_REFERER가 sample.com이 아니라면 |
sample2.com, sample3.com도 허가하려면 같은 방식으로 추가하고 Logical grouping을 Match All로 설정하면 됩니다.
만약 반대로 sample.com, sample2.com, sample3.com에서의 참조만 제한하려면
Logical grouping을 Match Any로 하고 각각의 Condition의 Check if input string를 Match the Pattern으로 하면 되겠습니다.
Action(처리) | |
Action type | Abort Request |
요청에 대한 처리를 중지 |
물론 위의 설정은 web.config 파일을 직접 편집으로도 가능합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="RefererForAccess" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_REFERER}" pattern="^http(s)?://(www\.)?sample.com" negate="true" />
<add input="{HTTP_REFERER}" pattern="^http(s)?://(www\.)?sample2.com" negate="true" />
<add input="{HTTP_REFERER}" pattern="^http(s)?://(www\.)?sample3.com" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>