일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 객체지향
- Baekjoon
- til
- parametric search
- 일정 관리
- binary search
- 누적합
- File
- 프로그래머스
- Generics
- 브루트포스
- 백준
- ES
- 해시
- querydsl
- 계산기 만들기
- 구현
- 알고리즘
- 코딩테스트
- Algorithm
- 이분 탐색
- 완전탐색
- 내일배움캠프
- BFS
- 이분탐색
- Java
- Spring
- programmers
- Elasticsearch
- SpringBoot
- Today
- Total
개발하는 햄팡이
[Trouble Shooting] H2 콘솔 접근 실패. Whitelabel. FilterConfig 본문
문제 상황
저번주에 2주동안 진행하는 개인 프로젝트를 진행중에 테스트를 위해 h2 콘솔에 접근하려고 하는 상황이었다.
원래 따로 설정을 하지 않으면 http://localhost:8080/h2-console 로 접근할 수 있다고 알고 있는데 해당 경로로 접근할 수 없었다.
아얘 접속 화면 조차 뜨지 않는 상황..
시작할때 로그도 해당 경로로 접근하면 된다는 로그를 봤는데...
해당 프로젝트는 내가 처음부터 만든 프로젝트가 아니라 이미 만들어진 프로젝트를 리팩토링 하고 개선하는 프로젝트라서
구조를 잘 모르는 상태였다.
해결 과정
인터넷에서 검색하여 h2 콘솔 접근 시 whitelabel error를 검색했더니
application.properties에 아래 설정을 입력해주면 된다고 하여 해당 코드도 넣어줬다.
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
쓰면서 의아했던게 저 설정이 default던데...
생각했는데
역시나 해결되지 않음..
그래서 gpt의 힘을 빌렸는데 Spring Security가 적용되어 있을 경우 접근이 불가능한 경우가 있다고 한다.
도전 과제가 Spring Security적용하기라서 -> 아직 적용이 안됐으니 문제 없을 것이라고 생각.
그래서 한참을 헤매다가
Spring Security는 사용하지 않지만 JWT를 사용한다는 것을 인지하고 FilterConfig & JWTFilter 파일로 이동.
모든 경로에 대해서 Filter를 적용하고 있었다.
뭔가 이 부분에서 로그인 하지 않고 접근하려고 하여 문제가 생긴 것 같아 dofilter메소드 쪽에서 해당 경로를 스킵하는 코드를 넣어줬더니 해결됐다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String url = httpRequest.getRequestURI();
if (url.startsWith("/auth") || url.startsWith("/h2-console")) {
chain.doFilter(request, response);
return;
}
....
}
그런데 경로를 저기에 넣어주니 뭔가...
아얘 JWTFilter안으로 들어가지 않았으면 하는 생각이 들었다.
아래처럼 생긴 Config 파일이 있는데 이 부분에서 Spring Security처럼 경로 제외 같은 메소드를 사용할 수 있지 않을까 했는데
그런 메소드는 없는 것 같다..
(혹시 누군가 이 글을 보고 그런 역할을 하는 메소드가 있다면 댓글로 알려주세요)
@Configuration
@RequiredArgsConstructor
public class FilterConfig {
private final JwtUtil jwtUtil;
@Bean
public FilterRegistrationBean<JwtFilter> jwtFilter() {
FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new JwtFilter(jwtUtil));
registrationBean.addUrlPatterns("/*"); // 필터를 적용할 URL 패턴을 지정합니다.
return registrationBean;
}
}
그리고 여기서 알게된 url경로를 /api/어쩌구 로 하는 이유..!
이런 api 자체가 아닌 경우, 즉 인증을 해야하는지 아닌지를 검증하는 api 자체가 아닌 경우 ex)h2 console, swagger
나처럼 filter 안으로 아얘 들어오지 않도록 하고 싶으면
setFilter를 "/api/*" 로 설정해서 api 메소드만 filter를 적용하도록 할 수 있는데
현재 이 프로젝트는 그냥 바로 /auth, /user 이런식으로 되어있어서 저렇게 설정해줄 수가 없다...
사소한 부분이기 때문에 그냥 filter안에서 분기해주는 방식으로 해결하고 넘어갔지만
이게 중요한 문제로 대두되어 전체 controller를 바꿔야된다고 생각하면 좀 귀찮다....
뭐 어쨌든 원하는 문제는 해결!