Spring Security 프로젝트 시작

의존성 추가

  • Spring Boot DevTools
  • Spring Web
  • Lombok
  • Thymeleaf
  • Spring Data JPA
  • MariaDB Driver

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-java8time'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

 

 

application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/securitydb
spring.datasource.username=dutmdcjf
spring.datasource.password=dutmdcjf


spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

spring.thymeleaf.cache=false

 

 

 

 

 

프로젝트 생성시 간단 확인

좌측:로그인창  /  중간:로그인실패  /  우측:로그인시

  • 자동 생성되는 로그인 페이지
  • 임시 아이디: "user"
    임시 비밀번호: console 창에 security password 생성된다.
  • 아직 어떠한 컨트롤러도 생성하지 않았기에 정상적인 화면 출력이 되지 않는다.

 

 

 

 

 

 

SecurityConfig 설정 클래스

  • Spring Security의 설정 클래스를 만들때 WebSecurityConfigurerAdapter를 상속받아 기능을 쉽게 설정한다.
    WebSecurityConfigurerAdapter는 Deprecated 되었다. 
    대체된 방법은 다음 포스팅을 클릭하면 된다.

 

 

 

  • Spring Boot 2.0부터 인증을 위해선 PasswordEncoder를 지정해주어야 한다.
    Spring Security에서 자체적으로 제공하는 PasswordEncoder도 있으므로 이를 SecurityConfig 설정 클래스에 Bean으로 주입해주어야 한다.
@Configuration
public class SecurityConfig {

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

 

 

  • 사용자를 SecurityConfig 설정 파일 내에서 생성할 경우
@Bean
public InMemoryUserDetailsManager userDetailsService() {
    UserDetails user = User.builder()
            .username("user1")
            .password(passwordEncoder().encode("1111"))
            .roles("USER")
            .build();

    return new InMemoryUserDetailsManager(user);
}

 

 

 

  • 인가를 위한 접근 제한 설정 
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    http.authorizeHttpRequests((auth) -> {
        auth.antMatchers("/sample/all").permitAll();
        auth.antMatchers("/sample/member").hasRole("USER");
    });

    http.formLogin();
    http.logout();
    
    //http.csrf().disable();

    return http.build();
}
  • '/sample/all'로 별도의 로그인 없이 접속 가능 (익명사용자도 접속 가능)
  • '/sample/member'로 USER 권한이 있는 사용자만 접속 가능
  • formLogin(): 인가/인증 실패 경우 로그인 페이지 보여주도록 설정(로그인 방식 설정)
  • logout(): CSRF 토큰을 사용할 때는 반드시 POST 방식으로 로그아웃 처리해야 한다.
    CSRF 토큰을 비활성화할 시 GET 방식으로도 로그아웃 가능하다.
  • Spring Security는 기본적으로 CSRF 공격을 방어하기 위해 GET 방식을 제외한 모든 요청 방식에 CSRF 토큰값을 hidden 값으로 보내준다. 만약 csrf 토큰을 비활성화하고 싶다면 위와 같이 주석부분을 추가해주면 된다.