'Spring Security' 프레임워크

금은체리·2023년 11월 16일
0

Spring

목록 보기
17/49

Spring Security 적용

  • 'Spring Security' 프레임워크
    • Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해줌
    • 'Spring' 프레임워크가 웹 서버 구현에 편의를 제공해주는 것
    • 여러 개의 필터들이 순차적으로 수행되는 방식
  • 'Spring Security' 프레임워크 추가
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
  • 'Spring Security' 활성화

    • Spring Security 제외 해제
    @SpringBootApplication
    public class SpringAuthApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringAuthApplication.class, args);
        }
    }
  • 'Spring Security' 설정

package com.sparta.springauth.config;

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
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
@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 접근 허용 설정
                        .anyRequest().authenticated() // 그 외 모든 요청 인증처리
        );

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

        return http.build();
    }
}
  • LoggingFilter, AuthFilter 등록 해제
  • CSRF
    • Cross-site request forgery, 사이트 간 요청 위조
      • 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청 전달
      • CSRF 설정이 되어있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청 수신 가능
      • 쿠키 기반의 취약점을 이용한 공격이기 때문에 REST 방식의 API에서는 disable 가능
      • POST 요청마다 처리해주는 대신 CSRF protection을 dsable!
        • http.csrf((csrf) -> csrf.disable());

Spring Security의 default 로그인 기능

  • http.formLogin(Customizer.withDefaults());
    • Security에서 제공하는 로그인 form 페이지
  • Username: user
  • Password: Spring 로그 확인(서버 시작 시마다 변경됨)
    • Password도 제공해줌

Spring Security 이해하기

Spring Security - Filter Chain

  • Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고
  • 이후에 각 요청을 담당하는 Controller로 분배됨
  • 이 때, 각 요청에 대해서 공통적으로 처리해야할 필요가 있을 때 DispatcherServlet 이전의 단계가 필요
    • 이것이 Filter !
  • Spring Security도 인증 및 인가를 처리하기 위해 Filter 사용
    • Spring Security는 FilterChainProxy를 통해서 상세로직 구현

Form Login 기반은 인증

  • Form Login 기반 인증은 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지 않았다면 로그인 페이지를 반환하는 형태

UsernamePasswordAuthenticationFilter

  • UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 필터
    • AbstractAuthenticationProcessingFilter : 웹 기반 인증요청에서 사용되는 컴포넌트로 POST 폼 데이터를 포함하는 요청을 처리
  • 기본적으로 Form Login 기반을 사용할 때 username과 password 확인하여 인증
  • 인증 과정
    1. 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도함
    2. 실패하면 SecurityContextHolder를 비움
    3. 성공하면 SecurityContextHolder에 Authentication 세팅
    SecurityContextHolder
    • 인증이 완료된 사용자의 상세 정보(Authentication) 저장
    • SecurityContextHolder로 접근 가능

    Authentication
    • 현재 인증된 사용자
    • SecurityContext에서 가져올 수 있음
    • principal : 사용자를 식별함
      • Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스
    • credentials
      • 주로 비밀번호
      • 대부분 사용자 인증에 사용한 후 비움
    • authorities
      • 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용

    UsernamePasswordAuthenticationToken
    • Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스
    • 인증객체를 만드는데 사용됨

    UserDetailsService
    • username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환
    • Custom하여 Bean으로 등록 후 사용 가능

    UserDetails
    • UsernamePasswordAuthenticationToken 타입의 Authentication를 만들 때 사용됨
    • 해당 인증개체는 SecurityContextHolder에 세팅됨
    • Custom하여 사용 가능
profile
전 체리 알러지가 있어요!

0개의 댓글