경계의 경계

Spring Security로 Basic Authentication 적용하기 본문

Spring Security

Spring Security로 Basic Authentication 적용하기

gigyesik 2024. 4. 17. 01:15

들어가며

Spring Security는 Java 기반 어플리케이션에 보안을 제공하는 프레임워크이다.

그 중 가장 핵심 기능은 ‘접근하려는 유저가 누구인지 확인’하는 Authentication(인증)이다.

Spring Security는 전통적 방식의 ID/Password 인증부터 OAuth, JSON Web Token(JWT)까지 다양한 인증 방식을 지원한다.

Basic 인증 사용해보기

SecurityConfig

  • httpBasic 요소를 default로 추가하였다.
  • “/” 엔드포인트만 모두 허용하고 나머지 엔드포인트 요청은 전부 인증을 필요로 한다.
@Configuration
@EnableWebSecurity
public class DefaultSecurityConfig {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("admin")
                .password(passwordEncoder().encode("admin"))
                .roles("ADMIN")
                .authorities("ROLE_ADMIN");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests(expressionInterceptUrlRegistry ->
                expressionInterceptUrlRegistry
                        .requestMatchers("/").permitAll()
                        .anyRequest().authenticated()
                )
                .httpBasic(Customizer.withDefaults());

        return http.build();
    }

    @Bean
    public static PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

API 호출

  • “/” 로 요청하면 200 OK
curl -i <http://localhost:8080> 
# HTTP/1.1 200 
# ...
  • 다른 경로로 호출하면 401 Anauthorized
curl -i <http://localhost:8080/mvc-test> 
# HTTP/1.1 401 
# ...
  • 계정 정보와 함께 호출하면 200 OK
curl -i --user admin:admin <http://localhost:8080/mvc-test> 
# HTTP/1.1 200 
# ...

EntryPoint 설정 커스텀하기

위 코드에서 Basic Authentication 부분을 default 설정으로 처리하였다.

default 설정을 적용하여도 원하는대로 동작하지만, 의도가 명확한 코드로 전환해본다.

  • CustomBasicAuthenticationEntryPoint.java
@Component
public class CustomBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
    @Override
    public void afterPropertiesSet() {
        setRealmName("gigyesik");
        super.afterPropertiesSet();
    }

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        response.addHeader("WWW-Authenticate", "Basic realm=" + getRealmName());
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authException.getMessage());
        super.commence(request, response, authException);
    }
}

  • DefaultSecurityConfig.java
@Configuration
@EnableWebSecurity
public class DefaultSecurityConfig {
    @Autowired
    private CustomBasicAuthenticationEntryPoint customBasicAuthenticationEntryPoint;

		...
		
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.
		        ...
                .httpBasic(httpSecurityHttpBasicConfigurer ->
                        httpSecurityHttpBasicConfigurer.authenticationEntryPoint(customBasicAuthenticationEntryPoint));

        return http.build();
    }

    ...
}

  • API 호출
curl -i <http://localhost:8080/mvc-test>
# HTTP/1.1 401 
# WWW-Authenticate: Basic realm="gigyesik"
# ...

Resources

'Spring Security' 카테고리의 다른 글

JWT란 무엇인가  (0) 2024.04.27
Spring Security의 OAuth2  (0) 2024.04.26
Spring Security의 인증(Authentication)과 인가(Authorization)  (0) 2024.04.24
Spring Security란 무엇인가  (0) 2024.04.16