IT 성장일기
[Tomcat] 설정한 에러 페이지가 아닌 기본 에러 페이지가 나타날 때 (with Error Code 400) 본문
설정한 에러 페이지가 아닌 기본 에러 페이지가 나타날 때 (with Error Code 400)
웹 서버에서 반환하는 에러 메시지를 클라이언트 측에 노출하게 된다면 보안상의 약점이 노출 될 여지가 생기기 때문에
웹 애플리케이션을 제작할 때는 보통 웹 에러 코드에 따른 에러페이지를 제작하고 web.xml 파일에 이를 설정합니다.
하지만 Tomcat을 사용하는 경우,
식별된 바로는 8.5 이상의 버전에서 URL에 퍼센트 기호('%') 또는 대괄호 기호('[', ']') 가 포함되는 경우
미리 설정해둔 Custom Error Page가 아닌 Tomcat Default Error Page가 표시되는 이슈가 발견되었습니다.
(예를 들면 localhost:8080/% 또는 localhost:8080/[ 등)
저는 취약점을 해소하기 위해 위의 상황에서도 Custom Error Page를 표시할 방법을 찾아야 했습니다.
처음엔 원인도 모른 채로 여러가지 다양한 시도를 해봤습니다.
1. server.xml 파일에 URL 인코딩 설정
2. Filter Class 생성 후 Bean 등록
3. Catalina.properties 파일에 설정값 추가
(모두 실패했고 검증 된 시도가 아니라 따로 글에 싣지는 못하지만 어딘가 기록해두고 나중에 또 참고하도록 해야겠습니다.)
그래서 해결 방법이 있을 것 아니예요
다양한 실패 끝에 결국 해결 방법을 찾았습니다.
1. 서버 정보 및 에러메시지 숨기기
아래 경로를 따라 server.xml 파일을 열어줍니다.
가장 아래 쪽 <Host> 태그 사이에 아래 태그를 붙여넣기 해줍니다.
Tomcat > conf > server.xml
<Host>
...
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false"
showServerInfo="false" />
...
</Host>
사실 찾아보면 여기 저기 알려진 방법이지만 나름대로 주의사항 등을 곁들여 작성해보겠습니다.
먼저 위 코드를 적용하면 아래와 같던 에러페이지에서 서버 정보와 에러메시지 등이 사라집니다.
하지만 제가 목표로 했던 것은 아예 Custom Error Page를 표시하도록 하는 것...
다시 server.xml 파일을 열어 아까 추가했던 코드에 속성 하나를 더 추가했습니다.
2. Custom Error Page 띄우기
Tomcat > conf > server.xml
<Host>
...
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false"
showServerInfo="false"
errorCode.0="C:/apache-tomcat-8.5.89/error.html" />
...
</Host>
새로 추가한 속성은 errorCode.0 속성입니다.
아직 error.html 파일이 없기 때문에 이 속성을 추가해도 <1.서버 정보 및 에러메시지 숨기기>와 같은 결과가 발생합니다.
Error Page를 표시하기 위해 아래처럼 간단하게 html 파일을 구성하고 설정해둔 경로에 적재했습니다.
이 글을 참고하시는 분들은 각자 조건에 맞는 경로와 파일명을 적용하시면 됩니다.
C: > apache-tomcat-8.5.89 > error.html
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
.error_container {
margin:100px auto;
max-width:300px;
height:100px;
background-color:#b3b3b3;
border-radius:10px;
}
.error_header {
text-align:center;
color:#fff
}
.error_btn {
height:30px;
margin:auto;
padding:5px 0px 0px 0px;
max-width:100px;
background-color:#fff;
border-radius:3px;
text-align:center;
}
</style>
</head>
<body>
<div class="error_container">
<h2 class="error_header">Error</h2>
<div class="error_btn" id="error_btn">
<label>Back</label>
</div>
</div>
</body>
<script type="text/javascript">
function clickEvent() {
var elem = document.getElementById("error_btn");
elem.addEventListener('click', function() {
history.back(-2);
});
}
clickEvent();
</script>
</html>
그 후 Tomcat을 재시동하고 문제가 되는 URL을 입력하면 아래와 같이 미리 설정해 둔 에러 페이지가 표시됩니다.
Back 버튼을 눌렀을 때 뒤로가기 함수도 잘 작동합니다.
3. 주의사항
위 내용을 설정할 때 몇가지 주의할 점이 있습니다.
- JSP 등 SSR 템플릿 파일은 인식하지 못함. 반드시 HTML 파일을 적재해두어야 합니다.
- server.xml 파일에는 ${CATALINA_HOME} 과 같은 경로 변수를 사용하지 못한다.
- 상대경로를 사용하지 못함. 반드시 error.html 파일의 절대경로를 기입해주어야 합니다.
이 문제를 해결하느라 꽤 많은 시간이 들었네요...(글 쓰는데에도 그만큼 든 것 같긴 한데)그래도 결국 해결하게 되어 뿌듯합니다.
도움이 되어드렸다면 구독 / 좋아요 부탁드립니다.👏🏻
감사합니다.🙂
'Server > Tomcat' 카테고리의 다른 글
[Tomcat] 암호화 알고리즘 사용 제한하기 (0) | 2023.09.11 |
---|---|
[Tomcat] TLS 버전 제한하기 (0) | 2023.09.11 |
[Tomcat] Default Error Page에서 톰캣 버전 정보 감추기 (0) | 2023.09.11 |
[Tomcat] 사용 중인 웹 서버 포트를 터미널에서 강제로 닫기 (0) | 2023.09.11 |
[Tomcat] 세션 아이디 설정하기 (0) | 2023.09.11 |