웹개발 및 최신 테크 소식을 전하는 블로그, 웹이즈프리

HOME > webdevetc

이미지 특정 호스트 외에서 접근 불가하도록 nginx 설정 방법

Last Modified : 2023-08-22 / Created : 2023-08-21
1,763
View Count
특정 호스트 이 외에는 이미지를 접근하지 못하도록 nginx에서 에러 처리하는 방법에 대하여 알아봅니다. 어떻게 하면 될까요? 언제 이렇게 설정하는 것이 필요할까요?



! 왜 이미지 접근을 허용하지 못하도록 막을까요?


웹사이트의 이미지 또는 동영상 등의 파일들은 일반적으로 특정 웹페이지 내부에서만 호출되여 사용하기 위한 목적으로 쓰이며 단독으로 사용되지 않습니다. 만약 내가 모르는 다른 웹서버에서 호출되는 경우 이미지의 사용이 원래 목적과 다르게 사용될 수 있으며 원치않는 트래픽 발생 및 서버 부하의 원인이 발생하기도 합니다. 이는 비용 증가로 이어질 수도 있기 때문에 이런 조치가 필요할 수 있죠.

그럼 그 방법에 대하여 자세히 알아봅니다.



# nginx referer 설정하기


nginx에서 기본 설정 파일은 /etc/nginx 내부의 /sites_available 경로에 있습니다. 만약 default 파일이 존재하는 경우 이미지 또는 이미지가 있는 경로에 설정을 해야하겠죠.

@ 특정 경로에 설정하기
server {
  location /images/ {
    ...
  }
}

위 예제는 /images 경로에 이미지가 모여 있는 경우 해당 경로에 접근을 제어하는 방법입니다. 경로가 특정하지 않다면 아래와 같이 정규표현식을 사용하는 것도 가능합니다.

@ 정규식을 사용한 이미지에 설정하기
server {
  location ~* \.(jpg|jpeg|png|gif)$ {
    ...
  }
}


이제 location 내부에 referer가 특정한 호스트가 아닌 경우 에러를 출력하는 코드가 필요합니다.
location ~* \.(jpg|jpeg|png|gif)$ {
  valid_referers none blocked webisfree.com *.webisfree.com;

  if ($invalid_referer) {
    return 403;
  }
}

유요한 호스트 url이 아닌 경우 403에러를 발생 하도록 합니다.

이 외에 allow, deny 디렉티브 키워드를 사용하는 방법도 가능합니다.
location /images/ {
  allow https://webisfree.com;
  deny all;
}


디렉티브 allow는 해당하는 호스트만 허용되며 deny는 이 외에 모두 접근을 막도록 사용할 수 있습니다.


! proxy_pass가 설정된 경우


만약 location 내부에 프록시가 설정된 경우라면 위 방법만 적용하면 프록시 설정이 적용되지 않아 매칭된 location에서 모두 404 에러가 발생하게 됩니다. 이를 위해서 아래와 같이 블록 하단에 proxy_pass를 원래대로 추가합니다. 예를들면 아래와 같습니다.
location /images/ {
  valid_referers none blocked webisfree.com *.webisfree.com;

  if ($invalid_referer) {
    return 403;
  }

  proxy_pass http://localhost:3000;
}

잘 적용되지 않는 경우 위와 같이 proxy 설정에 따른 이유인지 확인해보세요.


여기까지 nginx 서버에서 설정 방법에 대하여 간략하게 알아봤습니다.

Previous

curl 사용시 header 옵션 사용하는 방법 간략히 알아보기

Previous

e2e 테스트 도구인 Puppeteer에서 지연시간 설정하여 사용하는 방법