상황
STS4에 Tomcat 9를 설치하고 실행하는 과정에서 에러가 발생했다.
접속해야 하는 주소가 'http://'로 시작되어야 하는데, 자동으로 'https://'로 접속이 되기 때문에 해당 에러가 생겼다.
해결 방법은
1. 'http://localhost:8080/'로 링크 접속을 한다.
2. 또는 ssl 인증서를 구매하고 'https' 관련 설정을 마치고 'https://localhost:8080/'로 접속한다.
그러나 'http://localhost:8080/'로 링크 접속을 시도해봐도 chrome에서 무조건 실행하자마자
'https://localhost:8080/'로 자동 접속이 되는 상태이다.
에러 메시지
8월 22, 2024 4:03:30 오후 org.apache.coyote.http11.Http11Processor service
정보: HTTP 요청 헤더를 파싱하는 중 오류 발생
비고: HTTP 요청 파싱 오류들이 더 발생하는 경우 DEBUG 레벨 로그로 기록될 것입니다.
java.lang.IllegalArgumentException: 메소드 이름에 유효하지 않은 문자가 발견되었습니다. HTTP 메소드 이름은 유효한 토큰이어야 합니다.
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:407)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:256)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:1583)
1. 해결
1-1. server.xml <Connector> 설정 내 'redirectPort' 삭제
server.xml 파일의 <Connector> 설정에서 redirectPort = "8443"이 설정되어 있다면 문제가 될 수 있다.
이 설정은 클라이언트가 HTTP 요청을 할 때, Tomcat이 자동으로 HTTPS로 리디렉션하도록 하기 때문이다.
기존 server.xml 중 <Connector> 일부
<Connector connectionTimeout="20000" maxParameterCount="1000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
수정 server.xml의 <Connector>
<Connector connectionTimeout="20000" maxParameterCount="1000" port="8080" protocol="HTTP/1.1" />
수정하고나서 톰캣을 재실행하고 'http://'로 접속했더니 크롬에서 다시 'https://'로 접속이 되었다.
그러나 postman에서 해당 링크를 get으로 보냈을 때 콘솔에 200이 찍혔다.
http로는 정상 접속이 된다는 뜻이다.
1-2.
HSTS(HTTP Strict Transport Security)가 활성화되어 있는 경우, 브라우저가 HTTP 요청을 HTTPS로 자동 변환할 수 있다.
이는 서버가 이전에 HTTPS로 요청한 경험이 있을 때 발생한다.
브라우저에서 HSTS가 설정되어 있다면, 이를 비활성화해야 한다.
우선 chrome 브라우저를 사용하고 있어서 캐시를 지워봤는데 되지 않았다.
그래서 개발자 도구를 키고 Network 탭에 들어가서 http 주소를 입력하여 접속 시도를 하고 응답 헤더를 살펴봤다.
chrome 브라우저 > 개발자 도구(F12) > Network 탭 > 페이지 새로 고침(Ctrl + R) > 요청 목록에서 확인하고자 하는 요청(jsp 페이지 등) 클릭 > Headers 탭 선택
Request Headers 섹션에는 HTST가 없어서 Response Headers를 봤더니 HTST가 활성화되고 있었다.
이로 인해 HTTP 요청이 HTTPS로 리디렉션되고 있었던 것이다.
우선 네이버 웨일 브라우저가 이미 설치된게 있어서 그 브라우저에서 제대로 된 링크를 입력해서 접속 성공은 했는데
이미 설정되어버린 크롬에서는 어떻게 해야 하는지 나중에 찾아봐야겠다.