[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 ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

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

    ๋Œ“๊ธ€