[Spring Boot] Spring Security - 2

handa·2024년 12월 23일
0
post-thumbnail

1. @EnableWebSecurity

  • 역할 : Spring Security를 활성화하고 사용자 정의 보안 구성을 적용하기 위한 어노테이션입니다.
  • 적용 위치 : 보안 설정 클래스에 사용.
  • 주요 특징
    • WebSecurityConfigurerAdapter 또는 SecurityFilterChain 과 함께 사용됩니다.
    • Spring Boot 애플리케이션에서는 자동으로 활성화되지만, 사용자 정의 보안 설정이 필요하면 명시적으로 선언해야 합니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}

2. @PreAuthorize

  • 역할 : 메소드 실행 전에 접근 권한을 확인합니다.
  • 적용 위치 : 메소드 수준에서 사용.
  • 주요 특징
    • SpEL(Spring Expression Language)을 사용하여 복잡한 권한 조건을 정의할 수 있습니다.
    • 조건이 만족되지 않으면 예외를 발생시킵니다.
@Service
public class MyService {

    @PreAuthorize("hasRole('ADMIN')")
    public void adminOnlyMethod() {
        // ADMIN 역할만 접근 가능
    }

    @PreAuthorize("#username == authentication.name")
    public void userSpecificMethod(String username) {
        // 현재 인증된 사용자만 자신의 데이터에 접근 가능
    }
}

3. @PostAuthorize

  • 역할 : 메소드 실행 후 결과를 기반으로 권한을 확인합니다.
  • 적용 위치 : 메소드 수준에서 사용.
  • 주요 특징
    • 메소드의 반환값을 평가하여 접근 권한을 결정합니다.
    • 실행 결과를 필터링하거나 검증할 때 유용합니다.
@PostAuthorize("returnObject.owner == authentication.name")
public MyEntity findById(Long id) {
    // 반환된 엔티티의 소유자가 현재 사용자와 같아야 접근 가능
    return myEntityRepository.findById(id);
}

4. @Secured

  • 역할 : 특정 권한(역할)을 가진 사용자만 메소드에 접근할 수 있도록 제한합니다.
  • 적용 위치 : 메소드 수준에서 사용.
  • 주요 특징
    • 단순한 역할 기반 접근 제어에 사용됩니다.
    • @Secured 는 SpEL을 지원하지 않으며, 역할을 문자열 배열로 지정해야 합니다.
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public void securedMethod() {
    // ADMIN 또는 USER 역할만 접근 가능
}

5. @RolesAllowed

  • 역할 : Java EE 표준 방식으로 역할 기반 접근 제어를 수행합니다.
  • 적용 위치 : 메소드 수준에서 사용.
  • 주요 특징
    • @Secured와 비슷하지만 Java EE 표준을 따릅니다.
@RolesAllowed("ROLE_ADMIN")
public void adminMethod() {
    // ADMIN 역할만 접근 가능
}

6. @AuthenticationPrincipal

  • 역할 : 현재 인증된 사용자 정보를 메소드 매개변수로 주입합니다.
  • 적용 위치 : 컨트롤러나 서비스 메소드의 매개변수.
  • 주요 특징
    • SecurityContext에서 인증 정보를 가져옵니다.
    • 사용자 정의 UserDetails 객체를 사용할 때 유용합니다.
@GetMapping("/user")
public String getUserInfo(@AuthenticationPrincipal UserDetails userDetails) {
    return "Current user: " + userDetails.getUsername();
}

7. @EnableGlobalMethodSecurity

  • 역할 : 메소드 수준에서 보안 어노테이션을 활성화합니다.
  • 적용 위치 : 보안 설정 클래스에 사용.
  • 주요 특징
    • @PreAuthorize, @PostAuthorize, @Secured 등의 어노테이션을 사용하려면 이 어노테이션이 필요합니다.
    • 속성
      • prePostEnabled : @PreAuthorize@PostAuthorize 를 활성화 (기본값: false)
      • securedEnabled : @Secured 를 활성화 (기본값: false)
      • jsr250Enabled : @RolesAllowed를 활성화 (기본값: false)
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MethodSecurityConfig extends WebSecurityConfigurerAdapter {
    // 메소드 보안 설정 활성화
}

8. @WithMockUser

  • 역할 : 테스트 환경에서 인증된 사용자로 동작하도록 설정합니다.
  • 적용 위치 : JUnit 테스트 메소드.
  • 주요 특징
    • Mock 사용자 정보를 테스트 환경에서 간편하게 설정할 수 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {

    @Autowired
    private MyService myService;

    @Test
    @WithMockUser(username = "testuser", roles = {"USER"})
    public void testMethod() {
        myService.userSpecificMethod("testuser");
    }
}

profile
진짜 해보자

0개의 댓글