본문 바로가기

Backend/Web

[보안 취약점] PRG 패턴 (Post-Redirect-Get Pattern)

반응형

로그 아웃 후 캐시를 초기화 하지 않아 로그인 되었던 화면이 남아있는 이슈가 있었다.

필터에서 캐시 초기화 진행
뒤로가기 해도 정보가 넘어가게(양식 다시 제출 방지용)

근데 session이나 cookie에 담는 것은 왜 안했을까?

 

PRG 패턴 (Post-Redirect-Get Pattern)

PRG패턴은 Post를 이용해 리소스에 대한 변경 요청이 있을때 해당 요청에 대해 재요청시 Post가 아닌 Get으로 Redirect되는 패턴이다. 웹 개발시 권장되는 디자인 패턴이다.

이게 왜 중요하냐면 Post를 이용해 데이터를 전송하게 되는데 그 요청을 계속해서 재요청하게되면 동일한 데이터를 계속해서 전송하게 되기 때문이다.

예를 들면 상품등록시 상품을 등록하는 요청에 대해 새로고침만 해도 해당 데이터가 전달되게 된다. 다른 예로는 크리티컬하게 금융으로 볼수있다. 결제 과정에서 일어난다면 계속 결제가 되는 것이다.....

 

이를 서버의 관점에서 보면 흐름이 다음과 같다.

  1. 사용자로부터 폼에 대해 요청을 받는다. [GET /url/form]
  2. 사용자로부터 데이터 전송 요청을 받는다. [POST /url]
  3. DB저장 후 결과 화면을 보여준다. [POST /url]

여기서 3번에서 해당 취약점이 발견되는 것이다. 3번은 단순히 view만 변경되었기 때문에 Url은 그대로 이다. 그렇기 때문에 이 상태에서 refresh를 하게되면 유지된 Url로 동작을 하게 되고 Post동작을 반복하게 되는 것이다.

 

이를 해결하기 위해서 Post에 대한 응답코드가 200이 아닌 3XX가 되도록 해야 한다.

 

예) 

@Slf4j
@Controller
public class TestController {

    @PostMapping("/hello")
    public String hello() {
        log.info("POST /hello 호출");
        return "redirect:/world";
    }
    
    @ResponseBody
    @GetMapping("/world")
    public String world() {
        log.info("GET /world 호출");
        return "ok";
    }
}

 

반응형

'Backend > Web' 카테고리의 다른 글

[CSS] 하위 요소 적용 및 단어단위로 줄바꾸기  (0) 2024.08.01
[Web] about API  (0) 2024.07.25
[CSRF]About CSRF  (0) 2024.04.04
[HTTP] 상태 코드  (0) 2024.03.18
[Api] API문서 작성  (0) 2023.11.29