본문 바로가기

JAVA

Spring Security 개념 정리

Diagram

파일별 분석

UiApiApplication

@EnableWebMvc

@EnableWebMvc
public class UiApiApplication {
...
}
  • 기능

WebMvcConfigurer 인터페이스를 상속받아 Spring MVC 기능을 커스텀 가능함

Spring Boot에서 기본적인 자동 구성을 다 해줌 → @EnableWebMvc 어노테이션을 사용 → 일부 Spring MVC 관련 부분을 커스텀 가능

SecurityConfig

SecurityFilterChain

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, AccountRepository accountRepository) throws Exception {
    TokenBasedAuthenticationFilter tokenBasedAuthenticationFilter = new TokenBasedAuthenticationFilter(
            "/api/**",
            authTokenService,
            accountRepository
    );

    http
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .csrf(csrf -> csrf.disable())
            .sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(req ->
                    req
                        .requestMatchers("/api/auth/login").permitAll()
                        .anyRequest().authenticated()
                        .anyRequest().permitAll()
            )
            .addFilterBefore(tokenBasedAuthenticationFilter, BasicAuthenticationFilter.class)
            .formLogin(login ->
                    login.failureHandler(this::handleLoginFail)
                        .successHandler((req, res, auth) -> tokenBasedAuthenticationFilter.handleLoginSuccess(res, auth))
                        .loginPage("/api/login")
            )
            .logout(configurer ->
                    configurer.logoutUrl("/api/logout")
                            .logoutSuccessHandler(tokenBasedAuthenticationFilter::handleLogoutSuccess)
            );

    return http.build();
}
  • 기능

TokenBasedAuthenticationFilter 클래스는 AbstractAuthenticationProcessingFilter 을 상속받은 클래스로써 첫번째 파라미터는 AbstractAuthenticationProcessingFilter 의 첫번째 파라미터(defaultFilterProcessesUrl : 해당 filter를 거칠 대상 url 규칙)임.

따라서 여기에 /api/** 를 넣어주고 /api 하단 엔드포인트 컨트롤러들은 인증이 필요한 api들이고 인증(토큰)을 받을 컨트롤러는 상위 엔드포인트가 /api 외에 다른 곳을 사용하고 있음

 

들어온 요청이 인증이 된 요청인지 검증하는 filter 클래스임

이걸 BasicAuthenticationFilter 전에 적용될 수 있도록 추가함. 해당 토큰 기반 인증이 성공하면 BasicAuthenticationFilter 는 안거쳐도 되기 때문.

BasicAuthenticationFilter
Authorization: Basic + base64encode(“username:password”) 를 header에 추가해주어 처리하는 인증방식


CORS (Cross-Origin Resource Sharing) : origin이 다른 것에서 요청하는 경우
→ corsConfigurationSource() 메서드의 규칙에 따르도록

CSRF (Cross-Site Request Forgery, 교차사이트 요청 위조): 공격자가 신뢰할 수 있는 다른 사용자를 사칭하여 특정 서버에게 잘못된 공격을 보내는 것
→ 비활성화. 허용하지 않음


SessionCreationPolicy.STATELESS : 세션을 사용하지 않음. 상태를 유지하지 않음. 즉, 각 요청은 독립적으로 실행됨.


AccountController

@GetMapping("/check-account")
public UserInfoDto checkAccount(@UserAccount Account account) {
    return accountService.loadSelf(account);
}

@UserAccount 인 커스텀 어노테이션으로 인해 UserAccountHandlerMethodArgumentResolver(HandlerMethodArgumentResolver 상속받은 클래스)에 의해 account에 주입받음. 그 이후에 account내용을 돌려준다.

반응형

'JAVA' 카테고리의 다른 글

제어의 역전과 의존성 주입  (2) 2025.07.24
JAVA의 GC  (2) 2025.07.21