스프링 시큐리티 ACL 퍼미션의 비트마스크 메커니즘과 권한

ACL 환경 설정 과정에서 간단히 보고 넘어간 고급 주제들은 ACE 퍼미션과 ACL에 대한 특정 타입의 변화가 허용되는지 여부를 결정할 때 ACL 환경을 지원해 주는 GrantedAuthority의 사용과 관련한 내용들이다. 이제 환경이 비로소 동작하게 되었으므로 이러한 고급 주제에 대해 상세히 살펴본다.


1. 퍼미션의 동작 원리와 비트마스크(Bitmask)

먼저 퍼미션의 동작 원리를 이해해야 한다. 퍼미션은 정수로 표현되는 간단한 논리적 식별자일 뿐이다.

  • 비트마스크 연산: 접근 제어 엔트리(ACE)는 적용할 수 있는 퍼미션의 논리적 AND를 모두 포함하는 비트마스크를 바탕으로 SID에 대한 퍼미션을 허용한다.

  • 표준 퍼미션: 기본 제공되는 구현체는 READ(1), WRITE(2), CREATE(4), DELETE(8), ADMINISTRATION(16)과 같이 단일 비트 집합과 일치하는 정수값들을 정의하고 있다. 이러한 권한들이 합쳐져 하나의 비트마스크 값을 형성하게 된다.

  • 커스텀 퍼미션: 기본 상수는 예시일 뿐이며, 복잡한 시스템에서는 비즈니스에 의존적인 퍼미션을 직접 개발하여 사용하는 일이 흔하다.


2. 애플리케이션 레벨의 퍼미션 계산

개발자들은 많은 데이터베이스에서 비트 연산을 지원하지 않거나 일부만 지원하기 때문에 비트마스크가 실제로 어떻게 사용되는지 혼란스러워하기도 한다.

  • 계산 주체: 스프링 ACL은 이러한 문제를 해결하기 위해 데이터베이스보다는 주로 애플리케이션 바이트코드에서 퍼미션 계산을 수행한다.

  • 연결 과정: 실제 ACL 퍼미션으로 연결하는 과정은 상당히 중요하다. 이는 애노테이션을 사용하여 선언된 퍼미션 요청 주체와 관련된 ACL을 해석하는 연산 과정을 통해 이루어진다.


3. ACL 요청 처리 프로세스

시스템은 여러 인터페이스와 구현체들을 사용하여 권한 요청을 처리한다.

  1. 식별자 추출: 인증 정보를 바탕으로 적절한 SID들을 가져온다.

  2. 객체 정보 조회: 대상 도메인 객체에서 객체 식별자(Object Identity) 정보를 추출한다.

  3. ACL 데이터 로드: AclService를 통해 데이터베이스에 저장된 ACL 정보를 조회한다.

  4. 권한 비교: 내부 전략에 따라 요청된 퍼미션 비트와 실제 저장된 퍼미션 비트를 비교하여 접근 허용 여부를 결정한다.


4. 구현 시 주의사항과 권장 접근 방식

시스템은 저장된 퍼미션과 사용자가 요청한 퍼미션을 비트 단위로 비교한다. 하지만 여기서 주의해야 할 점이 있다.

  • 논리적 복잡성: 모든 퍼미션 조합을 사전에 정의하거나 관리하는 방식은 설계 의도와 다르게 권한이 부여되거나 거부될 위험이 있다.

  • 바람직한 설계: 가급적 단일 비트만을 설정하여 관리하거나, 명확한 퍼미션 비트만을 사용하여 ACL 항목마다 단일한 의미를 갖도록 구성하는 것이 좋다.


5. 권한 거부 시나리오 테스트

특정 시나리오를 테스트하기 위해 데이터베이스에 직접 접근하여 권한 정보를 수정해 볼 수 있다.

예시 상황: 관리자 권한을 가진 사용자가 특정 객체에 대해 읽기(READ) 권한만 있고 쓰기(WRITE) 권한은 없는 상태를 가정한다. 이때 시스템이 내부적으로 SQL 쿼리를 통해 ACL 내역을 조회하고, 결과적으로 쓰기 시도 시 접근이 거부되는 것을 확인하는 과정을 통해 ACL의 동작 방식을 더 깊이 이해할 수 있다.

이러한 방식은 ACL로 보호된 자원에 대해 권한이 없는 접근 시도가 어떻게 차단되는지 명확히 보여준다.


ACL의 퍼미션 시스템은 비트마스크라는 효율적인 도구를 통해 인스턴스 레벨의 정교한 보안을 구현한다. 데이터베이스의 제약을 넘어 애플리케이션 계층에서 이루어지는 이 메커니즘을 이해하면, 개발자는 비즈니스 요구사항에 딱 맞는 세밀한 보안 체계를 설계할 수 있다.

댓글 남기기