인증과 권한 부여를 처리하는 데 참여하는 구성 요소를 의미합니다. 프로젝트에 알맞게 각각의 요소들을 재정의 하여 사용해야 합니다.
위와 같은 순서로 인증 프로세스가 진행되며 각각의 역할을 확인할 수 있습니다.
✅ 인증 필터
인증 요청을 인증 관리자에게 위임하는 역할이며, 인증 관리자에게 받은 응답을 바탕으로 보안 컨텍스트를 구성합니다.
✅ 보안 컨텍스트
인증 프로세스 이후 인증된 데이터를 유지하는 역할입니다.
✅ 인증 관리자
인증 공급자를 사용하여 인증을 처리하며 처리한 결과를 필터에 반환합니다.
✅ 인증 공급자
인증 논리를 구현하는 역할입니다. 인증 공급자의 기본 구현은 서비스에 적용된 인증 논리를 정의하는 UserDetailsService
, 암호 관리를 구현하는 PasswordEncoder
에 제공된 기본 구현을 이용하며 Bean
으로 등록하여 인증에 필요한 자격 증명을 제공합니다.
해당 객체는 사용자에 관한 세부 정보를 관리합니다. 앱의 내부 메모리에 기본 자격 증명을 등록하는 일을 합니다. 기본 자격 증명은 이름과 암호로 구성되어있으며, 사용자 이름은 user 암호는 UUID(Universally Unique Identifier) 로 스프링컨텍스트 로드시 자동 생성됩니다.
해당 객체는 암호를 인코딩하고 암호가 기존 인코딩과 일치하는지 확인하는 역할입니다. 기본 구현 방식은 "Basic" + 사용자의 이름과 암호가 포함된 문자열을 Base64 인코딩한 결과를 헤더를 통해 보내면 된다.
ex)
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests(auth -> auth
.requestMatchers(
HttpMethod.GET,
"/"
).permitAll()
.requestMatchers(
HttpMethod.GET,
"/admin"
).hasRole("ADMIN")
.requestMatchers(
HttpMethod.GET,
"/user"
).hasRole("USER")
)
.formLogin(withDefaults())
.httpBasic(withDefaults())
.logout(logout -> logout.logoutSuccessUrl("/login"))
.build();
}
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user1 = User
.withUsername("user1")
.password(passwordEncoder().encode("123"))
.roles("USER")
.build();
UserDetails user2 = User
.withUsername("user2")
.password(passwordEncoder().encode("123"))
.roles("USER")
.build();
UserDetails admin = User
.withUsername("admin")
.password(passwordEncoder().encode("123"))
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(user1, user2, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
userDetailsService() : InMemoryUserDetailsManager
구현을 이용하여 메모리에 자격 증명을 저장한 뒤 요청을 인증할 때 이용하기 위한 코드 입니다. 해당 메서드를 재정의 하면 PasswordEncoder
역시 재정의 해야 합니다.
passwordEncoder() : 해시 함수를 이용하여 패스워드를 암호화 하는 역할 입니다.
securityFilterChain() : 엔드포인트 권한 부여를 구성한 코드입니다. 자격증명없이 호출이 가능한 것과 Role
에 따른 접근 권한으로 나뉘는 것으로 구성되어 있습니다.