인가

특정한 경로에 요청이 오면 Controller 클래스에 도달하기 전 필터에서 Spring Security가 검증을 한다.

  1. 해당 경로의 접근은 누구에게 열려 있는지
  2. 로그인이 완료된 사용자인지
  3. 해당되는 role을 가지고 있는지

Security Configuration

인가 설정을 진행하는 클래스

package com.gdy.springsecurity.Config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration //confinguration 컨테이너로 등록
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

        http.authorizeHttpRequests((auth) -> auth
                .requestMatchers("/", "/login").permitAll() //루트 경로에서 작업 진행
                .requestMatchers("/admin").hasRole("ADMIN")
                .requestMatchers("/my/**").hasAnyRole("ADMIN","USER")
                .anyRequest().authenticated()//위에서 처리하지 못한 경로들 처리하는 메소드
                );


        return http.build();
    }
}

HttpSecurity 설정

Spring Security의 각종 설정은 HttpSecurity로 대부분 하게 된다.

  1. 리소스(URL) 접근 권한 설정
  2. 인증 전체 흐름에 필요한 Login, Logout 페이지 인증 완료 후 페이지 인증 실패 시 이동페이지 등등 설정
  3. 인증 로직을 커스텀하기 위한 커스텀 필터 설정
  4. 기타 csrf, 강제 https 호출 등등 거의 모든 Spring Security의 설정을 담당

requestMatchers

requestMatchers("/", "/login"))

 

특정 리소스에 대해서 권한을 설정한다.

permitAll()

requestMatchers("/", "/login").permitAll()

모든 사용자에 대해 접근을 허용하는 데 사용된다.

보통은 특정한 리소스에 대해 인증을 요구하지 않을 때 사용된다.

 

 

hasAnyRole

requestMatchers("/admin").hasRole("ADMIN")

사용자가 여러 역할 중 하나 이상을 가지고 있는지 확인하는 데 사용된다.

 

 

hasRole

사용자가 특정 역할(role)을 가지고 있는지 확인하는 데 사용된다.

 

hasAuthority

사용자가 특정 권한(authority)을 가지고 있는지 확인하는 데 사용한다.

Role과 유사하지만, 권한은 더 세부적인 접근 권한을 나타낸다.

 

hasAnyAuthority

사용자가 여러 권한 중 하나 이상을 가지고 있는지 확인하는 데 사용된다.

 

authenticated

사용자가 인증되었는지 확인하는 데 사용된다.

 

anonymous

사용자가 익명 사용자(로그인되지 않은 사용자)인지 확인하는데 사용된다.

 

denyAll

모든 사용자에 대해 접근을 거부하는 데 사용된다.

 

fullAuthenticated

사용자가 완전히 인증되었는지 확인하는 데 사용된다.

ex) 2단계 인증을 통해 인증된 경우