Principal
은 현재 인증된 사용자를 나타내는 객체로, 주로 보안 관련 애플리케이션에서 사용됩니다. Spring Security에서는 Principal
객체를 사용하여 현재 요청을 수행하는 사용자의 정보를 접근할 수 있습니다.
Principal
객체는 로그인한 사용자의 인증된 정보를 제공합니다. 보통 Authentication
객체가 Principal
역할을 하며, 사용자 이름, 권한 등을 포함하고 있습니다.@AuthenticationPrincipal
어노테이션이나 SecurityContextHolder
를 통해 접근할 수 있습니다.@Controller
public class UserController {
@GetMapping("/user")
public String getUserInfo(@AuthenticationPrincipal Principal principal) {
// principal을 통해 현재 사용자 정보에 접근
System.out.println("현재 사용자: " + principal.getName());
return "userPage";
}
}
위 코드에서는 Principal
객체를 통해 현재 로그인한 사용자의 이름을 출력하고 있습니다.
@EnableMethodSecurity
는 Spring Security에서 메소드 레벨 보안을 활성화하는 어노테이션입니다. 이 어노테이션을 활성화하면 메소드 실행 전후에 보안 관련 처리를 할 수 있습니다.
prePostEnabled = true
: 이 설정을 활성화하면 @PreAuthorize
와 @PostAuthorize
어노테이션을 사용할 수 있게 됩니다. @PreAuthorize
는 메소드 실행 전에 권한을 확인하고, @PostAuthorize
는 메소드 실행 후 결과를 확인하는데 사용됩니다.@EnableMethodSecurity(prePostEnabled = true)
@Configuration
public class SecurityConfig {
// 이곳에서 메소드 레벨 보안 설정
}
@EnableMethodSecurity
를 설정한 후, 다음과 같은 방식으로 메소드 수준 보안을 적용할 수 있습니다.
@PreAuthorize
어노테이션은 메소드 실행 전에 권한 검사를 할 수 있게 해줍니다. 이 어노테이션을 사용하면 해당 메소드가 실행되기 전에 특정 조건이 충족되었는지 확인할 수 있습니다.
@PreAuthorize("isAuthenticated()")
: 이 조건은 사용자가 인증된 사용자인지 확인합니다. 즉, 로그인이 된 상태에서만 해당 메소드가 실행될 수 있습니다.isAuthenticated()
: Spring Security에서 제공하는 표현식으로, 사용자가 인증된 상태인지 여부를 확인합니다. 인증되지 않은 사용자가 접근할 경우 예외가 발생합니다.@PreAuthorize("isAuthenticated()")
@GetMapping("/secure")
public String getSecurePage() {
return "securePage";
}
위 코드에서 @PreAuthorize("isAuthenticated()")
는 해당 메소드가 인증된 사용자만 접근할 수 있도록 제한합니다. 인증되지 않은 사용자가 접근하려고 하면 액세스가 거부됩니다.
Principal
은 현재 인증된 사용자의 정보를 나타내며, 주로 @AuthenticationPrincipal
을 통해 사용합니다. 이 객체는 메소드 내에서 현재 사용자의 인증 정보를 쉽게 가져오는 데 사용됩니다.
@EnableMethodSecurity(prePostEnabled = true)
은 메소드 수준에서 보안을 활성화합니다. 이를 통해 @PreAuthorize
나 @PostAuthorize
를 사용하여 메소드 실행 전후에 인증 및 권한 체크를 추가할 수 있습니다.
@PreAuthorize("isAuthenticated()")
는 메소드가 실행되기 전에 인증된 사용자만 접근할 수 있도록 보안을 설정합니다. 이 어노테이션은 @EnableMethodSecurity(prePostEnabled = true)
와 함께 사용되어 메소드에 대한 세밀한 보안을 설정할 수 있게 해줍니다.
@PreAuthorize
와 권한에 따른 접근 제어:
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String getAdminPage() {
return "adminPage";
}
위 코드는 ADMIN
역할을 가진 사용자만 /admin
페이지에 접근할 수 있게 합니다.
@PreAuthorize
와 사용자 이름을 통한 접근 제어:
@PreAuthorize("principal.username == #username")
@GetMapping("/user/{username}")
public String getUserPage(@PathVariable String username) {
return "userPage";
}
위 코드에서는 URL 경로에 포함된 username
이 현재 인증된 사용자의 username
과 같을 때만 해당 메소드가 실행될 수 있습니다.
Principal
: 현재 인증된 사용자의 정보를 나타내는 객체.@EnableMethodSecurity(prePostEnabled = true)
: 메소드 레벨 보안을 활성화하는 설정.@PreAuthorize("isAuthenticated()")
: 메소드 실행 전에 인증된 사용자만 접근할 수 있도록 설정하는 어노테이션.이 모든 기능은 Spring Security를 사용하여 애플리케이션 내에서 세밀한 보안 제어를 구현할 수 있도록 돕습니다.