본문 바로가기
개발자 로그

🌐 Spring Security 클래스 설계의 큰 그림

by Hello_World_! 2025. 7. 29.
반응형

✅ 인증 및 인가 아키텍쳐의 주요 컨포넌트

Spring Security에서 인증(authentication)인가(authorization) 처리를 담당하는 주요 컨포넌트들의 동작 방식과 관계를 이해하는 것은 너무나 중요했습니다.

이와 같이, 기본으로 설정된 컨포넌트들을 여부에 맞게 올바른 형태로 설정하는 것이 Spring Security 프로젝트의 그 시작입니다.

🧙 Spring Security 인증 흐름 구성 요소

Spring Boot는 의존성에 따라 자동으로 Spring Security 관련 컨포넌트를 설정합니다.

그 중 기본적으로 활용되는 클래스 그룹은 다음과 같습니다:

🔍 각 컨포넌트 설명

  • Authentication Filter: 요청을 거래하고 AuthenticationManager에게 인증 요청 전달
  • AuthenticationManager: 인증의 주체, AuthenticationProvider에게 인증 로직 전달
  • AuthenticationProvider: 사용자 정보와 비밀번호 검증 수행
  • UserDetailsService: 사용자 정보를 제공
  • PasswordEncoder: 비밀번호 암호화 및 검증
  • SecurityContext: 인증이 성공한 후 사용자 정보를 저장

🔧 자동 설정된 구성 요소

  • UserDetailsService: 사용자 정보를 메모리에 "user", 비밀번호가 배수한 UUID로 저장
  • PasswordEncoder: 비밀번호가 해석이 안 되도록 파싱 (NoOpPasswordEncoder - 구현가 없음)

🛡️ HTTP Basic 인증 방식

  • Authorization 헤더가 "Basic base64(username:password)" 형식으로 전송
  • Base64는 인코딩 방식이며, 암호화가 아님
  • 또한, HTTPS를 포함해야 보안이 개발되며, RFC 7617 표준을 참고

🛡️ HTTPS 활성화 (선택적) - 책에서는 다루지 않는 내용이라 정리하지 않습니다.

  1. OpenSSL 이용 인증서 생성
  2. PKCS12 형식으로 자체 생성 및 설정
  3. application.properties에 SSL 파라미터 설정

🧑‍💻 기본 설정 올바르기

🔺 1단계: 사용자 정의

@Configuration
public class ProjectConfig {
    @Bean
    UserDetailsService userDetailsService() {
        return new InMemoryUserDetailsManager();
    }
}

해당 설정만으로는 인증이 성공하지 않습니다. 사용자가 없고 비밀번호에 관련 검증 모델도 없겠습니다.

🔺 2단계: 사용자 생성

@Configuration
public class ProjectConfig {
    @Bean
    UserDetailsService userDetailsService() {
        var user = User.withUsername("john")
                       .password("12345")
                       .authorities("read")
                       .build();
        return new InMemoryUserDetailsManager(user);
    }
}

🔺 3단계: PasswordEncoder 등록

@Bean
public PasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

🔺 최종 구성 클래스

@Configuration
public class ProjectConfig {

    @Bean
    UserDetailsService userDetailsService() {
        var user = User.withUsername("john")
                       .password("12345")
                       .authorities("read")
                       .build();
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
}

📂 테스트 - CMD

curl -u john:12345 http://localhost:8080/hello

🔹 응답

Hello!

이런 것으로 Spring Security의 기본 구성을 이해하고, 인증 흐름의 유용한 설계를 구조할 수 있습니다.