🚨 1. 오류 원인 #1 — 쿠키 기반 인증 적용 시 로그인 실패 & 홈 화면으로만 리다이렉트되는 문제
📌 문제 상황
원래는 sessionStorage 에 저장된 값(토큰/username 등)을 기반으로 로그인 여부를 판단하고 있었음.
그러나 백엔드에서 OAuth2 성공 후
➡ 쿠키(HttpOnly) 로 토큰을 전달하는 방식으로 바꾸면서
프론트는 sessionStorage만 보고 있었기 때문에:
쿠키에는 토큰이 있음
sessionStorage에는 없음
→ 프론트는 “로그인 안 됨”으로 판단함
→ 홈 화면으로 계속 리다이렉트되는 현상 발생
📌 원인 정리
“백엔드는 쿠키 기반 인증으로 변경했는데, 프론트는 여전히 sessionStorage 기준으로 인증 상태를 판단한 것”
즉, 백과 프론트의 인증 저장 방식 불일치가 원인.
📌 발생 조건
OAuth2 로그인 성공 후 토큰을 쿠키에 저장하는 구조로 전환
프론트는 sessionStorage만 검사
/api/me 호출 또는 쿠키 기반 인증 검증 로직이 없었음
📌 해결 방법
프론트는 쿠키 기반 인증 방식으로 업데이트
로그인 여부를 판단할 때 sessionStorage 대신
→ /api/me 호출
혹은
→ 쿠키를 포함한 axios 요청(withCredentials: true) 사용
로컬 로그인도 동일하게
쿠키 세팅 유지
인증 검증은 동일하게 /api/me에서 처리
백엔드: OAuth2SuccessHandler → redirect 유지
프론트: sessionStorage 기반 인증 제거
📌 정리 문장(벨로그용)
“쿠키 기반 인증을 도입했지만 프론트가 계속 sessionStorage를 기준으로 로그인 여부를 판단하고 있었기 때문에 인증이 정상적으로 완료되어도 로그인 처리되지 않고 홈 화면으로만 리다이렉트되는 문제가 발생했다. 이는 인증 저장 방식 불일치에서 기인한 문제였다.”
🚨 2. 오류 원인 #2 — Ban 처리 시 특정 경우 로그인되는 문제 (Local/OAuth2 처리 불일치)
📌 문제 상황
Ban된 사용자라면:
로컬 로그인 → 403 Forbidden
OAuth2 로그인 → redirect + error=banned_user
이렇게 모두 막혀야 정상이다.
하지만 실제로는 다음 현상이 발생함:
로컬 로그인에서는 정상적으로 ban 처리됨
OAuth2(구글) 로그인에서는 ban 사용자가 로그인 성공처럼 동작
또는 그 반대로 OAuth2에서는 막히지만 로컬에서는 토큰 발급됨
즉, 둘 중 하나의 ban 처리 로직이 씹혀서 적용되지 않는 문제
📌 원인 정리
Ban 검사가 다음 3곳에 분산되어 있었기 때문:
UserDetailsService (로컬 로그인)
OAuth2SuccessHandler
JwtAuthenticationFilter
이 세 곳에서 ban 체크 기준이 다르고 처리 방식도 달랐음.
그 결과:
OAuth2에서는 redirect만 이루어지고 ban 체크 누락
JwtAuthenticationFilter에서는 ban 여부 확인하지 않음
UserDetailsService는 로컬 로그인에서만 동작
➡ 결국 ban 사용자라도 로그인 성공 처리되는 시나리오가 발생했다.
📌 발생 조건
OAuth2SuccessHandler에서 ban 체크가 빠진 상태
JWT 인증 필터가 ban 토큰을 검증하지 않음
UserDetailsService는 로컬 로그인만 커버
→ 세 로직이 “각자 따로 놀면서” 누락 발생
📌 해결 방법
해결 핵심 포인트는 “ban 처리를 모든 인증 경로에서 일관되게 적용하는 것”
Local 로그인 (UserDetailsService)
ban → 403 banned_user JSON 응답
OAuth2 로그인 (CustomSuccessHandler)
ban → sendRedirect(...?error=banned_user)
JWT 인증 (JwtAuthenticationFilter)
ban 사용자의 토큰 → 403 banned_user
프론트는 local/OAuth2 모두 같은 방식으로 경고
axios catch에서 403 처리
OAuth2 redirect param 확인
📌 정리 문장(벨로그용)
“Ban 처리가 UserDetailsService, OAuth2SuccessHandler, JwtAuthenticationFilter로 분산되어 있었고, 각각의 로직이 일관되지 않아 특정 경우에는 ban된 사용자도 로그인되는 문제가 발생했다. 이를 모든 인증 경로(Local/OAuth2/JWT)에 대해 동일한 기준으로 ban 검증 로직을 통일함으로써 해결하였다.”
✨ 최종 — 벨로그에 두 오류를 나누어 설명할 때의 추천 구조
(설명 + 원인 + 해결 + 정리문장)
(설명 + 원인 + 해결 + 정리문장)
두 문제는 모두 "백/프론트 인증 흐름의 불일치"와
"ban 처리 책임이 분산된 구조"에서 비롯되었으며
리팩토링 후 인증 경로를 일원화함으로써 해결되었다.