본문 바로가기
ERROR

[SpringSecurity] multipart/form-data 에러(CSRF 처리)

by sssooon 2023. 12. 11.

SpringSecurity를 사용하며 input태그에 file을 보내주어야 하여

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<form id="updateForm" method="post" enctype="multipart/form-data">

 

위와 같이 적용하였더니 해당 기능에서 권한이 자꾸 튕겨나갔다.

 

multipart/form-data를 사용 할 경우에는 input이 아닌 action url 정보에 토큰값을 넣어야줘야한다.

<form id="updateForm" action="/user/updateUserInfo?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">

(참고 https://taesan94.tistory.com/134)

 

또 Controller에서 잘못한 부분이 있었다.

@RequestMapping("/updateUserInfo")
public String updateUserInfo(@RequestParam(value="userImgOriName",required=false) MultipartFile file,
				@RequestParam UserInfoDTO userInfo)

form으로 데이터를 보내고있었는데 form 하위에 있는 파라미터값들이 Controller의 DTO로는 못받는 것이였다.

이유는 필드에 DTO와 일치하는 name을 안 적어두고 있었기 때문이다.

(참고 https://velog.io/@dbsrud11/Spring-Boot-%ED%8F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A3%BC%EA%B3%A0-%EB%B0%9B%EA%B8%B0)

 

 

@RequestMapping("/updateUserInfo")
public String updateUserInfo(@RequestParam(value="userImgOriName",required=false) MultipartFile file,
				@RequestParam Map<String, Object> param)

필드에 DTO에 일치하는 name을 안 넣고 파라미터를 넘길때엔 Controller에서 Map으로 받으면 된다.

DTO로 받고싶으면 DTO와 일치하는 name을 넣어주면 된다.