Spring Security로 Basic Authentication 적용하기
2024. 4. 17. 01:15ㆍSpring Security
반응형
들어가며
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 |