인프런 커뮤니티 질문&답변

Jaesang Yoon님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

입력 폼 처리

POST 컨트롤러를 수행한 뒤에도 현재 페이지를 보여주는 방법

24.05.10 20:23 작성

·

146

·

수정됨

0

POST 매핑 동작을 수행한 뒤에도 기존에 머물렀던 페이지로 리다이렉트 하는 방법이 있을까요?

예를 들어, 로그아웃 버튼을 클릭한 뒤에도 기존 페이지를 보여주는 상황이 이에 해당됩니다.

그렇다면 현재 페이지의 주소에 대한 정보를 컨트롤러에서 가지고 있어야 할텐데 어떤 방식으로 구현하는 것이 좋을지 궁금해서 질문 남깁니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

2024. 05. 11. 19:19

안녕하세요. Jaesang Yoon님

POST 요청 처리 후 사용자를 원래 페이지로 리다이렉트하려면 몇 가지 방법이 있습니다. 가장 흔히 사용하는 방법은 리퀘스트에 리퍼러(referrer) 정보를 활용하거나, 요청 시 현재 페이지의 URL을 명시적으로 전달하는 것입니다.

1. 리퍼러(Referrer) 활용

HTTP 리퍼러는 사용자가 현재 요청을 하기 전에 마지막으로 방문했던 페이지의 URL을 포함하는 헤더입니다. 서버 측에서 이 정보를 읽어서 해당 위치로 리다이렉트할 수 있습니다. 예를 들어, 스프링 프레임워크에서는 다음과 같이 구현할 수 있습니다:

import javax.servlet.http.HttpServletRequest;

// 스프링 컨트롤러 메서드
@PostMapping("/logout")
public String handleLogout(HttpServletRequest request) {
    // 로그아웃 처리 로직

    // Referrer 헤더에서 이전 페이지 URL 가져오기
    String referrer = request.getHeader("referer");
    return "redirect:" + referrer;
}

이 방법의 단점은 사용자의 브라우저가 리퍼러를 보내지 않을 수도 있고, 보안상의 이유로 리퍼러를 제거하는 설정을 사용하는 경우가 있다는 것입니다.

2. 현재 페이지 URL 명시적 전달

페이지를 렌더링할 때 현재 페이지의 URL을 양식의 숨겨진 필드나 쿼리 파라미터로 추가하여 전송할 수 있습니다. 이 방법은 더 신뢰성이 높으며 리퍼러를 사용할 때 발생할 수 있는 문제를 피할 수 있습니다.

예를 들어, 로그아웃 버튼이 포함된 폼이나 링크를 다음과 같이 작성할 수 있습니다:

<!-- 현재 페이지 URL을 쿼리 파라미터로 전달 -->
<a href="/logout?redirect={currentPageUrl}">로그아웃</a>

<!-- 또는 POST 폼에서 -->
<form action="/logout" method="post">
    <input type="hidden" name="redirect" value="${currentPageUrl}">
    <button type="submit">로그아웃</button>
</form>

그리고 스프링 컨트롤러에서는 이 파라미터를 사용하여 리다이렉트할 수 있습니다:

javaCopy code@PostMapping("/logout")
public String handleLogout(@RequestParam("redirect") String redirectUrl) {
    // 로그아웃 처리 로직
    return "redirect:" + redirectUrl;
}

정리

리퍼러를 사용하는 방법은 구현이 간단하지만, 사용자의 설정에 따라 작동하지 않을 수 있습니다. 반면, URL을 명시적으로 전달하는 방법은 더 신뢰할 수 있으며, 어떠한 사용자 설정에도 영향을 받지 않습니다.

감사합니다.

Jaesang Yoon님의 프로필 이미지
Jaesang Yoon
질문자

2024. 05. 11. 19:39

감사합니다 영한님! 많은 도움이 되었습니다 🙂 좋은 주말 보내세요