이전까지는 Spring Security 에서 정말 핵심인 Builder 클래스들을 알아봤습니다.
이제 알만큼 알아봤으니
지금부터는 기본적인 프로젝트를 하나 생성해보겠습니다.
필자의 테스트 환경
OS
:Window 10
IDE
:IntelliJ Ultimate 2024.3
JDK
:Temurin-21
Spring-boot Version
:3.4.0
여러분들이 좋아하는 방법으로 Spring Boot 프로젝트를 생성합니다. 다만 의존성은 아래와 같이 2개를 꼭 추가해줍니다.
package coding.toast.security.config;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
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.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> {
// 정적자원 (/css/*, /js/*, favicon.* 등의 전형적인 경로를
// 사용하는 static 자원들은 인증 작업없이 접근가능`
auth.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll();
// 그외의 모든 요청은 다 막는다.
auth.anyRequest().authenticated();
});
http.formLogin(Customizer.withDefaults());
return http.build();
}
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
UserDetails pseudoUser = User
.withUsername("user")
// noop 은 입력한 비밀번호가 어떤 해싱 알고리즘을 사용하지 않음을 의미합니다.
// 적혀있는 그대로 비밀번호를 사용하겠다는 의미입니다.
.password("{noop}1111")
.authorities("ROLE_USER")
.build();
// 임시 계정 1개 등록
return new InMemoryUserDetailsManager(pseudoUser);
}
}
프로젝트의 src > main > resources > static
디렉토리에 favicon.ico
, index.html
을 생성/저장합니다.
참고:
favicon
파일은favicon download
라고 검색하고 다운로드 사이트에서 아무거나 하나 가져오면 됩니다.index.html
은 여러분 원하시는 대로 작성하시면 됩니다.
프로젝트를 실행하고 localhost:8080
으로 접속하고, id=user
, password=1111
을 입력합니다.
로그인 성공하고, index.html
에 작성한 내용이 보이면 성공입니다.
이후 나올 spring-security-6 관련 게시물에서는 이 프로젝트를 활용할 예정입니다.
브라우저 초기 실행 시 favicon.ico
조회하는데, 이게 실패하면 spring boot web
에 의해서 /error
로 요청을 리다이렉트 시키게 됩니다.
문제는 해당 /error
경로는 spring security 권한 문제로 인해서 다시 login
로 리다이렉션하게 됩니다.
이게 추후에 굉장히 헷갈리는 이상동작을 일으킬 수 있습니다.
그러므로 favicon 파일은 하나 꼭 넣어줍시다.
물론
/error
경로도 security 설정으로 권한 없이 접근 가능하도록 할 수도 있습니다. 저는 일단 설정을 최소화 하고 싶어서 이렇게 했습니다.