이전 강의에서는
모든 REST 서비스를 빌드하고
Spring Boot 웹 애플리케이션 내에서
Spring Security dependency과 함께 배포했을 때
기본적으로 모든 REST API가 Spring Security 프레임워크에 의해
보호된다는 것을 살펴봤습니다
하지만 우리는 맞춤형 보안 요구사항들이 있는데
몇 URL은 보호되고
나머지 URL은 보호되지 않길 바라는 겁니다
따라서 모든 맞춤형 보안 요구사항을 정의하기 위해
먼저 우리는 Spring Security 프레임워크에서
어떤 로직이 모든 URL을 보호하는 것을
디폴트로 만드는지 이해할 필요가 있습니다
그러기 위해 이 강의에서는
여러분의 웹 애플리케이션에서
모든 URL을 디폴트로 보호하는 마법을 부리고 있는
Spring Security 프레임워크 안의
코드 조각을 이해해보겠습니다
보시다시피 프레임워크 안에
SpringBootWebSecurityConfiguration이라는 클래스가 있습니다
이 클래스 안에
defaultSecurityFilterChain 메소드가 있는데
HttpSecurity를 입력 매개변수로 받습니다
그리고 이 스크린샷을 보시면
우리의 모든 엔드포인트 URL을
보호하게 만드는 코드를 볼 수 있습니다
이 클래스로 가서 이 메소드를 열고
이 코드 조각을 이해하고자 노력해보겠습니다
추후 강의에서
우리의 맞춤형 보안 요구 사항을 정의하기 위한
디딤돌이 될 것입니다
제 IDEA 안에서 SpringBootWebSecurityConfiguration라는
클래스를 찾아보겠습니다
여기 보시면 이걸 클릭해보면
Maven 다운로드 JAR 안에 있는데
JAR 이름은 spring-boot-autoconfigure입니다
이것을 열어보겠습니다
열자마자 디컴파일된
Java 코드를 볼 수 있습니다
만약 보이지 않으신다면 전에 말했듯이
여러분 IDEA의 설정에 들어가서
이 설정 중에서
Maven - Importing을 찾고
여기 Sources, Documentation, Annotations 라는
세 개의 박스에 체크가 된 걸 확인하시기 바랍니다
이 세팅에서 여러분의 Maven이
dependencies를 다운로드하려고 할 때
소스 코드, 문서, 주석, 여러분이 필요한 모든 것을
함께 다운로드 할 것입니다
여러분에게 의문이 있을 때
프레임워크 코드 또한 디버그할 수 있도록 말입니다
그럼 defaultSecurityFilterChain라는
메소드로 돌아오면
이 메소드에서는 보시다시피
HttpSecurity라는 이름의 입력 매개변수를
받아들이고 있습니다
그리고 이 HttpSecurity를 사용해
authorizeHttpRequests라는 메소드를 호출하고 있습니다
그로써 나의 웹 애플리케이션에 들어온 모든 요청은
증명되어야 한다고 말하는 것입니다
그러니까 이 한 줄이 모든 마법을 부리고 있는 것이고
이 코드를 볼 때 우리는
Spring Boot 웹 애플리케이션에
들어오는 모든 요청이 증명되기를 원하며
요청은 UI 애플리케이션이나
어떠한 REST API 호출을 통해
들어올 수 있다는 게 확실한 것입니다
그래서 이 fromLogin과 httpBasic 메소드도
HttpSecurity의 도움을 받아 호출해야 하는 겁니다
이 두 줄을 통해
프레임워크가 보여주려고 하는 것은
요청이 HTML 형태 또는
UI 애플리케이션을 통해 올 수 있다는 겁니다
이러한 요청들은 인증을 받기를 원합니다
그래서 이것이 우리가 formLogin 메소드를
사용하여 정의하려고 하는 내용입니다
반대로 요청이 REST API 호출이나
Postman 애플리케이션을 통해 들어온다면
이런 시나리오에서는 httpBasic 기준에 따라
유저 자격 증명과 함께
요청을 보냅니다
그래서 httpBasic 메소드를
호출해야 하는 겁니다
이 중요한 세 줄 다음에는
보시다시피 동일한 HTTP 변수를 사용해
build라는 메소드를 호출하고 있습니다
이 build 메소드는 SecurityFilterChain 타입의
객체를 반환하는데
이 메소드 위에는 @Bean 각주가
있는 걸 볼 수 있습니다
이 메소드가 어떤 객체를 반환하든지
Spring 프레임워크는
그것을 Spring 맥락에서
bean으로 유지하겠다는 뜻입니다
이 메소드의 Java 문서도 읽어볼 수 있습니다
웹 보안을 위한 기본 설정을
명확히 명시하고 있습니다
어떤 자격 증명을 사용할지를 결정하기 위해
Spring Security의
content-negotiation strategy에 의존하는데
요청이 formLogin 또는 httpBasic을 통해
올 수 있다는 뜻입니다
그래서 프레임워크는
요청을 인증하고자 할 겁니다
그 다음 여기서 확인할 수 있는 중요한 선언은
유저가 여기서 유저는 개발자인데
만약 개발자가
자체 SecurityFilterChain bean을 지정한다면
이 설정은 일방적인 개입을 완전히 중단하며
유저는 맞춤형 보안 설정의 일부로
원하는 모든 부분을 지정해야 한다고 합니다
이 선언을 보면 우리가
Spring Security 프레임워크에서
자체 보안 요구사항을 정의하려고 한다면
이 메소드에서 볼 수 있는 것과 같이
SecurityFilterChain 타입
bean을 생성해야 한다는 것을
확실히 알 수 있습니다
다음 단계로 SecurityFilterChain
bean을 정의해보겠습니다
그러기 위해 새로운 패키지를 생성하겠습니다
패키지 이름은 config입니다
config 패키지명을 입력하겠습니다
그 다음에는 이 안에 ProjectSecurityConfig이라는
새로운 클래스를 생성하겠습니다
이름을 입력하면 새로운 클래스가 생성됩니다
이 클래스 위에 @Configuration이라는
각주를 정의하겠습니다
이 각주를 정의하는 것은 이 클래스 안에
특정 설정을 정의했음을
Spring Boot 프레임워크에
표시하는 것입니다
따라서 시작 단계에서 프레임워크가
이 클래스 안에 우리가 정의한 모든 bean을 스캔할 겁니다
다음은 프레임워크 코드로 가서
완전히 똑같은 코드를 가져다가
ProjectSecurityConfig에 동일하게 입력하겠습니다
여기서는 @Order가 필요 없습니다
삭제하겠습니다
이렇게 해서 우리의 SecurityFilterChain
bean을 생성했습니다
이 수정사항들을 저장하고 나서 빌드를 실행하겠습니다
빌드가 완료되면
브라우저로 API를 테스트하겠습니다
여기 브라우저에서
My Account API를 접근하려고 하는데
디폴트로 보안된 것을 볼 수 있습니다
무작위로 카드도 체크해보겠습니다
myCards도 보호되어 있습니다
문의하기를 보겠습니다
문의하기도 보호되어 있습니다
마지막으로 공지사항을 보겠습니다
이로써 자체적인 SecurityFilterChain
bean을 통해
우리의 모든 API를 보호할 수 있었지만
이것은 우리가 원하는 게 아닙니다
우리는 몇 API를 보호하고
몇 API는 보호하지 않기를 원합니다
추후 강의들에서 우리의 자체적인
맞춤 요구사항을 작성해보겠습니다
하지만 지금으로써는 이 SecurityFilterChain bean이
여러분이 웹 애플리케이션에서
자체 맞춤 요구사항을
정의하고자 할 때 매우 중요하다는 것을
명확히 이해하셨으면 합니다
모든 것이 이해되셨으면 좋겠습니다
감사드리며 다음 강의에서 만나겠습니다
수고하셨습니다