현 문제를 발견하게 된 경위는 다른 pc에서는 로그인이 가능하였지만 특정 pc “1개” 로그인이 안되는 현상을 발견 하여 해당 문제를 파악하였다
초기에 문제를 해결하기 위해 서버가 실행 되고 있는 터미널을 확인 해당 pc에서 로그인을 요청시 아래 내용이 출력이 되는 모습을 확인 가능하였다
2025-08-22T10:49:30.579+09:00 WARN 14004 --- [nio-8080-exec-6] c.e.b.security.JwtAuthenticationFilter : Authorization 헤더 없거나 Bearer 토큰 아님, 쿠키에서 토큰 검사 시도 2025-08-22T10:49:30.579+09:00 WARN 14004 --- [nio-8080-exec-6] c.e.b.security.JwtAuthenticationFilter : 토큰을 찾지 못함, 인증 실패 처리
처음 터미널을 확인하고 브라우저 콘솔을 확인하는 과정에서 해당 콘솔 에러를 확인 하였다
PostsPanel.js:115 AxiosError {message: 'Request failed with status code 401', name: 'AxiosError', code: 'ERR_BAD_REQUEST', config: {…}, request: XMLHttpRequest, …} code : "ERR_BAD_REQUEST" config : {transitional: {…}, adapter: Array(3), transformRequest: Array(1), transformResponse: Array(1), timeout: 0, …} message : "Request failed with status code 401" name : "AxiosError" request : XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …} response : {data: '', status: 401, statusText: '', headers: AxiosHeaders, config: {…}, …} status : 401 stack : "AxiosError: Request failed with status code 401\n at settle (http://localhost:3000/static/js/bundle.js:48905:12)\n at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:47529:66)\n at Axios.request (http://localhost:3000/static/js/bundle.js:48028:41)\n at async getAllPosts (http://localhost:3000/static/js/bundle.js:139988:15)\n at async fetch (http://localhost:3000/static/js/bundle.js:138984:20)" [[Prototype]] : Error
해당 에러가 처음에는 Cors error인 줄 알고 백엔드에서 Cors 요청이 허용이 안되어 있는 줄 알았지만 해당 코드를 확인한 결과 요청은 정상적으로 돌아가는 로직이라는 걸 확인 가능하였다 그러하여 개발자 모드에서 확인 가능한 네트워크 리퀘스트를 확인해보니 요청 헤더에서 Authorization 해당 부분을 받지 못하고 있다는 걸 확인하였습니다 왜 이런 error가 생겼는지 생각해 보니 해당 pc를 제외한 나머지 pc는 기존에 로그인 기록이 남아있어서 해당 아이디에 토큰이 만료가 되어있는 토큰이어도 로그인이 가능했었다 그래서 해당 문제를 해결하기 위해 백엔드 코드에서 SecurityConfig.java 와 JwtAuthenticationFilter.java 해당 부분을
/api/auth/login
)
Authorization
헤더 없이도 정상 통과 (필터 스킵) → 컨트롤러까지 도달Authorization: Bearer <token>
있으면 jwtUtil.validateToken()
통과 시 200OPTIONS
는 shouldNotFilter
로 스킵 → 프리플라이트 원활jwt
라는 이름의 쿠키에 토큰을 둔 경우도 인식(현재 코드 그대로 유지)만약 화이트리스트에 더 열어야 할 경로가 있으면 EXCLUDE_PATTERNS에 추가만 하면 됩니다.
(패턴 매칭 지원하니
/public/**
같은 식으로도 가능)
해당 형식으로 변경하니 정상 로그인이 가능했다 요약하면
/api/auth/login
)도 예외가 아니었음 → Authorization 헤더 없이 로그인 시도하면 401.shouldNotFilter
*를 넣었어요.
OPTIONS
(프리플라이트)와 /api/auth/login
, /api/auth/register
, 등 예외 경로는 필터 자체를 스킵.