접근 허용 범위 설정 (섹션 컨테이너)

편집일시: 2019-12-08 03:46 조회수: 54 댓글수: 0
Apache에서는 접근을 허용하는 적용 범위를 디렉토리 단위와 파일 단위로 제한할 수 있다. 여기에서는 구성 적용 범위를 지정하는 방법에 대해 설명한다. ## 구성 적용 범위를 제한 "httpd.conf"파일을 보면 다음과 같은 내용을 볼 수 있다. ``` <Directory /> AllowOverride none Require all denied </Directory> <Directory "${SRVROOT}/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> <Files ".ht*"> Require all denied </Files> ``` 유사한 설정이 반복적으로 이루어지고 있다. 실제 설정이 영향을 받는 범위를 지정하고, 그 범위마다 설정을 되고 있다. 이 범위를 지정하기 위한 작성을 섹션 컨테이너라고 하는 `<Directory>`, `<Files>` 등을 이용하여 작성한다. 영향 범위 지정은 (1) 디렉토리 단위로 지정하는 방법, (2) 파일 단위로 지정하는 방법, (3) URL의 경로명 단위로 지정하는 방법의 3 가지로 지정할 수 있다. 예를 들어, 디렉토리에 있는 파일을 보기 위해서는 인증이 필요하도록 설정하는 것이 가능하다. 간단히 작성하는 방법을 살펴 보겠다. ## 디렉토리 단위로 지정 디렉토리 단위로 범위를 지정하는 경우에는 섹션 컨테이너로 "`<Directory>`"를 사용한다. ``` <Directory 경로>     ...     설정 지시어     ... </ Directory> ``` 디렉토리를 나타내는 경로는 전체 경로를 지정한다. Windows의 경우 드라이브에서 지정된다. 별표(\*) 및 물음표(?)와 같은 와일드 카드를 사용한 지정도 가능하다. ``` <Directory />     ... </ Directory> <Directory "${SRVROOT}/htdocs">     ... </ Directory> ``` 위에서는 경로로 "/"와 "${SRVROOT}/htdocs"두 가지가 지정되어 있다. 디렉토리로 지정되면 지정된 디렉토리와 그 디렉토리에 포함된 모든 하위 디렉토리 전체가 포함된다. "${SRVROOT}/htdocs"라고 지정되어 이 디렉토리 아래에 있는 모든 파일 및 하위 디렉토리 모두가 대상이 된다. ${SRVROOT}는 아래와 같이 지정되어 있기에 실제 경로는 "${SRVROOT}/htdocs"의 실제 경로는 "C:/apache/Apache24/htdocs" 이렇게 된다. ``` Define SRVROOT "C:/apache/Apache24" ``` 경로 이름 "/"라고 작성된 부분은 특별하다. 앞에서 작성한 대로 디렉토리로 지정된 경우에는 모든 하위 디렉토리가 대상이 된다. "/"는 루트 디렉토리를 나타내기에 경로를 "/"로 지정하면 모든 파일이 적용된다. 즉, 여기에서 작성된 설정은 개별로 설정이 되지 않는 모든 디렉토리의 기본 설정이 될 것이다. 별도의 디렉토리에 설정을 작성하고, 그 하위 디렉토리 대해 별도의 설정을 할 수 있다. 이 경우 2개의 설정 (정확하게는 루트에 대한 설정도 포함하면 3개의 설정)이 대상 디렉토리에 대해 작성될 수 있지만, 디렉터리로 지정하는 경우에는 루트에서 길이가 가장 짧은 순(경로가 가장 짧은 순)으로 적용되어 같은 설정 항목에 대한 설정은 덮어쓰여 진다. ## 파일 단위로 지정 파일 단위로 범위를 지정하는 경우에는 섹션 컨테이너로 `<Files>`를 사용한다. ``` <Files 파일명>     ...     설정 지시어     ... </ Files> ``` 파일 이름을 지정하는 경우 해당 파일이 존재하는 디렉토리에 관계없이 특정 파일 이름의 파일이나 특정 확장자를 가진 파일 전반에 설정을 하고 싶은 경우에 이용하면 편리한다. 파일명도 별표(\*) 및 물음표(?)와 같은 와일드 카드를 사용한 지정도 가능하다. "httpd.conf"파일에 작성된 예를 보면 다음과 같이 기술되어 있다. ``` <Files ".ht*"> ... </Files> ``` 위에서는 ".ht\*"라고 지정되어서 이 와일드 카드와 일치하는 파일명은 모두 적용된다. 예를 들면, "a.html"와 파일명이 모두 적용된다. 그리고 아래와 같이 파일명의 정규표현식으로도 사용 가능하다. 정규표현식으로 작성되어 있으면 이 정규표현식과 일치하는 파일명이 모두 적용된다 ``` <Files ~ "\.(htm|html|css|js|php)$"> ... </Files> ``` 위에 예는 htm, html, css, js, php가 모두 적용된다. 이와 동일하게 `<FileMatch>`를 사용해서도 정규표현식이 가능하다. `<Files>`와 다른 점은 " ~"를 붙히지 않아도 정규표현식이 적용된다. ``` <FilesMatch "\.(htm|html|css|js|php)$">     ... </ FilesMatch> ``` 파일명으로 범위 지정된 설정이 여러개가 작성되었다면, 작성된 순서대로 설정이 활성화되어 간다. 디렉토리의 경우 경로가 가장 짧은 이었지만, 파일명의 경우는 작성된 순서대로 적용되어가는 점에 주의하도록 한다. ## URL 경로 단위로 지정 URL 경로 단위로 범위를 지정하는 경우에는 섹션 컨테이너로 `<Location>`를 사용한다. ``` <Location URL경로>     ...     설정 지시어     ... </ Location> ``` 실제 파일의 존재 위치와는 다르게 어떻게 호출되는지의 URL 경로(및 해당 URL 경로로 시작하는 전체 URL)에 설정이 적용된다. 경로는 URL이 "http://호스트/aaa/bbb"라면 "/aaa/bbb"부분을 지정한다. ``` <Location /aaa/bbb>     ... </ Location> ``` "Location"는 데이터베이스으로 부터 동적으로 URL을 생성하는 경우에 사용하면 편리하다. ## 실제 설정 방법 3개의 섹션 컨테이너가 작성되었다면 "디렉토리", "파일명", "URL 경로"의 순서로 설정이 적용되어 가고 이후 설정은 덮어쓰기를 하게 된다. 여기서 실제 파일에 대해 하나의 액세스 작성 방법으로 "Location"의 URL 표기에 대한 설정을 설명하고 있는데, 이는 어디까지나 파일에 접근 방식의 작성 방법에 대한 제한이지 실제 파일에 대한 범위 설정은 아니다. 문제 없을 수도 있겠지만, 존재하는 파일에 대한 설정은 되도록이면 "Directory"와 "Files"를 사용하여 작성하도록 한다. ## 참조 - [https://httpd.apache.org/docs/2.4/en/sections.html](https://httpd.apache.org/docs/2.4/en/sections.html)