비동기 통신 redirection

최준호·2021년 12월 13일
0

업무

목록 보기
2/31

back-end에서 작업을 진행하면서 상태 코드 값을 3xx로 반환해야할 경우가 있다. 상태 코드값이 3xx인 경우는 redirection이 필요한 경우인데. 리디렉션(리다이렉션)은 현재 요청한 url에서 반환 후 연결되는 url을 변경하여 연결한다는 것이다. 주로 post 동작에 리디렉션을 많이 사용하는데 그 이유는 PRG의 개념을 이해하면 이유를 이해할 수 있다.

PRG (Post-Redirection-Get)

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로 연결이 가능하다.

비동기 통신 return redirection

그래서 내가 회사 업무를 진행하던 도중 api의 반환으로 redirection을 구현해야할 경우가 생겼다. 특정 어떤 경우 로직을 다른 url로 요청을 해야했기 때문이다. 비동기 통신이기 때문에 return으로 redirection을 지정해주어도 페이지의 이동이 있는 것은 아니고 비동기로 다시 해당 url로 요청하는 동작으로 진행되었다.

redirection 하는 방법

redirection은 브라우저에 상태코드 값으로 3xx을 지정하여 반환하며 Location 값을 지정해주면 자동으로 redirection이 일어난다. spring의 페이지 redirection의 경우 "redirect:url"로 설정해주면 자동으로 적용되며 직접 작성하고자 한다면

HttpHeaders header = new HttpHeaders();
header.setLocation(URI uri);

header 세팅

response.sendRedirect(String url);

response에 세팅

다음과 같이 사용하여 redirection을 진행할 수 있다.

3xx 상태코드

우리가 주로 사용하는 302 코드가 가장 많이 사용되는 redirection 상태 코드값인데 사실 이 상태 코드값은 좋은 반환 코드 값은 아니다. 하지만 이미 많은 브라우저들과 개발자들이 사용하고 있기 때문에 그대로 사용해도 상관 없지만 대체 코드로 303과 307을 사용하길 권장한다.
301 url이 완전 이전됨
302 url이 잠시 연결됨
303 url을 get으로 redirection 함
307 url method를 변경하지 않고 그대로 redirection 함

각 상태코드에 따라 차이점도 있으니 알고 넘어가자! 또한 redirection에 따라 검색 엔진의 페이지 평가 정보를 잃어버릴 수도 있으니! 페이지의 이동이 영구적이라면 301로 연결해주어야 한다는 것을 잊지 말자!

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글