웹 애플리케이션의 보안을 설계할 때는 단순히 로그인 여부를 확인하는 수준을 넘어, 사용자의 권한이나 요청 컨텍스트에 따라 페이지 내의 특정 요소들을 세밀하게 제어해야 할 때가 있다. 이번 장에서는 애플리케이션 페이지 영역에 영향을 미치는 미세 권한 부여 기능을 구현하는 두 가지 주요 방법과 비즈니스 티어에서의 보안 적용법을 살펴본다.
![]()
1. 미세 접근 제어(Fine-Grained Access Control)의 개념
미세 접근 제어란 특정 사용자의 요청 컨텍스트에 따라 애플리케이션 기능을 수정하거나 제한하는 것을 의미한다. 이는 단순히 페이지 전체에 대한 접근을 막는 것과는 다르며, 페이지 내부의 특정 버튼이나 링크, 정보 영역을 선택적으로 노출하거나 숨기는 방식으로 이루어진다.
2. 보안 기획 및 역할 정의
효과적인 보안 구현을 위해서는 코드 작성에 앞서 철저한 기획이 선행되어야 한다. 사용자 커뮤니티나 비즈니스 요구사항을 바탕으로 고객, 관리자, 공급자 등 다양한 사용자 역할과 그룹을 정의하고, 각 역할에 따라 어떤 기능을 허용할지 결정해야 한다. 이때 비지오나 다양한 목업 도구를 사용하여 각 페이지 요소가 사용자 권한에 따라 어떻게 변하는지 시각적으로 설계하는 것이 도움이 된다.
3. 구현 방식 1: JSP 태그 라이브러리 활용
스프링 시큐리티는 이러한 기능을 구현하기 위해 크게 두 가지 방식을 제공한다. 첫 번째는 스프링 시큐리티 JSP 태그 라이브러리를 사용하는 방식이다. 이 방식은 JSP 페이지 내에서 특정 태그를 사용하여 보안 설정 파일에 정의된 URL 접근 규칙이나 사용자의 권한 여부에 따라 콘텐츠를 조건부로 렌더링할 수 있게 해준다. 예를 들어, 사용자가 특정 URL에 접근할 수 있는 충분한 권한이 있는 경우에만 관련 메뉴나 링크가 화면에 표시되도록 설정할 수 있다.
-
역할 기반 속성: 특정 권한을 가진 사용자에게만 콘텐츠를 보여주거나, 반대로 특정 권한이 없는 사용자에게만 정보를 노출하는 식의 처리가 가능하다.
-
스프링 EL(SpEL) 지원: 더욱 복잡하고 유연한 보안 로직을 화면단에 적용할 수 있는 장점이 있다.
4. 구현 방식 2: 컨트롤러 기반 모델 데이터 제어
두 번째 방식은 컨트롤러에서 모델 데이터를 생성할 때 보안 로직을 포함하는 방법이다. 이 방식은 컨트롤러에서 현재 사용자의 인증 정보를 확인하고, 그 결과에 따라 뷰로 전달할 모델 데이터에 특정 플래그 값을 포함시키는 형태로 진행된다. 뷰에서는 단순히 이 플래그 값에 따라 콘텐츠의 표시 여부를 결정하게 된다. 이 방식은 표준 태그 라이브러리만을 사용하여 페이지를 구성할 수 있어 스프링 시큐리티에 대한 의존도를 낮출 수 있다는 특징이 있다.
5. 설계 원칙에 따른 방식 선택
어떤 방식을 선택할지는 애플리케이션의 복잡성과 설계 원칙에 따라 달라진다.
-
태그 라이브러리: 보안 규칙을 한곳에서 관리할 수 있고 코드 작성이 간편해지지만, 비즈니스 로직과 보안 로직이 뷰 영역에 섞일 수 있다.
-
컨트롤러 기반 방식: 뷰를 순수하게 유지할 수 있지만, 복잡한 보안 조건이 필요한 경우에는 구현이 까다로워질 수 있다.
6. 비즈니스 티어 보안: 메서드 레벨 보안
보안은 UI뿐만 아니라 비즈니스 로직이 수행되는 서비스 계층에서도 보장되어야 한다. 스프링 시큐리티는 메서드 레벨 보안을 통해 특정 서비스 메서드가 실행되기 전후에 권한을 검사할 수 있는 기능을 제공한다. 이는 @PreAuthorize, @PostAuthorize와 같은 어노테이션을 사용하여 구현하며, UI 단의 보안이 뚫리더라도 최종 데이터 처리 단계에서 악의적인 접근을 차단하는 최후의 보루 역할을 한다.
결론적으로 미세 접근 제어는 사용자에게 필요한 정보만을 적절히 노출함으로써 보안성을 높이고 사용자 경험을 개선하는 중요한 기술이다. 애플리케이션의 요구사항을 면밀히 분석하여 적절한 구현 방식을 선택하고, 정의된 보안 규칙이 모든 페이지에서 일관되게 적용되도록 설계하는 것이 무엇보다 중요하다.