Apache | 액세스(Access) 권한 | 링크 제한 (SetEnvIf, Referer)
링크 제한 (SetEnvIf, Referer)
클라이언트의 요청 헤더에는 “Referer"라는 정보가 포함되어 있는 경우가 있다. 이것은 어디서 링크가 되었는지에 대한 URL에 대한 정보가 포함되어 있다.
직접 URL를 입력하여 액세스하여 Referer 정보가 포함되지 않은 경우에는 액세스 제한을 걸 수 있다.
먼저 “SetEnvIf"를 사용하여 환경 변수를 설정한다. 이번에는 “Referer"를 체크하고 조건을 충족하는 경우에 설정하는 환경 변수를 정의한다.
SetEnvIf Referer 링크가-발생한-정보 설정하는-환경-변수
헤더에 포함된 “Referer"를 확인하여 올바르게 링크가 되었는지 비교한다. 올바른 경우에는 환경 변수를 설정한다. 구체적인 예를 들면 아래와 같다.
SetEnvIf Referer "http://localhost" local_referal
이 경우에는 해당 파일에 대한 액세스 Referer를 체크하고 “http://localhost"에서 링크로 액세스가 있었는지 여부를 확인한다. 만약 맞다면 환경 변수에 “check"라는 이름의 환경 변수를 설정한다. (check는 예이다. 임의로 환경 변수를 설정할 수 있다.)
그리고 “Require"으로 환경 변수가 설정되어 있는지를 확인하도록 한다.
Require env check
위에서는 IP 주소 등의 정보 대신에 환경 변수 “check"가 설정되어 있으면 허용한다는 설정이 된다.
실습
그럼 실습으로 사용해 보도록 하자. 먼저 “img"디렉터리에 포함된 파일에 대해 “http://localhost"로 시작하는 파일에서 링크를 통해 요청이 있을 경우에만 액세스를 허용하도록 설정하려고 한다.
우선 다음과 같이 HTML 파일을 도큐먼트 루트에 생성한다.
referer.html
<html>
<body>
<h1>Referer Test</h1>
<img src="./img/devkuma.png">
</body>
</html>
그리고 도큐먼트 루트에 “img” 디렉터리를 생성하고 그 안에 “devkuma.png"라는 파일명으로 아무 이미지 파일을 넣는다.
아무 설정을하지 않은 경우에는 “http://localhost/referer.html"를 입력한 경우와 “http://localhost/img/referer.png"라고 이미지 파일을 직접 URL을 입력한 경우에도 아무 문제없이 표시가 된다.
그럼 직접 링크하는 경우를 제한하기 위해 “httpd.conf"파일의 마지막 부근에 아래와 같이 내용을 추가한다.
SetEnvIf Referer "^http://localhost" local_referal
<Directory "${SRVROOT}/htdocs/img">
Require all denied
Require env local_referal
</Directory>
도큐먼트 루트 아래에 있는 “img” 디렉터리에 대한 액세스 제한을 하고 있다. Referer를 확인하고 Referer의 앞부분이 “http://localhost"인 경우에만 액세스를 허용한다.
“http://localhost/referer.html"를 입력하면 HTML 파일 중에 “img” 디렉터리에 있는 이미지 파일이 요청된다. 이 경우 이미지 파일의 Referer는 “http://localhost/referer.html"가 되므로 액세스가 허용된다.
그러고 “http://localhost/img/devkuma.jpg"를 직접 URL을 입력하면 Referer가 설정되지 않기 때문에 액세스가 허용되지 않아 표시되지 않는다.
이것으로 Referer를 사용하여 액세스 제한을 어느 정도의 링크 제한을 걸 수 있게 되었다. 어느 정도는 Referer를 원래 보내 오지 않는 브라우저도 있고, 보안 소프트웨어에 따라 Referer를 끄는 경우도 있다. 이와 같은 경우는 클라이언트에서 액세스할 수 없게 된다. 또한 Referer를 위조 할 수 있는 것도 있으므로 Referer에 의한 액세스 제한은 절대적이라고는 할 수 없다.
이와 관련하여 보안 소프트웨어 대응으로 Referer가 없는 경우에도 액세스를 허용하려면 다음과 같이 작성한다.
SetEnvIf Referer "^http://localhost" local_referal
SetEnvIf Referer "^$" local_referal
<Directory "${SRVROOT}/htdocs/img">
Require all denied
Require env local_referal
</Directory>
이렇게 작성되면 직접 URL을 입력한 경우에도 허용되긴 하지만, 다른 서버에 있는 HTML 파일에서 직접 이미지에만 링크를 붙여 표시하는 것을 제한할 수 있다 .