728x90
반응형
무엇이 다른가?
1) principal(주체)
- 위: getAuthentication() 안에서→ principal = UserDetails(여기에 email, 이름, 상태, 권한 포함)
UserDetails ud = customUserDetailsService.loadUserByUsername(userId);
return new UsernamePasswordAuthenticationToken(ud, "", ud.getAuthorities());
- 아래:→ principal = 문자열 mbrId (부가 정보/권한 없음)
new UsernamePasswordAuthenticationToken(mbrId, null, List.of())
2) authorities(권한)
- 위: ud.getAuthorities() → ROLE_ADMIN, ROLE_USER 등 실제 권한이 들어감
- 아래: List.of() → 빈 권한 (역할 체크가 걸린 API/메서드는 403 날 수 있음)
3) 보안/동작 영향
- @PreAuthorize("hasRole('ADMIN')") 같은 체크:
- 위: 정상 동작
- 아래: 실패(권한 없음)
- @AuthenticationPrincipal 사용:
- 위: 커스텀 UserDetails 바로 주입 가능
- 아래: 문자열 mbrId만 들어와서 캐스팅/추가 조회가 필요
- 계정 상태(잠김/만료) 점검:
- 위: UserDetailsService 단계에서 검증
- 아래: 우회됨
4) isAuthenticated 플래그
- 세 번째 인자(권한 콜렉션)를 주는 생성자를 쓰면 isAuthenticated=true가 됩니다.
아래 코드는 권한이 비어도 인증된 것으로 표시되지만, 권한 체크는 계속 실패합니다.
권장 패턴
가능하면 항상 위 패턴(토큰 → userId 추출 → UserDetails 로드 → 권한 포함한 UsernamePasswordAuthenticationToken)을 쓰세요.
String userId = jwtProvider.getMbrId(token);
UserDetails user = customUserDetailsService.loadUserByUsername(userId);
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
// 선택: 요청 메타 정보 세팅
auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(auth);
참고: Spring Security 최신 스택(JWT 리소스 서버)을 쓰면 JwtAuthenticationToken/BearerTokenAuthentication 같은 표준 토큰을 사용할 수도 있습니다. 커스텀 구현이라도 principal=UserDetails, authorities=실권한을 채우는 습관이 핵심이에요.
한 줄 요약
- 같은 타입 계열이지만 동일하지 않습니다.
- 아래 코드는 “아이디만 있는 얇은 인증”, 위 코드는 “권한까지 갖춘 완전한 인증”.
- 권한 체크/주입 편의성 때문에 위 방식을 사용하세요.
728x90
반응형
'개발 > spring boot' 카테고리의 다른 글
| (Spring) sso 외부 인증 토큰을 검증하고 세션에 사용자 정보를 저장하는 흐름 (0) | 2026.01.07 |
|---|---|
| resolveLocale(req)가 하는 일 - 이 요청의 언어/국가(locale)를 어떻게 정할까? (0) | 2025.10.15 |
| Spring Boot와 React 프로젝트를 하나로 합쳐서 개발하고 배포 (2) | 2025.07.26 |
| controller에서 URL 패턴 매칭 순서는 가장 구체적인(specific) 패턴이 먼저 매칭 (0) | 2025.04.16 |
| 스프링에서 리플렉션을 이용한 빈(Bean) 생성 및 의존성 주입: 원리와 동작 방식 정리 (0) | 2025.04.16 |