본문 바로가기
프로그래밍/Java

jsp, sendRedirect() url 처리 이슈 해결 방법.

by Mr-후 2025. 3. 7.
반응형

오랜만에 글을 쓰는데 내용이 좀 어렵다. 

한 달정도 말썽을 부린 것 같은데 결국은 해결점에 도달했다. 

하이브리드 앱에서 PG사 연동을 위해 개발을 진행했고 

결제 요청을 PG사로 한 다음 Callback URL을 https:// ~ 도메인으로 설정해서 보냈다. 

PG사는 인증된 정보를 Callback URL로 form submit을 해서 보냈다. 

그런데 화면 전환이 제대로 이뤄지지 않고 인디케이트만 도는 현상이 나왓다. 

다들 우리 문제는 아니라고 했다. 

PG사는 정상적으로 form submit 을 했다고 했다. 

우리는 페이지 전환이 안된다고 했다. 

방화벽에 문제는 없는지? 문의했더니 인터넷망이라 문제될 것이 없다고 했다. 

개발서버에서는 잘 작동이 되었다. 

운영서버에만 올라가면 되돌아오지 못하고 빙글빙글 돌고있다. 

운영앱의 디버깅하기 쉬운 환경은 아니다. 

네이티브 담당자에게 문의해서 디버깅을 하기로 했다. 

아이폰은 별 도움이 되지 못했고 안드로이드는 어느정도 시간이 지나니 

net::ERR_CONNECTTION_TIMED_OUT을 뱉으며 프로세스가 종료되었다. 

이때 URL을 보니 프로토콜이 https:// 가 아닌 http://로 되어 있다. 

 

 

 

PG사가 보내는 URL은 https:// ~ /retrun.jsp? 였고 return.jsp안에서는 

response.sendRedirect("/html/result.html?")로 처리가 되고 있는 상황이었다. 

찾아보니, sendRedirect할 때 https:// 가 http://로 바뀔 수 있다고 한다. 

서버 설정에 따라 그럴수 있다고 하는데 여지껏 나는 몰랐던 것이다. 

 

  • 절대 경로와 상대 경로 차이
    • response.sendRedirect("/html/psv/result.html")는 브라우저가 상대적인 경로로 인식하고, 현재 요청의 프로토콜(https://)을 유지해야 하지만, 서버의 설정이나 리다이렉트 처리 방식에 따라 다르게 동작할 수 있습니다.
  • 서버의 리다이렉트 기본 설정
    • 일부 WAS (예: Tomcat, WebLogic)에서는 sendRedirect()를 호출하면 기본적으로 http://로 변환될 수도 있습니다.
    • 이는 server.xml 또는 application.properties 등의 설정에서 기본 스키마가 http로 되어 있을 가능성이 있습니다.
  • Reverse Proxy (nginx, Apache) 또는 Load Balancer 문제
    • 프록시 서버가 클라이언트와 HTTPS로 통신하지만, 내부 서버(Tomcat 등)와는 HTTP로 통신하는 경우, sendRedirect()가 내부 서버의 프로토콜을 따를 수 있습니다.
  • Spring Boot (또는 Servlet)에서 sendRedirect() 사용 시 기본 프로토콜이 HTTP로 설정됨
    • Spring Security 또는 Spring Boot 환경에서는 server.use-forward-headers=true 설정이 필요할 수 있습니다.

 

그리하여, 다음과 같은 방법으로 처리하기로 했는데 잘될거라 믿고 있다. 

String url = request.getScheme() + "://" + request.getServerName() + "/html/psv/result.html";
response.sendRedirect(url);

 

만약, jsp + html + js 방식을 사용했다면 잘 되었을 것이다. 
자바스크립트의 location.href를 사용했다면 말이다... 

jsp의 버퍼가 아직 브라우저에 표시되기전 response.sendRedirect를 하는 바람에 꼬인 원인도 있다. 

여러 디버깅의 어려움도 있었고 제반적인 사항도 있었지만 

개발이란게 이럴때도 있는거 아닌가 싶다. 

 

 

반응형