반응형

 

valid_referers란 무엇인가

valid_referers는 Nginx에서 HTTP Referer 헤더를 검증하여 특정 출처로부터의 요청만 허용하는 지시어이다. 이는 주로 핫링킹(hotlinking) 방지, 즉 외부 사이트에서 자신의 서버 리소스를 무단으로 링크하여 사용하는 것을 막기 위해 사용된다.

Referer 헤더의 이해

HTTP Referer 헤더는 클라이언트가 현재 요청을 보내기 전에 어느 페이지에 있었는지를 나타낸다. 예를 들어, 사용자가 https://example.com/page.html에서 https://mysite.com/image.jpg를 클릭했다면, 이미지 요청의 Referer 헤더는 https://example.com/page.html이 된다.

valid_referers의 동작 원리

valid_referers 지시어는 ngx_http_referer_module 모듈에서 제공한다. 이 지시어는 Referer 헤더를 검사하여 지정된 값과 일치하는지 확인하고, 그 결과를 $invalid_referer 변수에 저장한다.

  • Referer가 유효한 경우: $invalid_referer 변수는 빈 문자열이 된다
  • Referer가 유효하지 않은 경우: $invalid_referer 변수는 "1"이 된다

 

기본 문법

valid_referers none | blocked | server_names | string ...;

이 지시어는 server, location 컨텍스트에서 사용 가능하다.

파라미터 설명

none

Referer 헤더가 아예 없는 경우를 허용한다. 브라우저 주소창에 직접 URL을 입력하거나, 북마크를 통해 접근하는 경우가 여기에 해당한다.

blocked

Referer 헤더가 존재하지만 방화벽이나 프록시에 의해 "http://" 또는 "https://"가 제거된 경우를 허용한다.

 

  • 정상 사용자 보호: 기업 네트워크나 보안이 강화된 환경의 사용자들이 정상적으로 접근할 수 있다.
  • 호환성: 다양한 네트워크 환경에서 서비스가 원활하게 작동하도록 한다.
  • 사용자 경험: 불필요한 접근 거부를 줄인다.

 

server_names

현재 서버의 server_name 지시어에 정의된 모든 도메인을 자동으로 허용한다.

문자열 패턴

특정 도메인이나 패턴을 직접 지정한다. 와일드카드(*)를 사용할 수 있으며, 정규표현식도 지원한다.

 

설정 예시

기본적인 핫링킹 방지

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    valid_referers none blocked server_names;
    
    if ($invalid_referer) {
        return 403;
    }
}

위 설정은 이미지, CSS, JavaScript 파일에 대해 다음을 허용한다:

  • Referer 헤더가 없는 직접 접근
  • 방화벽에 의해 차단된 Referer
  • 자신의 서버 도메인

그 외의 경우는 403 Forbidden을 반환한다.

특정 도메인 허용

location ~* \.(jpg|jpeg|png|gif)$ {
    valid_referers none blocked server_names
                   example.com
                   *.example.com
                   google.com
                   *.google.com;
    
    if ($invalid_referer) {
        return 403;
    }
}

위 설정은 example.com, google.com 및 그들의 서브도메인에서의 접근을 허용한다.

정규표현식 사용

location ~* \.(jpg|jpeg|png|gif)$ {
    valid_referers none blocked server_names
                   ~\.google\.
                   ~\.facebook\.;
    
    if ($invalid_referer) {
        return 403;
    }
}

정규표현식을 사용할 때는 ~로 시작한다. 위 예시는 .google.과 .facebook.을 포함하는 모든 도메인을 허용한다.

대체 이미지 제공

단순히 403을 반환하는 대신, 무단 링크 시 대체 이미지를 제공할 수 있다.

location ~* \.(jpg|jpeg|png|gif)$ {
    valid_referers none blocked server_names;
    
    if ($invalid_referer) {
        rewrite ^/(.*)$ /images/hotlink-forbidden.png break;
    }
}

 

주의사항

if 지시어의 위험성

Nginx에서 if 지시어는 예상치 못한 동작을 일으킬 수 있다. if 블록 내부에서는 제한적인 지시어만 사용해야 하며, 복잡한 로직은 map 지시어나 다른 방법을 사용하는 것이 권장된다.

Referer 헤더의 신뢰성

Referer 헤더는 클라이언트가 제공하는 정보이므로 쉽게 위조할 수 있다. 따라서 valid_referers는 보안 메커니즘이라기보다는 일반적인 핫링킹 방지 수단으로 이해해야 한다.

브라우저 정책

일부 브라우저나 확장 프로그램은 개인정보 보호를 위해 Referer 헤더를 전송하지 않거나 수정할 수 있다. 이는 정상적인 사용자의 접근도 차단될 수 있음을 의미한다.

map을 이용한 더 나은 접근

if 지시어의 한계를 극복하기 위해 map 지시어를 사용할 수 있다.

map $invalid_referer $block_hotlink {
    0  "";
    1  "blocked";
}

server {
    location ~* \.(jpg|jpeg|png|gif)$ {
        valid_referers none blocked server_names;
        
        error_page 403 /403.html;
        
        if ($block_hotlink) {
            return 403;
        }
    }
}

 

성능 고려사항

valid_referers 검사는 매 요청마다 수행되므로, 트래픽이 많은 서버에서는 성능에 영향을 줄 수 있다. 필요한 리소스에만 선택적으로 적용하는 것이 좋다.

# 대용량 파일에만 적용
location ~* \.(mp4|zip|pdf)$ {
    valid_referers none blocked server_names;
    
    if ($invalid_referer) {
        return 403;
    }
}

# 작은 리소스는 제한 없음
location ~* \.(css|js|ico)$ {
    # valid_referers 설정 없음
}

 

로깅 활용

핫링킹 시도를 모니터링하기 위해 로그를 활용할 수 있다.

location ~* \.(jpg|jpeg|png|gif)$ {
    valid_referers none blocked server_names;
    
    if ($invalid_referer) {
        access_log /var/log/nginx/hotlink.log;
        return 403;
    }
}

 

결론

valid_referers는 Nginx에서 Referer 헤더를 검증하여 리소스 무단 사용을 방지하는 유용한 도구이다. 완벽한 보안 솔루션은 아니지만, 대부분의 일반적인 핫링킹 시도를 효과적으로 차단할 수 있다. 서버의 특성과 요구사항에 맞게 적절히 설정하여 사용하면 된다.

반응형

'nginx' 카테고리의 다른 글

[Nginx] 트래픽 제어: limit_conn_zone, limit_req_zone, limit_rate  (0) 2025.10.08

+ Recent posts