Spring Security 6 HTTP Basic 인증 예제
HTTP Basic 인증이란?
HTTP Basic 인증 방식은 클라이언트와 서버 간의 통신에서 간단한 인증 메커니즘 중 하나로, HTTP 요청 헤더에 사용자 이름과 비밀번호를 함께 전송하여 인증하는 방식이다.
※ 웹에서는 보통 httpBasic 인증 방식을 잘 사용하지 않음
동작 방식
- 클라이언트는 인증 정보 없이 서버로 접속 시도
- base-64 인코딩된 값은 디코딩이 가능하기 때문에 인증정보가 노출됨
→ HTTP Basic 인증은 반드시 HTTPS 와 같이 TLS 기술과 함께 사용해야 한다.
- 서버가 클라이언트에게 인증요구를 보낼 때401 Unauthorized 응답과 함께 WWW-Authenticate 헤더를 기술해서 realm(보안영역) 과 Basic 인증방법을 보냄
- 클라이언트가 서버로 접속할 때 Base64 로 username 과 password 를 인코딩하고 Authorization 헤더에 담아서 요청함
- 성공적으로 완료되면 정상적인 상태 코드를 반환한다.
예제
@Bean("securityFilterChain")
public SecurityFilterChain basicSecurityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.anyRequest().hasRole("USER")
)
// 대부분 basic 설정으로 써도 되긴 함
.httpBasic(Customizer.withDefaults()).csrf(AbstractHttpConfigurer::disable);
return http.build();
}
..
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withUsername("user")
.password("{noop}1234")
.roles("USER").build();
UserDetails user2 = User.withUsername("user2")
.password("{noop}1111")
.roles("USER").build();
// user 객체 여러개 생성 가능
return new InMemoryUserDetailsManager(user, user2);
}
이렇게 설정하고 서버를 띄워 접속하면 다음과 같은 화면이 나타난다.
나같은 경우는 다음과 같이 Postman으로 인증 요청을 진행했다.
Postman에서 사용자가 입력한 username/password를 Base64로 인코딩하여 보내므로 사용자가 따로 인코딩할 필요가 없다.
서버에서는 BasicAuthenticationFilter가 username/password 를 base64 디코딩하여 이후 인증 처리를 진행한다.
BasicAuthenticationFilter에 관한 자세한 내용은 다음의 링크에서 확인할 수 있다.
https://soodal0328.tistory.com/94
Spring Security 6 BasicAuthenticationFilter 이란?
BasicAuthenticationFilterHTTP Basic 인증 에서 사용되는 필터로서 클라이언트가 Base64로 인코딩하여 보낸 username/password 를 BasicAuthenticationConverter 를 이용하여 디코딩한다.// BasicAuthenticationFilter 코드protected
soodal0328.tistory.com