redirect를 하였을 시, 서버에서 사용한 키가 url에 예시처럼 붙는 경우가 있었다. 그래서 원인을 파악하고 다른 방식을 찾아보게 되었다.
http://localhost:8080/test/home?publicKey=ABCDEFG
원인
해당 부분에서는 redirect 시 데이터 전달 방식이 Model에 addAttribute()로 전달하는 것이었다. 이렇게 되면 Request scope에 저장되는데, jsp에 데이터를 넘기려면 이렇게 해야 한다고 생각해서 아래처럼 작성하게 되었다.
// 예시
@PostMapping("/submit")
public String submit(Model model) {
model.addAttribute("name", "dbswl");
return "redirect:/success";
}
그렇지만 이 방식은, 내부적으로 model의 값이 URL 쿼리 파라미터로 변환되어 붙게 된다.
// 결과
/success?name=dbswl
방안
그럼 어떤 방법을 사용할 수 있을까.
Spring에서는 redirectAttributes.addFlashAttribute()라는 기능을 제공한다. 이 방식은 URL에 쿼리 파라미터가 붙지 않고, 세션에 잠깐 데이터를 저장한 뒤 다음 요청에서 꺼내 쓰는 방식이다. 즉, URL은 깔끔하게 유지하면서도 데이터를 안전하게 전달할 수 있다.
// 예시
@PostMapping("/submit")
public String submit(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("name", "dbswl");
return "redirect:/home";
}
// 받을 때
@GetMapping("/home")
public String home(@ModelAttribute("name") String name) {
System.out.println("name = " + name);
return "home";
}
- FlashAttribute가 필요한 상황
- URL에 노출되면 안 되는 민감한 정보
- 사용자가 페이지를 새로고침하거나 URL을 공유하더라도 노출되면 안 되는 값
- 클린 URL을 유지하고 싶은 경우
정리해 보자면,
항목 | addAttribute() | addFlashAttribute() |
전달 방식 | URL 쿼리 파라미터로 전달 | 세션(FlashMap)을 통해 전달 |
URL 노출 여부 | 노출됨 (?key=value) | 노출되지 않음 |
데이터 유효 범위 | 항상 남아 있음 | 다음 요청에서만 1회 사용 후 사라짐 |
새로고침(F5) 시 | 계속 유지됨 | 값 사라짐 |
'Today I Learned > Spring' 카테고리의 다른 글
[Security] @Secured, @PreAuthorize, @PostAuthorize (0) | 2025.05.27 |
---|---|
[Spring] React 라우팅을 위한 SPA 서버 세팅 (0) | 2025.04.20 |
[Spring] RestTemplate (0) | 2025.04.09 |
[Spring] getSession(), getSession(true), getSession(false) (0) | 2023.03.06 |
[Spring] 어디에서나 Spring 컨테이너 Bean 객체 가져오기 (1) | 2023.02.14 |