[Spring] Spring Security 한글깨짐 문제

😵 Trouble

회원가입을 구현하던 중 닉네임을 DB에 저장할 때 한글이 깨지는 문제가 발생했다.
 
Encoding이 제대로 되지 않아 발생하는 오류라고 판단, 관련 사항들을 확인했다.
STS 설정, 설정파일의 인코딩 필터, JSP 파일 모두 문제가 없었다.
콘솔을 찍어보니 애초에 파라미터가 컨트롤러에 들어올 때부터 인코딩이 되지 않는다는 것을 확인했다.
 
모든 요청에 해당되는 문제인가 싶어 테스트를 해보았다.

<form action="${path }/test.do">
    <input type="text" name="text">
    <input type="submit">
</form>

text는 아주 잘 넘어왔다.
POST 방식일때도 마찬가지였다.
 
무엇이 문제인지 생각하던 중 csrf 토큰을 생성하기 위해 넣어주었던 코드가 생각났다.

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />

 
다시 코드를 넣어보니 아까처럼 한글 깨짐 현상이 발생했다😲

<form action="${path }/test.do">
    <input type="text" name="text">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    <input type="submit">
</form>

🔫 인코딩 필터

해당 프로젝트는 모든 인코딩을 UTF-8로 설정하기 위해 CharacterEncodingFilter를 등록했다.
그런데 SpringSecurityFilterChain은 ISO/IEC 8859-1 인코딩을 사용한다.
인코딩 필터보다 시큐리티 필터가 먼저 동작했고 그에 따라 UTF-8 인코딩이 이루어지지 않은 것이다.

그래서 두 필터를 함께 사용할 때에는 인코딩 필터가 시큐리티 필터보다 먼저 동작하도록 설계해야 한다.
따라서 web.xml에 인코딩 필터를 시큐리티 필터보다 먼저 작성해야 한다.
 
하지만 난 대부분의 xml 설정을 config 클래스로 변경해준 상태😮‍💨
AbstractSecurityWebApplicationInitializer을 구현해 시큐리티 필터를 직접 등록하지 않고 스프링에 의해 자동 등록되도록 만들었다.
 
이럴 때에는 시큐리티 설정 클래스의 configure()에서 인코딩을 설정해줄 수 있다.
addFilterBefore()을 통해 인코딩 필터가 먼저 동작하도록 설정했다.

public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
		filter.setEncoding("UTF-8");
		filter.setForceEncoding(true);
		http.addFilterBefore(filter, CsrfFilter.class);