NGINX Referer 모듈을 활용한 특정 도메인 접근 제어 설정

이 포스트는 NGINX Referer 모듈(ngx_http_referer_module)을 활용하여, 특정 도메인을 통한 요청의 접근 제어를 설정하는 방법에 관해 설명합니다. NGINX 서버로 전달된 요청의 Referer 헤더의 값에 따라 요청을 허용하거나, 제한하도록 설정합니다.

Referer 헤더의 값을 위조하는 것은 비교적 간단하기 때문에 이 모듈은 부적절한 요청을 완전히 차단하는 목적보다는, 일반적인 브라우저에서 전송되는 대량의 요청을 제한하는 목적으로 사용하는 것이 적절합니다.

이 모듈은 NGINX OSS, NGINX Plus 모두 사용 가능하며 설치 시 별도의 매개변수 설정 없이도 사용할 수 있습니다.

목차

1. Referer 헤더란?
2. NGINX Referer 모듈 사용 방법

3. NGINX Referer 모듈 적용 확인
4. 결론

1. Referer 헤더란?

Referer 헤더는 HTTP 요청 헤더 중 하나로, HTTP 요청 시 사용자가 이전에 방문한 페이지의 주소(URL)를 나타내는 헤더입니다. 사용자가 외부에서 링크를 타고 온 경우 외부 페이지의 주소, 혹은 외부에서 리소스 요청을 보낸 경우 해당 주소가 Referer 헤더에 포함됩니다.

2. NGINX Referer 모듈 사용 방법

valid_referers none | blocked | server_names | string …;
기본 : –
컨텍스트 : server, location

위 지시문을 사용해, 요청을 허용할 Referer 헤더의 값을 지정할 수 있습니다.
Referer 헤더의 값이 위 지시문을 통해 지정된 조건에 해당하는 경우 $invalid_referer 변수는 빈 문자열로 설정되고, 부합하지 않는 경우 1로 설정됩니다. 지시문과 변수를 활용하여 요청을 차단하도록 구성할 수 있습니다.

사용할 수 있는 매개변수(허용 조건)는 다음과 같습니다.

  • none : 요청 헤더에 Referer 필드가 빈 경우
  • blocked : 요청 헤더에 Referer 필드가 있지만 방화벽이나 프록시 서버에 의해 값이 지워진 경우. 이런 값들은 http://혹은 https://로 시작하지 않습니다.
  • server_names : 요청 헤더의 Referer 필드에 다음 값 중 하나가 있을 경우
    • 임의의 문자열 : 서버 이름과 선택적 URI 접두사를 정의합니다. 서버 이름은 시작과 끝에 “*”를 포함할 수 있습니다. 확인 과정에서 Referer 필드의 서버 포트는 무시됩니다.
    • 정규 표현식 : 첫 문자는 “~”로 시작해야 합니다. 표현식은 http:// 혹은 https:// 이후의 텍스트와 매칭됩니다.
구성 예시
valid_referers none blocked server_names
               *.example.com example.* www.example.org/galleries/
               ~\.google\.;

if ($invalid_referer) {
    return 403;
}

valid_referers 지시문을 통해 명시된 조건에 부합하는 경우 $invalid_referer은 빈 문자열이 되어 403 응답을 반환하지 않고, 부합하지 않는 경우 1이 되어 403 응답을 반환하여 요청을 차단합니다.

3. NGINX Referer 모듈 적용 확인

적용 확인을 위해 다음과 같은 예시 설정을 사용했습니다.

server {

    listen 8200;

    access_log /var/log/nginx/referer_access.log main;
    error_log /var/log/nginx/referer_error.log;

    valid_referers none server_names
            *.example.com;

    if ($invalid_referer) {
        return 403;
    }

    location / {
        root /usr/share/nginx/html;
    }

}

valid_referers 지시문 설정을 통해 Referer 헤더의 값이 비어있거나, *.example.com 조건에 맞는 값이 포함된 경우 접근을 허용하고, 외에는 403 응답을 반환하도록 구성했습니다.
엑세스 로그에 적용된 main 로그 포맷은 다음과 같이 구성하여 Referer 헤더의 값을 확인할 수 있도록 구성했습니다.

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

1. 해당 서버로 직접 접근을 시도합니다.

NGINX referer log : -

직접 접속하는 경우, 특정 도메인을 통한 요청이 아니기 때문에 Referer 헤더의 값이 없어 none 설정에 부합하여 접근이 제한되지 않습니다.

2. 다른 서버를 통해서 접근을 시도합니다.

NGINX referer 서버 연결 html

구성된 링크를 통해 접속 시 Referer 모듈을 사용한 서버로 연결됩니다.

NGINX referer 403 Forbidden
NGINX referer log : http://192.168.200.164

http://192.168.200.164 서버를 통해 접근하려 했으나, valid_referers 지시문에 정의된 조건에 부합하지 않아 설정한 403 응답을 반환합니다.

3. nginx.example.com 도메인을 통해 접근을 시도합니다.

이전과 동일한 구성이지만, nginx.example.com 도메인을 통한 연결입니다.

NGINX referer log : http://nginx.example.com

Referer 헤더의 값이 정의된 조건인 *.example.com과 매칭되어, 접근이 가능합니다.

4. 결론

이번 포스트에서는 NGINX Referer 모듈을 활용하여, Referer 헤더의 값에 따라 특정 도메인을 통한 요청을 제한하도록 구성하는 방법에 대해서 알아봤습니다.
Referer 모듈의 핵심이 되는 valid_referers 지시문에 사용할 수 있는 옵션을 알아봄으로써 요청을 허용할 도메인을 정의하는 방법을 알아보고, $invalid_referer 변수와 연계하여 403 응답을 반환하는 원리도 알아봤습니다.

이 모듈을 통해 다른 웹 사이트에서 무단으로 서버의 리소스를 요청하여 가져가는 것을 방지하거나, 특정 사이트의 비정상적인 대량 요청의 차단에 활용할 수 있습니다.

다양한 모듈을 지원하는 NGINX OSS의 엔터프라이즈 버전인 NGINX Plus를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required