back-end에서 작업을 진행하면서 상태 코드 값을 3xx로 반환해야할 경우가 있다. 상태 코드값이 3xx인 경우는 redirection이 필요한 경우인데. 리디렉션(리다이렉션)은 현재 요청한 url에서 반환 후 연결되는 url을 변경하여 연결한다는 것이다. 주로 post 동작에 리디렉션을 많이 사용하는데 그 이유는 PRG의 개념을 이해하면 이유를 이해할 수 있다.
PRG는 post의 요청을 get으로 redirection한다는 의미이다. 그렇다면 왜 이런 동작 구조로 진행해야할까?
예를들어 결제 시스템을 개발하여서 /order
get방식의 url에서 결제를 진행한다고 했을 경우 /order
post로 결제를 요청했다고 생각해보자 그리고 정상적으로 결제가 완료된 후 /order/finish
로 연결되었다고 하자. 그런데 이때 사용자가 /order/finish
에서 뒤로가기 버튼을 눌렀다. 그럼 브라우저는 /order
로 뒤로가겠다는 동작 원리는 모두 이해하고 있을 것이다. 그런데 여기서 연결되는 곳이 get의 /order
일까? 아니다 마지막에 요청한 url은 /order
post의 요청이였기 때문에 post의 /order
로 재요청이 진행된다. 그렇게되면 만약 결제에 대한 정보가 그대로 남아 있다는 가정하에 사용자는 뒤로가기를 눌렀을 경우 이미 끝난 결제가 한번 더 요청된다.
그 경우를 해결하기 위해 PRG를 이용하는데
/order
get페이지에서 post로 /order
의 요청이 들어왔고 redirection을 /order/finish
로 연결해놓으면 /order
get에서 /order/finish
로 왔기 때문에 뒤로가기 버튼을 눌러도 get의 /order
로 연결이 가능하다.
그래서 내가 회사 업무를 진행하던 도중 api의 반환으로 redirection을 구현해야할 경우가 생겼다. 특정 어떤 경우 로직을 다른 url로 요청을 해야했기 때문이다. 비동기 통신이기 때문에 return으로 redirection을 지정해주어도 페이지의 이동이 있는 것은 아니고 비동기로 다시 해당 url로 요청하는 동작으로 진행되었다.
redirection은 브라우저에 상태코드 값으로 3xx을 지정하여 반환하며 Location 값을 지정해주면 자동으로 redirection이 일어난다. spring의 페이지 redirection의 경우 "redirect:url"로 설정해주면 자동으로 적용되며 직접 작성하고자 한다면
HttpHeaders header = new HttpHeaders();
header.setLocation(URI uri);
header 세팅
response.sendRedirect(String url);
response에 세팅
다음과 같이 사용하여 redirection을 진행할 수 있다.
우리가 주로 사용하는 302 코드가 가장 많이 사용되는 redirection 상태 코드값인데 사실 이 상태 코드값은 좋은 반환 코드 값은 아니다. 하지만 이미 많은 브라우저들과 개발자들이 사용하고 있기 때문에 그대로 사용해도 상관 없지만 대체 코드로 303과 307을 사용하길 권장한다.
301
url이 완전 이전됨
302
url이 잠시 연결됨
303
url을 get으로 redirection 함
307
url method를 변경하지 않고 그대로 redirection 함
각 상태코드에 따라 차이점도 있으니 알고 넘어가자! 또한 redirection에 따라 검색 엔진의 페이지 평가 정보를 잃어버릴 수도 있으니! 페이지의 이동이 영구적이라면 301로 연결해주어야 한다는 것을 잊지 말자!