티스토리 뷰

Web

[Web] PRG 패턴 (Post-Redirect-Get)

Jaehee Jeon 2022. 10. 5. 16:14
반응형

PRG 패턴이란?

 

 웹 개발 시 새로고침으로 인한 중복된 HTTP Post요청을 방지하기 위해 서버가 클라이언트의 리다이렉션(Redirection)을 유도하는 방법. POST 요청에 대한 처리를 Redirect 하여 GET 요청을 다시 처리한다. (Post-Redirect-Get)

 

 

PRG 패턴의 필요 상황

 

 브라우저의 새로고침은 마지막에 보냈던 HTTP 요청을 다시 보내는 기능이다.

 그러나, POST 요청이 새로고침으로 인해 동일한 요청을 담아 다시 보내진다면 아래와 같이 의도하지 않은 상황이 발생할 수 있다.

 

 위와 같이 사용자가 블로그에 새 글을 작성해 서버로 POST 요청을 보냈다 가정하자. 일반적으로 글 작성을 완료하면 서버에서 현재 작성한 글에 대한 상세 보기 페이지를 반환해준다.

 만약 서버가 PRG 패턴을 사용하지 않는다면, POST요청을 받아서 DB에 해당 글을 등록하고, HTTP 상태 코드 200번대의 성공적인 응답과 관련된 상태 코드와 새로운 글에 대한 상세 페이지를 보내줄 것이다.

 

 하지만 여기서 유저가 새로고침을 한다면, 브라우저는 이전에 보냈던 요청을 다시 서버로 보내게 되는데, 이는 곧 이전에 작성했던 글의 내용을 동일하게 담아서 다시 서버로 POST요청함을 의미한다. 이렇게 되면 글 번호만 다르고 같은 내용의 글이 계속 등록될 것이다.

 

 

PRG 패턴의 사용

 

 이를 해결하기 위해선 POST 요청에 대해 서버가 Redirect 시키는 응답을 하여 다시 GET 요청을 하도록 만들어야 한다.

 

 위와 같이 서버가 POST 요청에 대해 바로 글에 대한 상세 페이지를 반환하는 대신, HTTP 30X의 상태 코드와 함께 작성된 글의 상세 페이지에 대한 URL을 넘겨주면 해결된다. 해당 응답을 받은 사용자의 브라우저는, 받은 URL로 다시 GET 요청을 하게 되고, 이후의 새로 고침은 마지막에 보냈던 요청이 새 글 상세 페이지에 대한 GET 요청이었으므로, 더 이상 POST 요청을 하지 않는다.

 

 

 이외에도 북마크와 같은 기능에서는 URL만 저장하므로, Request Body의 내용이 중요한 HTTP POST 요청에 대한 응답은 북마크를 할 수 없다. 반면 PRG 패턴은 최종적으로 GET으로 처리되므로 이것이 가능해진다.

 

반응형