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에 접근하면 아까 설정했던대로 잘 나온다.