본문 바로가기

패스트캠퍼스/100% 환급 챌린지_2

패스트캠퍼스 환급챌린지 38일차 : Netplix 구독형 멤버십 프로젝트로 배우는 Spring Security 강의 후기

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

 

 

안녕하세요 :)

오늘은 챌린지 38일차로, 벌써 40일에 가까워졌네요.

 

오늘 배울 내용은,

Part B. 스프링 시큐리티 심화

Ch 4. 사전 및 사후 권한 부여/필터링

"05. 사후 필터링 적용" 입니다.


 

오늘은 사후 필터링 적용에 대해서 알아보는 시간을 가졌다. 사후 필터링은 어느 상황에서 사용될까? ReactJS 로 구현된 프론트엔드와 스프링으로 구현된 백엔드가 서로 연결되어 있다고 가정을 해보자. 프론트에서는 로그인된 사용자에 대한 데이터만 조회해야 하는 상황이지만 어떤 데이터가 존재하는지는 프론트에서는 알 수 없다. 따라서 로그인된 정보를 백엔드로 전달하면 백엔드에서 알아서 필터링하여 프론트로 전달해줘야 하는 상황도 있을 수 있다.

조금 더 구체적인 예를 들어 인증된 사용자 정보를 전달하면 사용자가 좋아요를 누른 영화/드라마 리스트를 Service 수준에서 반환한다고 해보자. PostFilter 어노테이션 활용하게 되면, 설정 클래스는 InMemoryUserDetailsManager 활용하고, danny와 steve 등록한 뒤, NoOpPasswordEncoder 활용하여 비밀번호를 평문으로 사용한다.

 

ContentService 에는 @PostFilter 활용하여 반환되는 컬렉션 객체에서 owner 값이 인증된 사용자의 이름과 동일한 객체만 필터링하여 반환하고, 데이터베이스를 별도로 구축하기 보다 하드코딩으로 등록한다.


ContentController 에는 GET /api/v2/contents 엔드포인트 생성한다.

 

테스트를 할 때는 먼저

테스트 - 1 danny 가 좋아요를 누른 Contents 조회하고,
테스트 - 2 steve 가 좋아요를 누른 Contents 조회하고,

테스트 - 3 인증된 사용자가 아닐 때는 Unauthorized가 나오는 것을 볼 수 있다.

 

결과 값은 동일한데 동작하는 원리가 다르다보니 그 차이를 잘 인지하면 좋을 것 같다. PreFilter는 아예 메소드가 호출되기 전에 필터링 되어서 들어온다이고, PostFilter는 return 되는 시점에 전체 다 return이 되지만 컨트롤러로 다시 돌려주기 전에, 필터링 해서 돌려준다라는 차이점을 잘 알고 있으면 될 것 같다는 생각이 들었다.