SpringSecurity 시작하기 가이드(~15분)
SpringSecurity에 대해 심도있게 알아보기 전,
스프링 공식문서의
빠르게 시작할 수 있는 가이드를 통해 SpringSecurity에 대해 대략적으로 파악해보려고 합니다.
예제에선 Thymeleaf 를 사용했지만, Thymeleaf를 사용하지 않을 수도 있기 때문에
Spring 부분만 참조하려고 합니다!
또한, SpringBoot를 사용한다고 가정하여 view controller의 설정 또한 생략하려고 합니다.
생략한 부분에 대해 자세히 알고 싶으시다면,
참조 부분의 공식문서 페이지를 확인해주세요
준비사항
15분 이내의 시간
IDE
Java 17
Gradle 7.5+ or Maven 3.5+
시작
1. SpringSecurity 의존성 추가
Gradle
implementation 'org.springframework.boot:spring-boot-starter-security'
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 사용자 인증 여부에 따른 페이지 접근 설정
WebSecurityConfig 클래스를 만들고, SpringSecurity에서 지원하는 보안 기능을 설정합니다.
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
SecurityFilterChain Bean은
보안이 필요한 URL 경로와 보안이 필요하지 않은 URL 경로를 정의합니다.
예시에선 "" 과 "home"경로의 인증이 필요하지 않다고 설정(.permitAll())했습니다.
다른 모든 경로(.anyRequest())에서는 인증이 필요합니다(.authenticated()).
사용자가 성공적으로 로그인하면, (인증이 필요한)이전 페이지로 리디렉션됩니다.
예제에선 사용자 정의 “/login” 페이지가 있으며 .loginPage() 로 설정했습니다.
이 페이지는 누구나 볼 수 있습니다(.permitAll()).
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
UserDetailsService Bean은
단일 사용자(하나의 사용자 유형만 정의했습니다)를 가진 in-memory user store로 설정했습니다.
(애플리케이션 자체의 메모리에 사용자 정보를 보관했습니다)
이 사용자는 user 이름, password 암호 및 USER 역할을 부여받습니다.
실제 애플리케이션에서는 사용자 정보를 db나 다른 외부 저장소에 저장하고,
UserDetailsService를 해당 저장소와 연결하여 사용자 데이터를 검색하는 것이 일반적입니다.
(예제는 단지 공식문서에서 제공하는, SpringSecurity를 빠르게 시작해볼 수 있는 코드입니다)
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
3. 로그인
위에서 UserDetailsService 를 통해 사용자 정보를 애플리케이션에 저장했기 때문에 회원가입 없이 곧바로 로그인할 수 있습니다.
아이디는 user
비밀번호는 password
권한은 USER가 되겠습니다.
끝맺음
다음에는 topical 가이드를 통해 SpringSecurity에 대해 더 자세히 알아보도록 하겠습니다.
참조
https://spring.io/guides/gs/securing-web/
https://github.com/spring-guides/gs-securing-web
'Java' 카테고리의 다른 글
[SpringFramework] Bean 우선순위 부여(@Primary, @Qualifier) (0) | 2023.11.29 |
---|---|
[SpringFramework] Spring Container, Java Bean vs. POJO vs. Spring Bean (0) | 2023.11.26 |
[SpringFramework] Spring Bean 생성, 확인, 의존성 주입 (0) | 2023.11.26 |
[SpringFramework] Coupling, 강한 결합과 느슨한 결합 (0) | 2023.11.26 |
[SpringFramework] 스프링프로젝트 생성(spring.io, InteliJ), 클래스 생성 (0) | 2023.11.25 |