2023.01.15.SUN

ronglong·2023년 1월 15일
0

[Spring Security]
: Spring MVC 기반 보안 API로, 커스터마이징 및 확장 용이

  • 인증, Authentication
    - Credential(신원 증명 정보) : 패스워드 등
  • 인가(권한 부여), Authorization
    - 하나 이상의 권한(authority)을 부여하여 특정 리소스 접근 가능
    - 반드시 인증 후 인가. 권한은 보통 역할(Role) 형태로 부여

[Spring Security 기본 구조 _ SSR 기반, 폼 로그인 인증 방식]

  • build.gradle 파일에 의존성 라이브러리 추가.
    implementation 'org.springframework.boot:spring-boot-starter-security'
  • Sprign Security에서 디폴트 로그인 페이지, user, password 제공
  • Spring Security Configuration class 만들어서 Sprign Security 설정 가능
    • PasswordEncoder Bean 등록 for 패스워드 단방향 암호화(필수!). MemberService에 DI하여 사용.
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
        
    // DelegatingPasswordEncoder: PasswordEncoder 구현 객체를 생성해주는 컴포넌트
    }
  • MemberService Bean 등록을 위한 JavaConfiguration class 작성
  • MemberService class
    • Spring Security에서 SimpleGrantedAuthority를 사용해 Role 형태의 권한을 지정&매핑할 때 Role_ 권한명 형태로 작성해야함.
  • Custom UserDetailsService class 작성
    - UserDetailsService 인터페이스 구현 : 인증에 필요한 User 정보를 로드
  • AuthorityUtils class 작성 : role 기반의 권한 생성 클래스.
    UserDetailsService 클래스에 DI하여 사용.
  • List, Set 같은 컬렉션 타입의 필드는 @ElementCollection 을 추가하면 별도의 엔티티 클래스 생성없이 간단하게 매핑 처리됨(테이블 자동 생성)
  • Custom AuthenticationProvider 클래스 작성
    • AuthenticationProvider 인터페이스 구현
    • @Component 통해서 빈으로 등록
    • 메서드 오버라이드
      • supports(Class<?> authentication) 메서드 : Spring Security에게 인증 방식 알림(Username/Password 방식 등)
      • supports() 메서드의 리턴값이 true일 경우, authenticate() 호출해서 인증 진행 : UsernamePasswordAuthenticationToken 이용
    • 인증 실패로 BusinessLogicException을 throw하는 경우, 이 BusinessLogicException이 Cusotm AuthenticationProvider를 거쳐 그대로 Spring Security 내부 영역으로 throw됨.
    • Spring Security에서는 인증 실패 시, AuthenticationException이 throw 되지 않으면 Exception에 대한 별도의 처리를 하지 않고, 서블릿 컨테이너인 톰캣 쪽으로 throw. --> Whitelebel Error Page
    • 따라서, 예외 발생 시 AuthenticationException으로 rethrow 하면 원하는 방식으로 처리 가능 (try~catch문 이용)

[컴포넌트]

  • UserDetailsManager
    : Spring Security의 User 관리자. UserDetailsService를 상속하는 확장 인터페이스
  • InMemoryUserDetailsManager
    : 데이터베이스 연동없이 테스트 목적의 InMemory User 생성. UserDetailsManager 인터페이스의 구현체.
  • UserDetails
    : UserDetailsService에 의해 로드(load)된 핵심 User 정보를 표현하는 인터페이스. 구현체는 Authentication 객체로 캡슐화 되어 제공됨.
  • User : UserDetails 인터페이스의 구현체. 사용자 인증 정보 생성
    • .withDefaultPasswordEncoder() : 패스워드 암호화 (테스트&데모 용도)
    • .username() : user 식별 아이디
  • SecurityFilterChain : Bean으로 등록해서 HTTP 보안 설정 구성
    • 로컬 환경에서 Spring Security를 테스트하려면 CSRF 설정을 비활성화할 것.
    • .and() : 보안 설정을 메서드 체인 형태로 구성 가능
    • .authorizeHttpRequests() : 람다 표현식으로 request URI에 대한 접근 권한 부여
      • .antMatchers("-url-").hasRole("-role-")
      • antMatchers()로 권한 부여할 때, 순서 주의! (if문으로 조건 거르는 것처럼, url 더 구체적인 것--> 포괄적인 것)
@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 파라미터로 입력된 HttpSecurity를 통해 HTTP 요청에 대한 보안 설정을 구성
    }

[서블릿 필터 체인 구성]

=======First Filter Start=======
=======Second Filter Start=======
컨트롤러 동작
=======Second Filter End=======
=======First Filter End=======
  • Filter의 실행 순서 중요. 다음 필터에 영향 미침.

<느낀 점>
양도 많고 내용도 복잡하다.
이걸 금요일 하루 할당량으로 구겨넣은 게 말이 안 됨 ㅋㅋㅋㅋㅋㅋㅋ
결국 주말까지 봐서 겨우 했다. 첫 일요일 포스팅,,⭐️

뭔가 지엽적으로는 이해가 되는 것 같은데, 전체적인 그림이 잘 안 그려진다.
나중에 실제로 구현할 때 대체 어떤 순서로, 어떻게 구성해야하는지..?
몇 번 더 반복적으로 봐야할 것 같다.

밑에는 직접 실습하면서 작성 및 수정한 패키지 및 클래스의 개요 캡처.

0개의 댓글