작성
·
92
·
수정됨
0
@PostMapping("/login")
public String loginV4(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult,
// @RequestParam(defaultValue = "/") String redirectURL,
RedirectAttributes redirectAttributes,
HttpServletRequest request) {
if (bindingResult.hasErrors()) {
log.info("errors={}", bindingResult);
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
log.info("login? {}", loginMember);
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
log.info("bindingResult={}", bindingResult);
return "login/loginForm";
}
//세션이 있으면 있는 세션 반환, 없으면 생성
HttpSession session = request.getSession();
//세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
//redirectURL 적용
log.info("request.getParameter={}",request.getParameter("redirectURL"));
redirectAttributes.addAttribute("redirectURL", request.getParameter("redirectURL"));
return "redirect:{redirectURL}";
}
맨 아래에서 강사님과 다르게 @RequestParam을 사용하지 않고 RedirectAttributes와 getParameter를 이용해서 처리를 해 보려 했는데,
실행 결과 {redirectURL}의 부분이 'localhost:8080/%2Fitems' 로 뜹니다.
redirectAttributes에 넣을 때 잘못된 건가 싶어서 request.getParameter의 로그를 찍어보면 정상적으로 /items로 나옵니다.
어디가 잘못 된 건지 여러 번 돌려봐도 모르겠어서 질문 남깁니다!
추가 : URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. 다음에 설명하는 RedirectAttributes 를 사용하자.
라고 하셨는데 @RequestParam 으로 받은 변수값을 써도 괜찮은 건지 잘 모르겠습니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
문제가 되고 있는 부분은 return "redirect:{redirectURL}";
코드입니다. {redirectURL}
부분이 문자열 형태로 인식되어 리다이렉트 경로로 바뀌지 않고 있는 문제입니다. RedirectAttributes
를 사용하면, URL에 파라미터로 해당 값이 추가되므로 return "redirect:/";
와 같이 리다이렉트할 기본 경로를 지정하고, 질문하신 내용대로 redirectAttributes.addAttribute()
를 사용하여 파라미터를 추가하면, {redirectURL}
을 직접 경로에 포함시키지 않고도 원하는 리다이렉트 경로로 잘 동작할 것입니다.
따라서, return "redirect:{redirectURL}";
대신 return "redirect:/" + request.getParameter("redirectURL");
로 변경하여 시도해보세요. 단, 이렇게 직접 문자열을 연결하는 방식은 URL 인코딩이 고려되지 않아 보안상 안전하지 않을 수 있습니다. 가장 좋은 방법은 RedirectAttributes
를 이용하는 것인데, 이미 하고 계신 방향이 올바릅니다.
@RequestParam을 사용할 때 URL 인코딩 문제에 대해서는, 일반적으로 스프링 MVC에서는 필요한 인코딩/디코딩 처리를 알맞게 수행해줍니다. 따라서 @RequestParam으로 받은 변수값을 사용하는 것은 문제가 없으며, RedirectAttributes를 사용하여 URL 파라미터를 추가하는 방식도 안전하고 권장되는 방식입니다.
리다이렉션에서 변수를 직접 URL 경로로 포함시키는 것이 아니라, redirectAttributes
를 활용해 파라미터로 추가하는 방식을 유지하시면서 코드를 조정해보세요.