
MemberInitialize 파일이 test폴더 안에 있는거라 일반자바 실행하듯이 ctrl+F11 눌러서 실행
h2 켜져있어야함
엔티티매니저 어쩌고 오류 뜨는건 어플리케이션 프로퍼티 설정이 잘못된 경우가 많음
확인해보니 유알엘을 잘못입력해둠
쿠키는 저장방식, jwt는 토큰
Stateless 인증 (상태를 서버에 안 저장)
Authorization: Bearer ~ 헤더로 들고 다님Stateful 인증 (서버가 상태 기억)
세션 저장소(메모리, Redis 등)에 사용자 정보를 저장하고,👉 네, 맞아요. 세션도 처음엔 DB 조회해서 로그인 인증한 다음 세션을 만드는 거예요.
| 구분 | JWT | 쿠키+세션 |
|---|---|---|
| 상태 저장 | ❌ 서버가 기억 안 함 | ✅ 서버가 기억함 |
| DB 조회 | 로그인 시 한 번만 (보통) | 로그인 시 한 번 + 이후는 세션 기반 |
| 인증 처리 | 토큰 서명만 확인 | 세션 ID 보고 사용자 정보 꺼냄 |
| 로그아웃 처리 | 어려움 (블랙리스트 필요) | 세션 삭제로 간단 |
토큰덕에 필터는 다 통과했는데, 세션이없는상황이니 서버는 응답하고나서 디비에 불러온 데이터를 삭제했으니 로그인 안한유저라 판단하니 , 마지막 인가필터 앞에 얘가 로그인한 애라는걸 처리하는 작업이 필요.
네, 아주 중요한 포인트를 잘 짚었어요. 지금 말한 건 JWT 기반 인증 흐름에서 흔히 발생하는 오해 중 하나인데, 그걸 정확히 짚으셨어요. 정리해드릴게요.
UsernamePasswordAuthenticationFilter에서 토큰을 받아 인증하고JWT를 검증했다고 해서 자동으로 "로그인한 사용자"로 인식되는 게 아니에요.
명시적으로 SecurityContextHolder에 Authentication 객체를 넣어줘야 합니다.
JWTAuthorizationFilter)Authentication auth = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
이걸 해줘야 인가 필터들이 isAuthenticated()나 hasRole() 같은 조건을 만족할 수 있어요.
만약 이걸 안 해주면, 서버는 사용자가 인증됐다는 컨텍스트 정보가 없기 때문에,
Controller나 이후 인가 필터에서 "로그인하지 않은 사용자"로 판단합니다.
JWT를 헤더로 들고 와도, "누군지 모르는 놈이니까" 정보 제공 안 해주는 거죠.
| 순서 | 설명 |
|---|---|
| 1 | JWT를 헤더에서 꺼내고 |
| 2 | 서명 검증 + 유효시간 검증 |
| 3 | 토큰에 담긴 username 등으로 UserDetails 불러오기 |
| 4 | Authentication 객체 생성 |
| 5 | SecurityContextHolder.getContext().setAuthentication(...)로 저장 ← 이게 중요 |
| 6 | 이후 필터나 컨트롤러에서 "로그인한 사용자"로 인식됨 |
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
String header = request.getHeader("Authorization");
if (header == null || !header.startsWith("Bearer ")) {
chain.doFilter(request, response);
return;
}
String token = header.replace("Bearer ", "");
String username = JWT.require(Algorithm.HMAC256(secretKey))
.build()
.verify(token)
.getClaim("username")
.asString();
if (username != null) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
Authentication auth = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
필터는 통과했지만 SecurityContext에 아무 정보도 안 들어가 있으면,
세션이 없기 때문에 "로그인한 사용자" 상태로 인식되지 않습니다.
이게 JWT 인증의 핵심 함정 포인트예요.
인가 필터 생성 확인

매니저 jwt 복사해서 헤더에 넣고 겟으로 호출
매니저로그인성공, 매니저권한 인가 성공
