PRG(Post-Redirect-Get) 패턴
최근 프로젝트에 대한 회고를 진행하며 HTTP POST
메서드의 Double-Submit
이슈를 발견하였다.
POST request에 대한 response가 요청 처리 결과를 반환
할 때, 서버는 동일한 결과를 중복으로 처리하여 보여준다.
Double-Submit을 해결할 수 있는 방법에는 Spring MVC의 어노테이션 기반 해결
, JSP의 taglib 기반 해결
등이 있지만,
이를 회피할 수 있는 또 하나의 방법인 PRG(POST-REDIRECT-GET) 패턴
에 대해서 정리해보았다.
PRG 패턴이란 ?
HTTP POST 요청
에 대한 응답을 다른 URL에 대한 GET
방식의 페이지로 Redirect
시키는 패턴이다.
POST 메서드
는 NON-idempotent
, 즉 멱등하지 않기 때문에 재요청에 대한 대비가 되어 있어야합니다.
반대로 GET 메서드
는 멱등하기 때문에 재요청이 와도 조회만 반복해서 될 뿐 서버의 리소스
에는 영향을 미치진 않습니다.
Spring MVC의 PRG 패턴
Post 기반
의 결제를 위한 uri로 접근하여 pay() 메서드에 매핑이 되면 비즈니스 로직을 처리하고, GetMapping을 하는 /order
로 redirect 됩니다.
이 때 POST 요청이 들어오면 브라우저는 302 응답 코드
를 받게 되고, /order
로 redirect 됩니다.
결제는 POST로 하였지만, 결제 후에는 GET 메서드에 매핑이 되기 때문에 새로고침을 하여도 로직은 발생하지 않고, GET 메서드만 발생하게 됩니다.
1 | public class Controller { |
PRG(Post-Redirect-Get) 패턴
install_url
to use ShareThis. Please set it in _config.yml
.