: 권한 검사는 ‘사용자 U가 기능 F를 실행할 권한이 있는지’ 검사하는 것으로 복잡한 개념은 아니다.
: 권한 검사는 개발하는 시스템마다 그 복잡도가 다른데, 단순한 시스템은 인증 여부만 검사하면 되는데 반해, 어떤 시스템은 관리자인지에 따라 사용할 수 있는 기능이 달라지기도 한다.
: 실행할 수 있는 기능이 역할마다 달라지는 경우도 있다. 다양한 상황을 충족하기 위해 스프링 시큐리티 같은 프레임워크는 유연하고 확장가능한 구조를 갖고 있는데 이는 유연한만큼 복잡하다는 것을 의미한다.
: 이러한 보안 프레임워크에 대해 이해가 부족하면 프레임워크를 무턱대고 도입하는 것보다 개발할 시스템에 맞는 권한 검사 기능을 구현하는 것이 시스템 유지 보수에 유리할 수 있다.
: 보안 프레임워크의 복잡도를 떠나 보통 다음 곳에 권한 검사를 수행할 수 있다.
•
표현 영역
•
응용 서비스
•
도메인
표현 영역
: 표현 영역에서 할 수 있는 기본적인 검사는 인증된 사용자인지 아닌지 검사하는 것이 대표적이다.
: 회원 정보 변경과 관련된 URL은 인증된 사용자만 접근해야 한다. 회원 정보 변경을 처리하는 URL에 대해 표현 영역은 다음과 같이 접근을 제어할 수 있다.
•
URL을 처리하는 컨트롤러에 웹 요청을 전달하기 전에 인증 여부를 검사해서 인증된 사용자의 웹 요청만 컨트롤러에 전달한다.
•
인증된 사용자가 아닐 경우 로그인 화면으로 리다이렉트 시킨다.
: 이런 접근 제어를 하기에 좋은 위치가 서블릿 필터이다. 서블릿 필터에서 사용자의 인증 정보를 생성하고 인증 여부를 검사한다.
: 인증된 사용자면 다음 과정을 진행하고 그렇지 않으면 로그인 화면이나 에러 화면을 보여주면 된다.
: 인증 여부뿐만 아니라 권한에 대해서 동일한 방식으로 필터를 사용해서 URL별 권한 검사를 할 수 있다. 스프링 시큐리티는 이런 유사한 방식으로 필터로 인증 정보를 생성하고 웹 접근을 제어한다.
응용 서비스
: URL 만으로 접근 제어를 할 수 없는 경우, 응용 서비스의 메서드 단위로 권한 검사를 수행해야 한다. 이는 꼭 응용 서비스의 코드에서 직접 권한 검사를 해야 한다는 것을 의미하는 것은 아니다.
: 예를 들어 스프링 시큐리티는 AOP를 활용해서 다음과 같이 애너테이션으로 서비스 메서드와 대한 권한 검사를 할 수 있는 기능을 제공한다.
public class BlockMemberService {
private MemberRepository memberRepository;
@PreAuthorize("hasRole('Admin')")
public void block(String memberId) {
Member member = memberRepositoy.findById(memberId);
if (member == null) throw new NoMemberException();
member.block();
}
...
Java
복사
도메인
: 개별 도메인 객체 단위로 권한 검사를 해야 하는 경우는 구현이 복잡해진다. 예를 들어 게시글 삭제는 본인 또는 관리자 역할을 가진 사용자만 할 수 있다고 해보자.
: 이 경우 게시글 작성자가 본인인지 확인하려면 게시글 애그리거트를 먼저 로딩해야 한다. 즉 응용 서비스의 메서드 수준에서 권한 검사를 할 수 없기 때문에 다음과 같이 직접 권한 검사 로직을 구현해야 한다.
public class DeleteArticleService {
public void delete(String userId, Long articleId) {
Article article = articleRepository.findById(articleId);
checkArticleExistence(article);
permissionService.checkDeletePermission(userId, article);
aritcle.markDeleted();
}
...
Java
복사
: permissionService.checkDeletePermission()은 파라미터로 전달받은 사용자 ID와 게시글을 이용해서 삭제 권한을 가졌는지를 검사할 것이다.
: 스프링 시큐리티와 같은 보안 프레임워크를 확장해서 개별 도메인 객체 수준의 권한 검사 기능을 프레임워크에 통합할 수도 있다.
: 도메인 객체 수준의 권한 검사 로직은 도메인별로 다르므로 도메인에 맞게 보안 프레임워크를 확장하려면 프레임워크에 대한 높은 이해가 필요하다.
: 이해도가 높지 않아 프레임워크 확장을 원하는 수준으로 할 수 없다면 프레임워크를 사용하는 대신 도메인에 맞는 권한 검사 기능을 직접 구현하는 것이 유지 보수에 유리하다.