Ubuntu 16.04 / Apache / javascript 폴더 접근이 안되는 문제 해결하는 방법

Ubuntu의 Apache에서 /javascript/에 접근할 때 403 Forbidden이 표시된다면, javascript-common 패키지가 만든 Apache 별칭과 사이트의 경로가 충돌하는지 확인하세요. 다만 403은 권한이나 디렉터리 목록 설정 등으로도 발생하므로, 실제 파일의 응답과 서버 설정을 함께 확인한 뒤 조치해야 합니다.

먼저 확인할 사항

이 글은 Ubuntu에서 Apache 2.4를 사용하는 환경을 기준으로 합니다. 원래 글이 다루던 Ubuntu 16.04 LTS는 표준 지원과 일반 Ubuntu Pro 지원이 종료된 오래된 버전입니다. 추가 Legacy 지원의 조건을 확인하고 지원되는 버전으로 이전할 계획을 세우세요. 지원 일정은 Ubuntu 보안 유지 관리 일정에서 확인할 수 있습니다.

브라우저에서 /javascript/ 폴더 주소만 열었을 때 403이 나타나는 것과 그 안의 JavaScript 파일을 불러오지 못하는 것은 다른 문제입니다. 디렉터리에 기본 인덱스 파일이 없고 목록 표시가 꺼져 있으면 폴더 주소는 403이어도 개별 파일은 정상적으로 제공될 수 있습니다.

브라우저 개발자 도구의 네트워크 탭에서 실제로 실패한 파일의 URL과 상태 코드를 확인하세요. 예를 들어 사이트가 참조하는 /javascript/app.js가 200인지, 403인지, 404인지 확인하고 응답 내용도 살펴봅니다. 200이라도 의도한 JavaScript 파일 대신 다른 내용이 반환될 수 있습니다.

별칭 충돌이란?

일부 Ubuntu·Debian 환경에서는 활성화된 javascript-common 설정에 다음과 같은 별칭이 있습니다. 이 설정이 적용되면 URL 경로 /javascript가 사이트의 문서 루트 아래 폴더가 아니라 다른 디렉터리로 연결될 수 있습니다.

Alias /javascript /usr/share/javascript/

예를 들어 요청한 /javascript/app.js를 Apache가 /usr/share/javascript/ 아래에서 찾으면 원래 사이트 폴더의 파일이 제공되지 않을 수 있습니다. 대상 파일이 없으면 404가 나타날 수 있고, 대상 접근이 거부되거나 디렉터리 목록이 허용되지 않으면 403이 나타날 수 있습니다. 상태 코드만으로 별칭 충돌을 단정하지 마세요.

이 별칭은 URL의 첫 경로 구역이 /javascript인 요청과 관련이 있습니다. /assets/javascript/app.js처럼 다른 구역 아래에 있는 모든 javascript 폴더가 자동으로 해당 별칭과 일치하는 것은 아닙니다. 실제 매핑과 우선순위는 가상 호스트, 다른 별칭, 리다이렉트와 재작성 규칙에 따라 달라질 수 있습니다. Apache Alias 문서에서 경로 일치와 처리 순서를 확인할 수 있습니다.

활성 설정과 오류 로그 확인

서버에 접속해 Apache 버전과 가상 호스트를 확인합니다. 아래 검색은 설정 디렉터리에서 관련 문자열을 찾으며, 사용하지 않는 설정도 결과에 포함될 수 있습니다.

apache2 -v
sudo apache2ctl -S
sudo grep -R -n -i javascript /etc/apache2

결과에 /etc/apache2/conf-available/javascript-common.conf가 있다면 내용을 확인하고, /etc/apache2/conf-enabled/에 연결되어 실제로 활성화되어 있는지도 확인합니다. 가상 호스트별 설정과 다른 URL 규칙도 함께 살펴보세요. 파일이 없거나 별칭이 비활성화되어 있다면 이 설정이 원인이라고 가정하지 마세요.

ls -l /etc/apache2/conf-enabled/javascript-common.conf
sudo cat /etc/apache2/conf-available/javascript-common.conf

해당 파일이나 심볼릭 링크가 없다는 메시지가 나오면 설치 또는 활성 상태가 다른 것입니다. 요청 시각에 해당하는 Apache 오류 로그에서 실제로 찾은 경로와 오류를 확인하세요. Ubuntu의 기본 설정에서는 /var/log/apache2/error.log를 사용할 수 있지만, 가상 호스트별 로그 경로는 다를 수 있습니다.

sudo tail -n 50 /var/log/apache2/error.log

해결 방법 선택

사이트의 파일 경로를 변경할 수 있다면 별칭과 겹치지 않는 /assets/js/ 같은 경로를 사용하고 HTML의 script 주소와 빌드 설정도 함께 수정하세요. 기존 주소를 사용하는 페이지, 캐시, 외부 링크가 있다면 변경 영향을 확인하고 배포 후 실제 파일을 다시 요청해야 합니다. 폴더 이름만 바꾸고 참조를 그대로 두면 기존 페이지가 파일을 찾지 못합니다.

기존 /javascript 주소를 유지해야 한다면 서버 관리자가 전체 가상 호스트와 패키지의 의존성을 검토한 뒤 별칭을 변경하거나 비활성화할 수 있습니다. javascript-common 설정을 비활성화하면 다른 사이트나 패키지가 사용하던 주소도 바뀔 수 있으므로, 영향 범위를 먼저 조사하고 복구 수단을 준비하세요. 패키지 설정 파일을 직접 편집하면 패키지 업데이트 시 관리가 복잡해질 수도 있습니다.

다음은 설정이 활성화되어 있고 다른 서비스에서 사용하지 않는다고 확인한 경우의 선택지입니다. 이 명령은 해당 서버의 Apache 설정 전체에 영향을 줄 수 있습니다. 실행 후 문법 검사가 실패하면 다시 로드하지 말고 원인을 해결하거나 설정을 다시 활성화하세요.

sudo a2disconf javascript-common
sudo apache2ctl configtest

문법 검사에서 Syntax OK를 확인한 경우에만 설정을 다시 로드합니다. 서비스 이름은 환경에 따라 다를 수 있습니다.

sudo systemctl reload apache2

되돌리려면 다음 명령으로 설정을 다시 활성화하고, 문법 검사에 성공했을 때만 다시 로드합니다.

sudo a2enconf javascript-common
sudo apache2ctl configtest && sudo systemctl reload apache2

변경 후 확인과 다른 원인

변경 전 실패한 정확한 파일 URL을 다시 요청해 상태 코드와 파일 내용을 확인하세요. 브라우저 캐시를 비우거나 개발자 도구에서 캐시를 사용하지 않도록 설정한 뒤 페이지의 네트워크 요청과 콘솔 오류도 확인합니다. 기존 /javascript 경로를 사용하던 다른 사이트나 패키지도 함께 점검하세요.

별칭이 원인이 아니거나 변경 후에도 403이 남으면 Apache의 Directory·Location 접근 규칙, 파일 읽기 및 상위 디렉터리 접근 권한, 심볼릭 링크 설정, 기본 인덱스 파일과 디렉터리 목록 정책을 확인합니다. 오류를 없애기 위해 무작정 모든 접근을 허용하거나 디렉터리 목록을 켜면 공개할 의도가 없는 파일이 노출될 수 있으므로 실제 필요한 파일과 정책부터 확인하세요.