📌 Spring Security 사용하기
인증 방식
인증 방식으로 여러 가지가 존재하는데, 가장 흔한 Username and Password 방식(JWT 적용 X)을 사용해보자.
다른 인증 방식들에 대해 알고 싶다면 위의 링크를 들어가보자(위의 링크)
의존성 라이브러리 추가
dependencies {
...
...
implementation 'org.springframework.boot:spring-boot-starter-security'
...
...
}
Spring Security를 사용하기 위해 다음과 같은 의존성 라이브러리를 추가해야 한다.
기본 화면
...
...
Using generated security password: **32593900-2c36-4cdb-9d15-ce8e5049481f** // (1)
스프링 시큐리티를 등록하고 아무 설정을 하지 않으면 기본 로그인 페이지와 콘솔 창에 위와 같은 password가 주어진다.
로그인을 하려면 Username에 'user'를 입력하고 pasword에 콘솔 창에 주어준 password를 사용하면 된다.
Filter Chain 등록하기
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.*;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// Building Filter Chain....
// headers() : headers()를 선언함으로써 header에 지정하는 여러 옵션들을 부여할 수 있다.
// frameOptions() : HTML 태그 중 <frame>이나 <iframe>, <object> 태그에서 페이지를 렌더링할지의 여부를 지정
// sameOrigin() : 동일 출처로부터 들어오는 request만 페이지 렌더링을 허용한다.
.headers().frameOptions().sameOrigin()
.and()
.csrf().disable() // csrf 보안 적용 여부
.formLogin() // 로그인 형식 지정
.loginPage("/auths/login-form") // login 페이지 핸들러 메서드 url 지정(없으면 스프링 기본 로그인 페이지)
.loginProcessingUrl("/process_login") // 메서드를 통해 로그인 인증 요청을 수행할 url 지정
.failureUrl("/auths/login-form?error") // 실패했을 때 리다이렉트할 메서드 url 지정
.and()
// logout() : 로그인 세션을 제거함
// logoutUrl("/logout") : 사용자가 로그아웃을 수행하기 위한 request URL을 지정
// logoutSuccessUrl("/") : 로그아웃 성공한 이후 리다이렉트할 URL을 지정
.logout().logoutUrl("/logout").logoutSuccessUrl("/")
.and()
// exceptionHandling : 말 그대로 예외 발생 처리를 말함
// accessDeniedPage권한이 없는 사용자가 특정 Request URI에 접근할 경우 발생하는 에러 페이지 지정,
.exceptionHandling().accessDeniedPage("/auths/access-denied")
.and()
.authorizeHttpRequests(authorize -> authorize
// orders/** : orders 하위의 접근 권한
// hasRole : ADMIN 권한을 부여받은 사용자만 접근할 수 있도록 지정
.antMatchers("/orders/**").hasRole("ADMIN")
// 위와 동일, 해당페이지는 USER 권한 사용자만 접근가능
.antMatchers("/members/my-page").hasRole("USER")
// 위의 경로를 제외한 모든 경로는 Role에 상관없이 접근가능하도록 지정
.antMatchers("/**").permitAll());
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
SecurityFilterChain filterChain()
SecurityFilterChain 리턴 타입(정확히는 Filter 타입)의 메서드를 빈으로 등록하면 FilterChainProxy에서 getFilters() 메서드를 통해 Spring Security에 빈으로 등록된 등록된 Filter들을 가져온다. SecurityFilterChain에는 등록한 Filter Chain들을 List 형태로 가진다.
위에는 대략적인 필터 사용 예제인데, 전체 필터 목록들은 다음과 같다.
자세한 건 구글링해보자.(Spring 공식 문서 참조)
- ForceEagerSessionCreationFilter
- ChannelProcessingFilter
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CorsFilter
- CsrfFilter
- LogoutFilter
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
- UsernamePasswordAuthenticationFilter
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- OAuth2AuthorizationCodeGrantFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
- SwitchUserFilter
PasswordEncoder passwordEncoder()
Username and Password 방식을 사용하기 때문에 패스워드를 해싱할 알고리즘을 지정하는 PasswordEncoder를 빈으로 등록해줘야 한다. 구체적인 암호화 알고리즘은 지정하지 않고 PasswordEncoder를 사용하겠다라고 선언했다 생각하면 된다.
댓글