[Spring Security] 의존성 추가 및 기본 설정 적용

2024. 11. 19. 11:10Framework & Library/Spring Security

 Spring Security 를 프로젝트에 적용해 사용하려면 어떻게 해야 하는지 학습한 내용을 기록해 본다. 강의 수강중 작성한 실습 프로젝트는 여기서 확인할 수 있다.

1. 의존성 추가

 Spring Security 를 사용하기 위해서는 아래의 의존성을 'build.gradle' 에 추가할 필요가 있다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	...
}

 

 

2. 자동 설정을 통한 기본 보안 적용

 Spring Security 는 서버가 실행되면 초기화 작업 및 보안 설정이 이루어진다. 만약 개발자가 별다른 설정이나 코드를 작성하지 않았다면 '기본 웹 보안 기능' 이 작동하게 된다. 즉, 기본적으로 수행되는 '보안 기능이 자동적으로 실행' 되는 것이다.

 

위와 같은 기능은 SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration 클래스의 defaultSecurityFilterChain() 을 통해 확인할 수 있다.

SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration.defaultSecurityFilterChain()

The default configuration for web security. It relies on Spring Security's content-negotiation strategy to determine what sort of authentication to use. If the user specifies their own SecurityFilterChain bean, this will back-off completely and the users should specify all the bits that they want to configure as part of the custom security configuration.

웹 보안을 위한 기본 구성입니다. 사용할 인증 유형을 결정하기 위해 Spring Security 의 콘텐츠 협상 전략을 사용한다. 사용자가 자신의 SecurityFilterChain Bean 을 지정하는 경우 이는 완전히 백 오프되며 사용자는 사용자 정의 보안 구성의 일부로 구성하려는 모든 비트를 지정해야 한다.

 

즉, 사용자(= 개발자)가 지정한 별도의 SecurityFilterChain 이 Bean 으로 등록되지 않은 경우 defaultSecurityFilterChain() 을 통해 기본 보안이 프로젝트에 적용되는 것이다. 그렇다면 이 '기본 보안' 은 어떻게 작동하게 될까?

 

먼저 프로젝트를 실행해보니 실행 창에 이전에는 보지 못한 것이 출력되는 것을 확인할 수 있었다.

Using generated security password: 3a590d4f-b82d-4c5f-a54e-432f09cb674c

 

패스워드가 위와 같이 출력된 것 인데, 이 패스워드는 어떤 패스워드일까? 일단 '기본 보안' 이 적용되면 모든 요청에 대해 인증여부를 검증하고 인증이 승인되어야 자원에 접근할 수 있게 된다. 그래서 '인증' 에 사용될 하나의 계정을 Spring Security 가 자동으로 생성해 사용자(= 개발자)에게 제공하는데, 실행 창에 출력된 것이 계정의 패스워드이며 계정 아이디는 'user' 로 고정인 듯하다.

 

또한 로그인 방식을 'httpBasic' 및 'formLogin' 방식 두 가지를 제공하며, 인증을 시도할 수 있는 로그인 페이지가 자동적으로 생성되어 렌더링 된다고 한다.

 

 

3. 실습

 그럼 실습을 통해 위의 내용을 확인해보자. 위의 내용을 간략하게 정리해보면 결국 Spring Security 의 '기본 보안' 을 프로젝트에 적용할 경우 모든 요청에 대해서 인증을 수행하고 승인을 받아야 요청이 수행되며, 인증에 필요한 로그인 페이지와 계정은 자동으로 생성되어 제공된다는 것이다.

 

우선 모든 요청에 인증을 수행한다고 하니 실습을 위해 아래와 같이 API 요청을 하나 추가하였다. 해당 요청 수행전에 인증이 수행되는지 확인을 하는 것이 목적이므로 간단하게 Controller 만을 추가해 주었다.

@RestController
public class HomeController {
    @GetMapping("/")
    public String home() {
        return "home";
    }
}

 

이후 애플리케이션을 실행 시키고 웹 브라우저에 'localhost:8080' 을 입력하니 아래처럼 자동으로 생성된 로그인 페이지를 확인할 수 있었다.

로그인 페이지

 

해당 페이지에 Username 에 'user', Password 에 실행창에 출력된 패스워드를 입력하면

인증 성공

 

인증을 통과해 'localhost:8080/' 요청을 수행 "home" 인 출력된 페이지를 확인할 수 있다. 물론 Username 에 'user' 가 아닌 값을 입력하거나 Password 에 실행 창에 출력된 패스워드를 입력하지 않는다면 아래와 같이 인증에 실패했다는 메시지와 함께 요청이 수행되지 않는 것을 확인할 수 있었다.

인증 실패

 

또한 자동생성 된 계정으로 인증에 통과한 경우 다시 같은 요청에 대해서는 인증을 수행하지 않는 것도 확인했다. 언제까지 추가 인증이 필요 없는지는 확인해보지 못했지만 아마 '기본 보안' 이기에 한 번 인증을 통과하면 지속적으로 해당 상태를 유지하는 것이 아닐까 싶다.

 

 

4. 마무리

 인증(로그인)에 사용될 계정과 페이지를 자동적으로 생성해주니 그냥 기본 보안을 사용하면 될까? 애석하게도 해당 기능은 정말 '기본' 이므로 계정이나 권한을 추가할 수는 없다. 또한 프로젝트에서 필요로 하는 보안 기능이 추가될 때 이를 반영할 수도 없다.

 

결국 프로젝트에 적절한 보안 기능을 추가 및 반영하기 위해서는 개발자가 직접 작성한 보안 설정이 필요하다.


참고 강의/문서