[spring boot] Spring Security ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ํ์ด์ง ์์ ๊ธฐ (6.1 ์ด์ ๋ฒ์ )
ํ๋ก์ ํธ ์งํ ์ค spring security๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ์ฌ DB์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์
spring security ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ build.gradle์ ์ฃผ์ ํด์ฃผ์๋ค.
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

spring security๋ฅผ ์ฃผ์ ํ๊ฒ ๋๋ฉด ์๋์ผ๋ก login ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๊ณ ,
์ํ๋ url์ ์๋ฌด๋ฆฌ ์ ๋ ฅํด๋ ์ด๋ํ์ง ์๋๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
๋จผ์ , application์์ ์คํ๋๋ Main.java ํด๋์ค ํ์ผ์
@SpringBootApplication ์ด๋ ธํ ์ด์ ์ (exclude = SecurityAutoConfiguration.class) ์ต์ ์ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ๋์ค์ง ์๊ฒ ํด์ค ์ ์๋ค๋ผ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.
package com.project.board;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
@RequestMapping("/")
public String home() {
return "home";
}
}
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ๋๊ฐ์ด ๋ก๊ทธ์ธํ์ด์ง๊ฐ ์์ด์ง์ง ์์๋ค.
๋๋ฒ์งธ, ๋ ๋ค๋ฅธ ๊ตฌ๊ธ๋ง๋ค์ ํตํด springConfig class๋ฅผ ํตํด
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.anyRequest().permitAll();
return http.build();
http.authorizeRequests().antMatchers("/**").permitAll()
.anyRequest().authenticated();
return http.build();
}
}
์ด๋ ๊ฒ csrf๋ฅผ ๋ง๊ณ , ๊ถํ์ ํ์ด์ฃผ๋ ๊ฒฝ์ฐ๋ ๋ค์ํ๊ฒ ๊ฒ์ํ ์ ์๋ค.
ํ์ง๋ง ์ด๋ ์ํ๋ฆฌํฐ 5๋ฒ์ ์ดํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ํ๋ ์ฝ๋์์ ์ ์ ์์๋ค.
์ฆ, ์ด๋ ๊ฒ ์์ฑํ๊ฒ ๋๋ฉด 6๋ฒ์ ์ด์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ


์ด์ ๊ฐ์ด ๋ฒ์ ๋ฌธ์ ๋ก ์ฌ์ฉํ ์ ์์์ ์ ์ ์๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์
spring security ๊ณต์๋ฌธ์์ ๋๋ถ์ด, ๋ค์ํ ๊ตฌ๊ธ๋ง์ ํตํด Lamda ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํจ์ ์๊ฒ ๋์๋ค.
์ฆ,
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.anyRequest().permitAll()
);
return http.build();
}
์ด๋ ๊ฒ ๋๋ค์์ ์ฌ์ฉํ์ฌ csrf๋ฅผ ๋ง๊ณ , ๋ก๊ทธ์ธ ํ์ด์ง๋ก์ redirect๋ฅผ ๋ง๋๋ก ์ค์ ํ๋ค.
์ต์ข ์ฝ๋
package com.project.board;
import org.springframework.beans.factory.annotation.Autowired;
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public static PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.anyRequest().permitAll()
);
return http.build();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, PasswordEncoder passwordEncoder) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password(passwordEncoder.encode("password"))
.roles("USER");
}
}
์ด์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํจ์ ํตํด ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ํ์ด์ง๋ก์ ์ด๋์ ๋ง๊ณ ์ํ๋ URL๋ก ์ด๋ํ ์ ์๋๋ก ๊ตฌํํ ์ ์์๋ค.