본문 바로가기
Web/Spring-Security

[Security] Spring Security (2)

by 희조당 2022. 10. 5.
728x90

✍️ 학습 목표

  • 의존성 추가
  • 사용자 설정
  • 권한 설정과 표현

📌 의존성 추가하기

🧷 Maven project - pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

🧷 Gradle project - build.gradle

implementation 'org.springframework.boot:spring-boot-starter-security'

스프링 시큐리티의 의존성을 추가하면 다음과 같은 기능을 사용할 수 있다.

  • 서버가 가동되면 스프링 시큐리티 초기화 작업과 웹 보안 설정이 이루어진다.
  • 모든 요청이 인증되어야 자원에 접근할 수 있다.
  • 인증 방식은 폼 로그인 방식과 httpBasic 로그인 방식을 제공한다.
  • 기본 로그인·로그아웃 페이지(+기본 계정)를 제공한다.

📌 사용자 정의 시큐리티 설정

의존성을 추가한 이후 SecurityConfig 설정 클래스를 만들어 추가적인 설정이 가능하다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {
   @Bean
   public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
      http
         .authorizeHttpRequests((authz) -> authz
            .anyRequest().authenticated()
         )
         .httpBasic(withDefaults());
      return http.build();
   }
}

22년부터 보안 설정이 변경되어 이전에 사용하던 WebSecurityConfigureAdapter를 상속한 뒤 configure 메서드를 오버라이딩하는 방식을 사용할 수 없게 되었다.

앞으로는 SecurityFilterChain을 빈으로 등록하는 방식을 사용해야 한다.


📌 권한 설정과 표현식

두 가지 방식으로 권한 설정을 할 수 있다.

 

🧷 선언적 방식

  • URL : http.antMatchers("/user/**").hasRole("ROLE_USER")
  • 메서드 : @PreAuthorize("hasRole('ROLE_USER')")

🧷 동적 방식 - DB 연동 프로그래밍

  • URL
  • 메서드
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
   http.authorizeRequests()
      .antMatchers("/user/**").authenticated()
      .antMatchers("/manager/**").access("hasAnyRole('ROLE_MANAGER','ROLE_ADMIN')")
      .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
      .anyRequest().permitAll();

   return http.build();
}

Authorize 순서는 정말 중요하다! 항상 좁은 범위에서 넓은 범위 순으로 설정돼야 한다.

🧷 표현식

 access(String ...)  표현식 결과에 따라 접근 허용
 hasRole(String ...)  해당 역할을 가지고 있다면 접근 허용
 hasAnyRole(String ..., String ...)  해당 역할 중 하나라도 가지고 있다면 접근 허용
 hasAuthority(String ...)  해당 권한을 가지고 있다면 접근 허용
 hasAnyAuthority(String ..., String ...)  해당 권한 중 하나라도 가지고 있다면 접근 허용
 hasIpAddress(String ...)  주어진 IP로부터 요청이 왔다면 접근 허용
 anonymous()  익명사용자의 접근 허용
 rememberMe()  rememberMe 인증을 통해 인증된 사용자의 접근 허용
 authenticated()  인증된 사용자의 접근 허용
 fullyAuthenticated()  인증된 사용자의 접근 허용, rememberMe 인증 제외
 permitAll()  무조건 접근 허용
 denyAll()  무조건 접근 불가

-Reference

https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5

 

 

댓글