
jakarta.servlet.ServletException: Request processing failed: java.lang.NumberFormatException: For input string: "anonymousUser"
처음에는 당연히 오류코드를 파악하고 해당 log를 찾아보았다.
그때 필터에서 오류가 나는 것을 확인하였고 그때는 이해를 하지 못했다.
하지만 코드를 계속 찬찬히 보고있는데 왜 anonymous가 NumberException이 나는지를 도무지 이해를 못했다.
일일히 sout을 찍어서 검사를 하려고 했지만 방법을 찾았다.
필터에서 시큐리티 자체에서 로그인 인증정보가 없는 경우에 anonymous로 값을 반환하는데
현재 구현은 카카오 식별자를 id값으로 쓰고 있고 이 값을 인증정보에 넣어두었다.
이 값은 시큐리티에서 String으로 기본적으로 반환을 해주기 때문에 Long 타입으로 다시 한번 매핑한다.
그런데 이때 인증정보가 없으면 anonymous가 반환되는데 이걸 Long으로 매핑하려고해서 오류가 발생하는 것 같다.
→ 전부 폭파...
위와 같이 오류 파악을 처리하고 전부 처리를 했는데 문제점은 지금 token 값 자체가 null로 들어오는 것이었다.
브라우저 쿠키에는 현재 값이 심기지만 request에서 cookie를 출력해도 비어있었다.
문제는 CORS 오류였다.
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("http://localhost:5173");
configuration.addAllowedMethod("*");
configuration.addAllowedHeader("*");
configuration.setAllowCredentials(true); // Credentials 추가
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
기존의 로직에서 Credentials을 설정해주면 된다.
참고로 addAllowedOrigin(”*”)으로 설정하면 안된다.
CORS는 응답이 Access-Control-Allow-Credentials(true)를 가질 경우 addAllowedOrigin(”*”)을 막고 있다.
CSRF 공격에 취약해지기 때문에 그에 따른 보안 처리를 Spring 자체에서 하는 것 같다.
나의 구현 방식의 경우 보통 로그인을 구현할 때 서버단에서 클라이언트에게 Header에 Token을 실어서 보내준다.
그리고 클라이언트에서 서버로 어떠한 요청을 할 때 Header에 Token을 실어서 보내고 이를 통해 검증을 한다.
나는 네이버 부스트캠프를 진행하면서 이렇게 처리를 할 때 쿠키에 토큰을 보내면서 httponly=true, secure 등의 설정을 내가 할 수가 없어서 보안적으로 좋지 않을 거라고 생각했고 그때처럼 똑같이 구현을 하였다.
Token을 서버단에서 직접 브라우저 쿠키에 심어주고 클라이언트에게는 아무 역할을 주지 않는 것이다.
이렇게 했을 때 내가 생각하는 장점은 위에서 말한 보안적인 요소를 추가할 수 있으며, 클라이언트도 요청을 할 때 일일히 Bearer token을 보내주지 않아도 된다고 생각한다.
이 방식이 정말 효율적인 방법인지, 내가 모르는 큰 하자가 있는지는 아직 잘 모르겠고 나는 이렇게 구현하고 있다.
보통 대부분의 사람들은 헤더를 통해서 검증을 하기 때문에 이번 Spring으로 처음 프로젝트를 진행하는 내가 참고한 수많은 코드에서 Credentials를 추가한 코드는 볼 수가 없었다.
그래서 나도 새까맣게 잊고 CORS 처리할 때 저 부분은 빼고 작성했다..
NestJS로 프로젝트를 진행할 때 한번 겪었던 CORS 오류인데 오류코드가 CORS가 아니라 전혀 다른 NumberException으로 나와서 삽질을 진짜 엄청했다.
그때가 다시 한번 생각나서 이미 한번 맞았는데도 또 맞은게 한탄스럽다…
Credential을 생각지도 못해서,,
처음 SecurityConfig 파일을 작성할 때 CORS 설정을 하였고, 오류코드에서도 나오지 않아서 이게 문제인지 몰랐다.
꼭 기억하자.
→ 추가적으로 Vscode로 프론트엔드를 직접 열어서 테스트했는데 yarn berry 사용법을 몰라서 이미 해결했는데도 오류가 계속 떠서 삽질했다..
제대로 install 하고 나니까 바로 해결..