Java/spring

spring security를 알아보자 - 3

티코딩 2024. 3. 15. 11:39

이번엔 새로운 프로젝트를 만들어보자.

일단 저번에만들던걸 복사해서 그대로 만들어보자.

 

그리고 저번에 만든 컨트롤러는 지우고 새롭게 컨트롤러들을 만들어보자.

ㅁ AccountController

@RestController
public class AccountController {

    @GetMapping("/myAccount")
    public String getAccountDetails() {
        return "Here are the account details from the DB";
    }

}

ㅁ BalanceController

@RestController
public class BalanceController {

    @GetMapping("/myBalance")
    public String getBalanceDetails() {
        return "Here are the balance details from the DB";
    }

}

ㅁ CardsController

@RestController
public class CardsController {

    @GetMapping("/myCards")
    public String getCardDetails() {
        return "Here are the card details from the DB";
    }

}

ㅁ ContactController

@RestController
public class ContactController {

    @GetMapping("/contact")
    public String saveContactInquiryDetails() {
        return "Inquiry details are saved to the DB";
    }

}

ㅁ LoansController

@RestController
public class LoansController {

    @GetMapping("/myLoans")
    public String getLoanDetails() {
        return "Here are the loan details from the DB";
    }

}

ㅁ NoticesController

@RestController
public class NoticesController {

    @GetMapping("/notices")
    public String getNotices() {
        return "Here are the notices details from the DB";
    }

}

 

이렇게 간단하게 컨트롤러를 만들고 각 api에 접근해보면 localhost:8080/login으로 넘어간다.

하지만 우린 몇 URL은 보호되고 몇 URL은 public하게 접근가능하게 해야한다.

어떤 로직이 spring security는 모든 url을 보호할까?

spring security안에서 SpringBootWebSecurityConfiguration이라는 클래스가 있다.

HttpSecurity를 파라미터로 받는 deraultSecurityFilterChain이 있다.

@Bean
        @Order(2147483642)
        SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
            http.authorizeHttpRequests((requests) -> {
                ((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated();
            });
            http.formLogin(Customizer.withDefaults());
            http.httpBasic(Customizer.withDefaults());
            return (SecurityFilterChain)http.build();
        }

여기서 우리의 api의 엔드포인트를 보호해준다.

그러면 public url을 설정해줘야한다.

 

config라는 패키지를 만들고 ProjectSecurityConfig라는 클래스를 만들어주자.

@Configuration 애너테이션을 붙혀주고 위에defualtSecurityFilterChain을 복붙해준다.

그리고 이제 맞춤형 보안 설정을 해보자.

	@Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((requests) -> requests
                        .requestMatchers("/myAccount","/myBalance","/myLoans","/myCards").authenticated()
                        .requestMatchers("/notices","/contact").permitAll())
                .formLogin(Customizer.withDefaults())
                .httpBasic(Customizer.withDefaults());
        return http.build();
    }

이렇게 수정해줌으로써, /notices, /contact 엔드포인트는 public url이 되었다.

public이 된 url에 접근하면 아까 설정했던대로 잘 나온다.