반응형

오늘은 Spring Security를 사용해 웹 애플리케이션에 인증(Authentication)과 권한(Authorization)을 구현하는 기본적인 방법을 학습합니다. Spring Security는 보안 설정과 관리에 강력한 기능을 제공합니다.


1. Spring Security란?

Spring Security는 Spring 애플리케이션의 보안 프레임워크로 다음과 같은 기능을 제공합니다:

  1. 인증(Authentication): 사용자의 신원을 확인합니다.
  2. 권한(Authorization): 사용자에게 허용된 리소스만 접근 가능하게 합니다.
  3. 보안 필터: 다양한 보안 기능(예: CSRF, 세션 관리)을 제공합니다.

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

(1) 의존성 추가

Maven을 사용하는 경우, pom.xml에 Spring Security 의존성을 추가합니다.

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

Gradle 사용 시:

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

3. 기본 보안 설정

Spring Security를 추가하면 기본적으로 모든 엔드포인트가 보호되고, /login 페이지가 기본 제공됩니다.
사용자 이름: user
비밀번호: 애플리케이션 실행 시 로그에 표시됨.

로그인 페이지 실행 로그 예시:

Using generated security password: a12b34cd-56ef-78gh-90ij

4. 사용자 정의 보안 설정

Spring Security의 기본 설정을 커스터마이즈하여, 원하는 인증 및 권한 관리를 구현할 수 있습니다.

(1) Security Configuration 클래스 작성

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .anyRequest().permitAll()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout")
                .permitAll()
            );
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

(2) In-Memory 사용자 정의

@Bean
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
        .withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN")
        .and()
        .withUser("user").password(passwordEncoder().encode("user123")).roles("USER");
}

5. 로그인 및 권한 확인

(1) /login 페이지

Spring Security에서 제공하는 기본 로그인 페이지를 사용하거나 커스터마이즈할 수 있습니다.

(2) URL 접근 테스트

  • /admin/**: 관리자 계정만 접근 가능 (ROLE_ADMIN)
  • /user/**: 사용자와 관리자 모두 접근 가능 (ROLE_USER, ROLE_ADMIN)
  • 기타 경로: 인증 없이 접근 가능.

6. 커스텀 로그인 페이지 만들기

(1) Thymeleaf를 사용한 로그인 페이지 작성

src/main/resources/templates/login.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
    <h2>로그인 페이지</h2>
    <form th:action="@{/login}" method="post">
        <div>
            <label>Username:</label>
            <input type="text" name="username" />
        </div>
        <div>
            <label>Password:</label>
            <input type="password" name="password" />
        </div>
        <button type="submit">Login</button>
    </form>
</body>
</html>

7. 보안 테스트

  1. /admin에 접근 시 관리자 계정(admin123)으로 로그인.
  2. /user에 접근 시 사용자 계정(user123)으로 로그인.
  3. 인증되지 않은 사용자로 접근 시 /login 페이지로 리다이렉션.

8. 추가 구현

  • Database 연동: 사용자 정보를 데이터베이스에 저장하고 인증 처리.
  • OAuth2: Google, Facebook 같은 외부 인증 서비스 연동.
  • JWT: 토큰 기반 인증.
반응형

+ Recent posts