[Spring boot] 서버 리다이렉트 과정
서버 Redirect 진행 과정을 설명한다. (feat: chatgpt)
서버 리다이렉트(Redirect) 과정 설명
서버에서 Redirect가 요청되어 진행되는 과정을 스프링 기준으로 설명합니다.
return "redirect:/"
위와 같이 Controller에서 요청을 받고, 특정 조건에 의해서 서버는 redirect를 하라고 클라이언트에게 응답할 때가 있습니다. 최근에 제 블로그도 계속해서 추가적으로 개발을 진행하고 있는데요, redirect 되는 부분이 몇군데 있습니다. 그 중 문제가 되는 부분이 생겼는데 redirect 동작 방식을 간과해 문제 원인을 잘 이해하지 못해서 해매게 됐습니다. 그래서 다시 한번 상기하려고 리다이렉팅 과정을 정리해보겠습니다. 기초라도 오래되면 잊어버리게 되는 것 같습니다~
리다이렉트의 주요 개념
HTTP 상태 코드 3xx를 사용하여 브라우저에 새로운 URL을 알려줌. 브라우저는 새로운 URL로 자동으로 요청을 다시 보냄. 리다이렉트는 서버 측과 클라이언트 측에서 모두 수행될 수 있음.
리다이렉트의 동장 박식 간략 설명
- 클라이언트 요청
- 서버가 클라이언트에게 새로운 URL로 이동하도록 응답 (코드 : 3xx)
- 클라이언트는 응답 코드 확인 후 새로운 URL로 다시 서버로 요청
1️⃣ 클라이언트 요청
클라이언트(웹 브라우저)가 특정 URL로 요청을 보냄.
GET /old-page HTTP/1.1
Host: example.com
사용자가 https://example.com/old-page에 접속하려고 한다고 가정합니다.
2️⃣ 서버의 리다이렉트 응답
서버는 요청을 처리한 후, 클라이언트가 새로운 URL로 이동하도록 응답을 보냄.
return "redirect: /new-page"
301 Moved Permanently: 영구적인 이동 (브라우저는 이 정보를 캐시할 수 있음). Location: https://example.com/new-page: 새로운 URL을 지정하여 클라이언트가 다시 요청하도록 유도.
3️⃣ 클라이언트의 새로운 요청
클라이언트(브라우저)는 서버의 응답을 받은 후, 새로운 URL로 자동 요청을 보냄.
GET /new-page HTTP/1.1
Host: example.com
이제 브라우저는 https://example.com/new-page로 새로운 요청을 수행합니다.
이 과정에서 문제가 생길 수 있습니다. 만약 사용하는 서버가 로드밸런서를 사용한다면, 그리고 일반적으로 도메인을 구입해서 사용하죠. 로드밸런서에 별다른 설정을 하지 않았다면, 스프링 서버는 'http://localhost:8080/new-page' 로 url을 보내게 됩니다.
우리가 구입한 도메인은 로드밸런서에 할당되어있고, 서버는 아무것도 되어있지 않기 때문에 localHost를 가져오게 되는 겁니다. 로컬에서 개발할때 처럼요. 실제로 AWS Elastic BeansTalk에서 로드밸런서를 사용하는데 EC2에 할당되어 있는 Public Ipv4가 있었습니다. 요금이 부과되기 하고, 필요 없을 것 같아서 해제하였는데 웬걸 구글 OAuth2가 동작하지 않았습니다. 확인해보니 Login Success 후 redirect를 하는데 요청하는 Url이 다르니 사이트에 접속할 수 없게 되더군요.
4️⃣ 서버의 최종 응답
새로운 URL에 대한 요청을 받은 서버는 정상적인 응답을 반환합니다.
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>New Page</h1>
</body>
</html>
📌 리다이렉트 종류 (HTTP 상태 코드별)
리다이렉트는 목적에 따라 여러 가지 HTTP 상태 코드로 수행됩니다.
HTTP 상태 코드 설명
301 Moved Permanently 영구적인 이동. 브라우저가 캐시하여 이후 같은 요청은 새 URL로 바로 요청됨.
302 Found 임시 이동. 사용자가 다시 요청하면 원래 URL을 사용할 수도 있음.
303 See Other POST 요청 이후, GET 요청으로 새로운 URL로 리디렉트할 때 사용.
307 Temporary Redirect 302와 유사하지만, 동일한 HTTP 메서드(예: POST)를 유지함.
308 Permanent Redirect 301과 유사하지만, 동일한 HTTP 메서드를 유지함.
✅ 일반적으로 영구적인 변경에는 301, 임시 변경에는 302를 사용.
✅ 폼 제출 후 리다이렉트할 때는 303을 사용하여 GET 요청으로 변환.
📌 정리
- 클라이언트가 서버로 요청을 보냄.
- 서버가 301, 302 등의 응답을 보내고, Location 헤더에 새로운 URL을 포함함.
- 브라우저가 새로운 URL로 자동으로 다시 요청을 보냄.
- 서버가 최종 페이지를 반환하고 클라이언트가 이를 표시함.
✔ 서버 측 리다이렉트는 HTTP 3xx 상태 코드와 Location 헤더를 사용하여 수행됨.
✔ 클라이언트 측 리다이렉트는 JavaScript (window.location.href)로 가능하지만 서버 부하 감소를 위해 서버 측 리다이렉트가 더 효율적임.