[Spring boot 3 Security] 기본 프로젝트 생성 및 설정

식빵·2024년 12월 8일
0

이전까지는 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);
	}
}



static resource 저장

프로젝트의 src > main > resources > static 디렉토리에 favicon.ico, index.html 을 생성/저장합니다.

  • index.html 은 간단 테스트용이고,
  • favicon.ico 은 이상동작 발생을 미연에 방지하기 위해 넣었습니다.
    (참고)

참고:

  • favicon 파일은 favicon download 라고 검색하고 다운로드 사이트에서 아무거나 하나 가져오면 됩니다.
  • index.html 은 여러분 원하시는 대로 작성하시면 됩니다.



테스트

프로젝트를 실행하고 localhost:8080 으로 접속하고, id=user, password=1111 을 입력합니다.


로그인 성공하고, index.html 에 작성한 내용이 보이면 성공입니다.

이후 나올 spring-security-6 관련 게시물에서는 이 프로젝트를 활용할 예정입니다.



부연 설명

favicon 부재시 이상동작

브라우저 초기 실행 시 favicon.ico 조회하는데, 이게 실패하면 spring boot web 에 의해서 /error 로 요청을 리다이렉트 시키게 됩니다.

문제는 해당 /error 경로는 spring security 권한 문제로 인해서 다시 login 로 리다이렉션하게 됩니다.

이게 추후에 굉장히 헷갈리는 이상동작을 일으킬 수 있습니다.
그러므로 favicon 파일은 하나 꼭 넣어줍시다.

물론 /error 경로도 security 설정으로 권한 없이 접근 가능하도록 할 수도 있습니다. 저는 일단 설정을 최소화 하고 싶어서 이렇게 했습니다.

profile
백엔드 개발자로 일하고 있는 식빵(🍞)입니다.

0개의 댓글