๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Developer/Spring

[spring boot] Spring Security ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์—†์• ๊ธฐ (6.1 ์ด์ƒ ๋ฒ„์ „)

Junyung 2024. 5. 15. 23:34

 

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ spring security๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ DB์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž 

spring security ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ build.gradle์— ์ฃผ์ž…ํ•ด์ฃผ์—ˆ๋‹ค.

	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

spring security ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

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๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋Œ“๊ธ€์ˆ˜0