관리 메뉴

ballqs 님의 블로그

[Spring] Spring Security 기초 사용법 본문

코딩 공부/Spring

[Spring] Spring Security 기초 사용법

ballqs 2024. 8. 30. 09:49

Spring Security란?

Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주며 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크이다.


dependencies 추가

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

@Configuration를 통한 사용 방법

@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // CSRF 설정(disable 처리했기에 사용하지 않는다는 것)
        http.csrf((csrf) -> csrf.disable());

        http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정(static에는 접근 허용)
                        // .requestMatchers("/api/user/**").hasRole("ADMIN")   // 해당 URL은 ADMIN 권한을 가진 사람만 접근 가능
                        .anyRequest().authenticated() // 그 외 모든 요청 인증처리
        );

        // 로그인 사용
        http.formLogin(Customizer.withDefaults());

        return http.build();
    }
}

 

CSRF(사이트 간 요청 위조,Cross-site request forgery)란?

  • 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달하는 것
  • CSRF 설정이 되어 있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청을 수신 가능
  • 쿠키 기반의 취약점을 이용한 공격이기에 REST방식의 API는 disable(비활성)이 가능함

Spring Security의 default 로그인 기능

Spring Security에서 기본적으로 제공하는 로그인이 있다.

이를 인증해야지 어떤 url이던 접근이 가능해진다. 다만 @Configuration에서 예외처리한 url은 접근 가능하다.

기본 값

username : user

Password : Spring log 확인(서버 시작시마다 변경됨)


Spring Security 동작 흐름

Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다.

이 때 각 요청에 대해서 DispatcherServlet 이전에 단계가 필요하고 이때 사용되는 것이 Filter이다.

 

UsernamePasswordAuthenticationFilter

 

UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다.

 

인증 과정

  1. 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도
  2. 실패하면 SecurityContextHolder를 비운다
  3. 성공하면 SecurityContextHolder에 Authentication를 세팅한다.

SecurityContextHolder

더보기

 

// 예시코드
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.

SecurityContextHolder.setContext(context);

Authentication

더보기
  • 현재 인증된 사용자를 나타내며 SecurityContext에서 가져올 수 있다.
  • principal : 사용자를 식별한다.
    • Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스
  • credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비운다.
  • authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용한다.
<UserDetails>
@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;
}

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

마무리

오늘 정리한 글은 Spring Security의 아주 기초적인 부분을 정리한 것이고 좀더 공부하게 되면 더 작성해야겠다.