[java] Tomcat과 Spring Security의 통합 방법

Tomcat은 Java 웹 애플리케이션 서버로서 많은 기능을 제공하지만, 보안 측면에서는 한계가 있습니다. 이를 보완하기 위해 Spring Security를 사용하여 애플리케이션의 보안을 강화할 수 있습니다. 이번 글에서는 Tomcat과 Spring Security를 통합하는 방법에 대해 알아보겠습니다.

1. Spring Security를 프로젝트에 추가하기

먼저, Spring Security를 프로젝트에 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Gradle을 사용한다면 build.gradle 파일에 다음 의존성을 추가합니다:

implementation 'org.springframework.boot:spring-boot-starter-security'

의존성을 추가한 후, 프로젝트를 빌드하여 Spring Security가 정상적으로 추가되었는지 확인하십시오.

2. Tomcat 설정 변경하기

다음으로, Tomcat의 설정을 변경해야 합니다. Tomcat의 web.xml 파일에서 <security-constraint><login-config> 섹션을 삭제하고, 대신 Spring Security의 설정을 사용하도록 설정합니다.

Spring Security의 설정은 WebSecurityConfigurerAdapter를 상속하여 구현합니다. 프로젝트에 SecurityConfig라는 클래스를 추가하고, 다음과 같은 내용을 작성합니다:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

위 설정에서는 /public으로 시작하는 모든 경로에 대해 인증 없이 접근을 허용하고, 그 외의 모든 요청에 대해서는 인증이 필요하도록 설정합니다. 또한 로그인 페이지는 /login으로 설정하고 로그아웃 역시 허용합니다.

3. 사용자 인증 및 권한 부여 설정하기

Spring Security를 사용하여 사용자 인증 및 권한 부여를 구현해야 합니다. 이를 위해 UserDetailsService를 구현하여 사용자 정보를 가져오고, PasswordEncoder를 사용하여 비밀번호를 암호화해야 합니다.

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("Invalid username or password.");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(), new ArrayList<>());
    }
}

위의 코드는 사용자 정보를 데이터베이스에서 가져오는 예제입니다. 실제로는 사용하는 데이터 소스에 따라 구현해야 합니다.

4. 보안 설정 테스트하기

마지막으로, 보안 설정이 정상적으로 동작하는지 테스트해야 합니다. 프로젝트를 실행하고 웹 브라우저에서 접속하여 인증이 제대로 작동하는지 확인해보십시오.

여기서는 간단한 방식으로 Spring Security와 Tomcat을 통합하는 방법을 소개했습니다. 향후 필요에 따라 추가적인 설정 변경이나 기능을 구현해야 할 수 있습니다. Spring Security의 공식 문서를 참고하여 더욱 상세한 내용을 학습할 수 있습니다.

참고 자료