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 패턴

PRG Pattern 출처 : Wikipedia

Post 기반의 결제를 위한 uri로 접근하여 pay() 메서드에 매핑이 되면 비즈니스 로직을 처리하고, GetMapping을 하는 /order 로 redirect 됩니다.

이 때 POST 요청이 들어오면 브라우저는 302 응답 코드를 받게 되고, /order로 redirect 됩니다.

결제는 POST로 하였지만, 결제 후에는 GET 메서드에 매핑이 되기 때문에 새로고침을 하여도 로직은 발생하지 않고, GET 메서드만 발생하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Controller {

@PostMapping("/pay")
public String pay(){
// 비즈니스 로직
return "redirect:/order";
}

@GetMapping("/order")
public String order(){
return "order";
}

}

PRG(Post-Redirect-Get) 패턴

http://inwoo.github.io/11/29/PRGPattern/

Author

Inwoo Jeong

Posted on

2021-11-29

Updated on

2021-11-29

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글