이번 강의에서는
@PreAutorize 주석을 이용해
메소드 레벨 보안을 구현해 보도록 하겠습니다
이제 우리가 섹션 10이라는 새로운 섹션에 도달했으니
로이전 Maven 프로젝트를 복사하여
springsection_10이라는 이름으로
새로운 Maven 프로젝트를 생성했습니다
이후에 프로젝트명을
springsecuritysection9에서 springsecuritysection_10으로 변경했습니다
이미 단계별로 알고 계실테니
시간 관계상 미리 해두었습니다
이제 섹션 10에
새로운 Maven 프로젝트가 생겼으니
메소드 레벨 보안 변경 사항에 대한 수업을 시작하겠습니다
이 프로젝트에서 가장 먼저 열고 싶은 클래스는
ProjectSecurityConfig 클래스입니다
이 ProjectSecurityConfig 클래스 안에는
현재로서 Loans APA의 경우
hasRole 메소드의 도움으로
권한이 구현되어 있습니다
하지만 이렇게 hasRole 메소드로
달성할 수 없는 복잡한 권한 요구 사항이
있는 경우를 생각해 봅시다
이는 메소드 레벨 보안을
활용하는 이유가 됩니다
이제 인가 구성을
이 클래스에서 Loans APA와 관련된
Java 메소드로 옮겨줍니다
우선
이 hasRole 인가 구성을 제거하고
authenticated 메소드를 호출해 줍니다
이렇게 하면 유효한 모든 로그인 사용자가
Loans API를 호출할 수 있고 특정한 권한 규칙을 강제하고 있지는 않습니다
이제 Java 메소드 위에
@PreAuthorize 주석의
도움으로 권한을 강제 합니다
이후에 두번째로 실행하고 싶은 변경 사항은
EazyBankBackendApplication 안에
@EnableMethodSecurity라는 주석을 언급하는 것입니다
해당 주석은 애플리케이션 내에
메소드 레벨 보안을 활성화 하도록 도울 것이고
이 주석과 더불어
@PreAuthorize 및 @PostAuthoriza 주석을 사용하기 때문에
이 prePostEnabled 은 true로 해두었습니다
그 다음에 secureEnabled도 true로 두었고
jsr250Enabled 역시 = true로 두었습니다
해당 구성이 필요한 것은 아니지만
미래에 @Secure 주석 혹은
@RoleAlert 주석을
활용할 때 해당 구성의
도움으로
사용할 수 있도록 미리 언급했습니다
명확히 전달 되었길 바랍니다
해당 변경 사항 이후
Java 메소드 위에 권한을 구현하기로 했기 때문에
Load CPA와 관련된 Repository 클래스를 열어줍니다
즉 LoanRepository 클래스입니다
해당 클래스 안에는
findByCustomerIdOrdersByStartDtDesc 이라는 메소드가 있습니다
이 메소드는 데이터베이스에서 고객 ID로
대출 정보의 로딩을 담당합니다
해당 메소드 위에
@PreAuthorize 주석을 사용하겠습니다
이 @PreAuthorize 주석는
hasRole('ROOT')과 같은
권한 구성을 보내려 합니다
여기서 데이터베이스에서는 존재하지 않는
'ROOT'과 같은 role을 사용하는 이유는
승인이 실패하고 유저가
UI 애플리케이션에서 어떠한 반응도 받지 않고 있음을 확인하기 위함입니다
그렇기 때문에 현재로서 데이터베이스에
존재하지 않는 역할(role)을 사용했습니다
따라서 이런 방법으로 @PreAuthorize
주석을 구성할 수 있습니다
현재로서 주석을 저장소 레이어에서
사용하고 있음을 볼 수 있는데
이는 서비스 레이어, 컨트롤러 레에어 등
어디서나 사용할 수 있습니다
이렇게 하면 Bill이 나오고
이 과정이 완료되면
웹 애플리케이션을 디버깅 모드로 시작할 수 있습니다
한편 UI 애플리케이션의 컴파일도 성공적이어야 하는데
포트 4,200에서 시작이 되었습니다
이게 UI 애플리케이션의 모습입니다
Happy의 정보로 로그인을 시도해 보겠습니다
여기 로그인을 눌러주면
성공적으로 로그인이 되었습니다
Account와 같은 APA들이 잘 작동하는지 확인할 수 있습니다
Balance도 잘 작동하고 있습니다
올바른 반응을 보이고 있습니다
Cards도 역시 작동이 잘 됩니다
하지만 Loans는 제외입니다
왜냐하면 Happy라는 유저에게는 할당되지 않은
역할(role)을 구성했기 때문입니다
따라서 해당 계정으로는 Loans APA를 호출할 수 없습니다
이를 확인해 보겠습니다
하지만 그전에 개발자 콘솔을 열어 보겠습니다
여기 Loans을 클릭해보면
아무 반응이 없고 에러 코드 403이
함께 뜨는 것을 볼 수 있습니다
이 에러 코드는 해당 APA를 호출할 수 있는 권한이 부여되지 않았다는 의미입니다
여기서 적용할 수 있는 변경 사항은 이 ROOT를 USER로 바꾸는 것입니다
이렇게 하면 이제 엔드 유저가 호출할 수 있게 됩니다
이제 User라는 역할(role)이 배정되었기 때문입니다
Bill을 하고
이 과정이 성공적으로 끝나면
다시 웹 애플리케이션으로 돌아가서 Loans에 접근해 보겠습니다
여기서 다시 돌아가 호출을 시도합니다
이번에는 보시다시피
대출 정보가 아주 잘 나옵니다
문제가 없는 이유는
어떤 메소드 레벨 보안을 구성하던간에
모든 역할(role)은 엔드 유저로 매핑되기 때문입니다
이렇게 메소드 위에
@PreAuthorize 주석을 이용하여
권한 규칙들을 정의할 수 있습니다
그리고 hasRole을 말고도 hasAnyRole
hasAuthority, hasAnAuthority, hasPermissions의 사용이 가능하며
권한 보유 요구 사항을 작성할 때는
SpEL 또한 활용이 가능합니다
@PreAuthorize 주석의 도움으로
많은 것들을 달성할 수 있습니다
해당 내용이 명확히 전달 되었기를 바랍니다.
다음 수업 때는 @PostAuthorization 주석의 활용에 대해
배워 봅시다
그럼 다음 강의 때 뵙겠습니다 감사합니다