사용자가 로그인하면:
username + password를 검증로그인이 성공하면 Spring Security가 사용자 정보를 세션이나 JWT 등에 저장함.
Spring Security에는 SecurityContext라는 공간이 있음. 여기서 인증된 사용자 정보(Authentication)를 저장.
예를 들어, 로그인 후엔 다음 구조과 같은 구조가 생김.
SecurityContext
└── Authentication
├── principal-> UserDetails 객체 (사용자 ID, 권한 등)
├── credentials-> 비밀번호 등 (보통 null)
├── authorities-> 권한 목록
principal이 현재 로그인한 사용자 정보@GetMapping("/me")public StringgetMyInfo(Authentication authentication) {UserDetailsuserDetails= (UserDetails) authentication.getPrincipal();
System.out.println("현재 로그인한 사용자 ID: " + userDetails.getUsername());return"ok";
}
또는 더 간단하게:
@GetMapping("/me")public StringgetMyInfo(@AuthenticationPrincipal UserDetails userDetails) {
System.out.println("현재 로그인한 사용자 ID: " + userDetails.getUsername());return"ok";
}
즉, 아이디 변경 API, 비밀번호 변경 API 등에서는 요청을 보낸 사람이 누구인지 Authentication이나 @AuthenticationPrincipal로 확인 가능.
로그인 후 JWT를 발급하면:
Authorization: Bearer <토큰> 추가결과적으로 JWT 방식이든 세션 방식이든, 컨트롤러에서는 항상 Authentication에서 로그인 사용자 정보를 꺼낼 수 있음.
API 예시:
@PutMapping("/user/username")public ResponseEntity<?> changeUsername(@RequestBody ChangeUsernameRequest req,@AuthenticationPrincipal UserDetails userDetails) {
userService.changeUsername(userDetails.getUsername(), req.getNewUsername());return ResponseEntity.ok().build();
}
정리하면:
Authentication 또는 @AuthenticationPrincipal로 로그인 사용자 확인