SpringBoot Security 인코딩 문제 해결 방법

문제

  • successhandler 또는 failurehandler 또는 deniedhandler 에 걸쳐서 한글 데이터를 response 할 시 참고 하시기 바랍니다.  
  • 한글이 나와야 하는 부분에 ??? 로 처리가 되고 있다면 해당 글을 보고 처리 해보시길 바랍니다. 

Form 형식 Post - redirect시 한글 깨짐 문제 해결방법

 

  • AuthenticationFailureHandler에서 error에 대한 메세지를 경우에 따라 적용하였는데, 해당 값이 URL 파라미터 값으로 넘어 가면 한글이 ???? 처리가 되었음.
  • 해당 부분을 처리 하기위해 URLEncoder클래스의 encode 메소드를 사용하여 처리를 하였음.

 

@Component
public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {

        String errorMassage = "";

        if(exception instanceof BadCredentialsException) {
            errorMassage = "아이디와비밀번호가틀립니다.";

        } else if (exception instanceof InsufficientAuthenticationException) {
            errorMassage = "인증되지 않은 경로로 접근하였습니다.";
        }
		
        //URL엔코더를 하여 스트링 문자열이 ??? 롤 나오는 문제 해결함. 
        String encode = URLEncoder.encode(errorMassage, "UTF-8");
        setDefaultFailureUrl("/login?error=true&exception=" + encode);

        super.onAuthenticationFailure(request, response, exception);
    }
}

JWT 형식 POST - Response 시 한글 깨짐 문제

 

  • URL로 API를 요청시 값들에 있는 한글들이 ??? 로 표시되는 문제가 생김. 
  • 특히나 Security내에서 생긴 문제로 어떻게 해결해 나가야 하는지 고민 하다가 Response에 Header를 추가하는 메소드를 발견하여 아래와 같이 입력하니 문제가 해결됨. 

 

public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    private ObjectMapper ObjectMapper = new ObjectMapper();

    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {


        User user = (User) authentication.getPrincipal();

        httpServletResponse.setStatus(HttpStatus.OK.value());
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
        // 헤더에 charset 타입 추가로 인해 인코딩 문제를 해결함
        httpServletResponse.addHeader("Content-Type", "application/json; charset=UTF-8");

        ObjectMapper.writeValue(httpServletResponse.getWriter(), user);
    }
}