의존성 추가
- 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 되었다.
대체된 방법은 다음 포스팅을 클릭하면 된다.
- SecurityConfig 설정 클래스를 작성하기 앞서 스프링 시큐리티의 흐름을 이해하는 것이 더욱 효과적인 방법이란 것을 알 것이다. Spring Security의 핵심 개념인 Spring Security 흐름 & 인증 & 인가(Authentication & Authorization) 에 대한 포스팅을 봐보도록 하자.
- 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 토큰을 비활성화하고 싶다면 위와 같이 주석부분을 추가해주면 된다.