🔥스파르타 TIL (Spring)

Spring Security 란?

승승장규 2025. 2. 10. 11:40

스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크이다.
필터 기반으로 동작하기 때문에 스프링 MVC와 분리되어 관리 및 동작한다.

 

  • Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다. 이때 DispatcherServlet 이전 단계가 필터이다.
  • Spring Security는 FilterChainProxy를 통해서 상세로직을 구현하고 있다.

필터(Filter) 란?

 

필터(Filter) 란?

웹 애플리케이션에서 관리되는 영역으로 클라이언트에서 오는 요청과 응답에 대해서 최초, 최종 단계에 위치한다.요청과 응답에 정보를 변경하거나 부가적인 기능을 추가할 수 있다. ex) Logging,

seungg8361.tistory.com

 

 

build.gradle

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

 

Spring Security 설정 클래스 ▼

CSRF (Cross-Site Request Forgery) :

  • 공격자가 사용자의 인증 정보를 악용하여 사용자가 의도하지 않은 악성 요청을 보낼 수 있도록 하는 공격
  • ex) 사용자가 은행 사이트에 로그인한 상태에서 공격자가 만든 악성 웹 페이지를 방문하게 되면, 그 페이지에서 은행 웹사이트로 사용자의 권한을 이용해 악의적인 거래를 발생시킬 수 있다.
  • Spring Security에서 기본적으로 제공하는 기능이지만 현재는 비활성화시켜 놓았다.
// 클래스가 하나 이상의 @Bean 메서드를 제공하고, 해당 클래스가 애플리케이션 컨텍스트의 설정 클래스임을 알려줌
@Configuration // 빈을 수동으로 등록
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig{
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
        // CSRF 설정, 사용하지 않음
        http.csrf((csrf) -> csrf.disable());

        http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests // 모든 경로를 제한하지 않음
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()// resources 접근 허용 설정
                        .requestMatchers("/api/user/**").permitAll()
                        .anyRequest().authenticated()); // 그 외 모든 요청 인증처리

        // 로그인 사용 : 인증이 필요한 url이 요청이 들어왔을 때 인증이 되지 않으면 login.html을 반환한다.
        http.formLogin((formLogin) ->
                // 로그인 View 제공 (GET) : 스프링 시큐리티가 기본적으로 제공하는 로그인 페이지가 아닌 직접 구현한 로그인 페이지 제공
                formLogin.loginPage("/api/user/login-page")
                        // 로그인 처리 (POST) : Controller에 설정된 로그인 페이지가 아님. Controller로 가기전에 처리
                        .loginProcessingUrl("/api/user/login")
                        // 로그인 처리 후 성공 시 URL
                        .defaultSuccessUrl("/")
                        // 로그인 처리 후 실패 시 URL
                        .failureUrl("/api/user/login-page?error")
                        .permitAll());

        return http.build();
    }
}

 

Spring Security에서 formLogin을 따로 설정하고 애플리케이션을 실행하면

기본적으로 제공해 주는 로그인 페이지가 나오게 된다.

Username : user

Password : 제공해 주는 비밀번호 입력 (터미널 확인)

 

 

  • formLogin 기반 인증 : 인증이 필요한 요청이 들어왔을 때, 기본으로 제공하는 로그인 페이지를 보여준다.
  • UsernamePasswordAuthenticationFilter : formLogin 기반을 사용할 때 username, password를 확인해서 인증처리하는 필터
  • SecurityContextHolder : 인증이 완료된 사용자의 상세 정보를 저장한다. SecurityContext는 접근할 수 있다. 

  • Principal : 주로 사용자를 식별한다. 일반적으로 UserDetails 인스턴스이다.
  • Credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비운다.
  • Authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화해서 사용한다.
@Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRoleEnum role = user.getRole();
        String authority = role.getAuthority();

        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(simpleGrantedAuthority);

        return authorities;
    }
    // UsernamePasswordAuthenticationToken 은 인증객체를 만드는데 사용함.
    Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

 

 

 

이상으로 Spring Security의 간단한 구조를 알아보았습니다. 🖐️🖐️