본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
안녕하세요 :)
오늘은 챌린지 37일차로, 연휴가 끝난 이후에 다시 공부 빡세게 하려니 손에 잘 안 잡히지만 그래도 화이팅!!
오늘 배울 내용은,
Part B. 스프링 시큐리티 심화
Ch 4. 사전 및 사후 권한 부여/필터링
"04. 사전 필터링 적용" 입니다.

오늘은 사전 및 사후필터링에 대해 알아보는 시간을 가졌다. 이전 시간에서는 @PreAuthorize, @PostAuthorize 를 활용하여 권한 부여 규칙을 적용하는 방법에 대해 알아보면서, 규칙에 따라 아예 호출 자체를 제한하거나, 호출은 허용하지만 결과값을 반환하지 않도록 제한할 수 있다는 것을 알았다. 또, 스프링에서 사용하는 표현식을 활용하거나, PermissionEvaluator 의 hasPermission 메소드를 구현하여 활용하기도 하는데, 만약 1) 호출 시 메소드의 파라미터가 특정 규칙을 따르는지 확인을 하고 싶거나 2) 결과값의 승인된 부분만 받도록 하려면 사전 및 사후 필터링이라는 개념을 활용해야 한다.
사전 필터링은 PreFiltering 이라고 하며 프레임워크가 메소드를 호출하기 전에 매개 변수의 값을 필터링 하며, 사후 필터링은 PostFiltering 이라고 하며 프레임워크가 메소드를 호출한 후 반환된 값을 필터링 한다.
사전 필터링은 파라미터나 반환 결과값이 규칙을 준수하지 않아도 메소드 호출은 그대로 발생하며, 예외를 던지지 않고, 단 조건에 맞지 않는 파라미터나 반환 - 결과값을 필터링 한다. 필터링의 개념이기 때문에 컬렉션이나 배열에서만 활용할 할 있다.
사전 필터링의 장점으로는 메소드가 구현하는 비즈니스 로직과 권한 부여 규칙을 분리할 수 있다. 만약 인증된 사용자가 소유한 특정 데이터만 처리하는 기능을 구현해야 하고, 이 기능이 여러 위치에서 호출된다고 가정을 해보자. 추가로 이 기능을 호출하는 클라이언트와는 관계 없이 인증된 사용자의 데이터만 처리가 가능해야 한다.
@PreFilter 어노테이션을 활용하여 영화/드라마 리스트를 조회할 때, 모든 리스트를 조회하는 것이 아닌 사용자가 "좋아요"를 누른 리스트만 조회하고, 영화/드라마 리스트를 조회하는 메소드는 어디서든 호출할 수 있다. 여기서 주의할점은 필터링의 개념이기 때문에 List 에서 데이터를 추가/삭제가 가능해야 한다. 따라서 그냥 List 가 아닌 MutableList 형태여야 한다. ArrayList 에 add 를 하여 만들어야 하며, ArrayList 를 선언하는 시점에 같이 데이터도 선언하면 MutableList 가 아닌 일반 List 가 되어 UnsupportedOperationException 이 발생하게 된다.