나는 원래의 의견을 그 말대로 표현하기로 선택하지 않았지만 잠재적으로 합법적 인 문제를 식별합니다 .
특히 분리를 보증하는 문제는 인증 대 권한 입니다.
인증 은 로그인하고 신원을 얻는 과정을 말합니다. 시스템이 당신이 누구 인지 알고 개인화, 객체 소유권 등과 같은 것들에 사용되는 방식입니다.
승인 은 귀하가 할 수있는 일을 말하며 , (일반적으로) 귀하가 누구 인지에 따라 결정 되지 는 않습니다 . 대신 역할이나 권한과 같은 일부 보안 정책에 의해 결정되며 이름이나 전자 메일 주소와 같은 것을 신경 쓰지 않습니다.
이 두 가지는 서로 직교로 변할 수 있습니다. 예를 들어 OpenID / OpenAuth 공급자를 추가하여 인증 모델을 변경할 수 있습니다. 새 역할을 추가하거나 RBAC에서 ABAC로 변경하여 보안 정책을 변경할 수 있습니다.
이 모든 것이 하나의 클래스 또는 추상화로 들어가면 위험 완화를 위한 가장 중요한 도구 중 하나 인 보안 코드 가 아이러니하게도 위험에 처하게됩니다.
인증 및 권한 부여가 너무 밀접하게 결합 된 시스템에서 작업했습니다. 한 시스템에는 각각 한 유형의 "역할"에 대해 두 개의 병렬 사용자 데이터베이스가있었습니다. 이를 설계 한 개인 또는 팀은 단일 물리적 사용자가 두 역할에 모두 있거나 여러 역할에 공통적 인 특정 조치가 있거나 사용자 ID 충돌에 문제가있을 수 있다고 생각하지 않았습니다. 이것은 분명히 극단적 인 예이지만, 함께 일하는 것은 엄청나게 고통 스러웠습니다.
Microsoft 및 Sun / Oracle (Java)은 전체 인증 및 권한 부여 정보를 보안 주체라고 합니다. 완벽하지는 않지만 합리적으로 잘 작동합니다. 예를 들어, .NET에서는 전자 IPrincipal
를 캡슐화 하고 IIdentity
, 전자는 정책 (권한) 객체이고 후자는 신원 (인증)입니다. 당신은 합리적으로 하나를 넣어하기로 결정 의문을 제기 할 수 내부에 다른의를하지만, 중요한 것은이 때문이다 대부분의 코드는 추상화의 한위한 것 쓰기 가 테스트하고 리팩터링하기 쉬운 것을 의미한다.
A를 아무 문제 없습니다 User.IsAdmin
필드 ... 하지 않는 한 또한이 User.Name
필드. 이것은 "사용자"개념 이 제대로 정의되지 않았 음을 의미하며 , 안타깝게도 보안과 관련하여 귀에 약간 젖어있는 개발자들 사이에서 매우 흔한 실수입니다. 일반적으로 ID 및 정책 으로 공유해야하는 유일한 것은 사용자 ID이며, 이는 우연히 Windows 및 * nix 보안 모델 모두에서 구현되는 방식입니다.
아이덴티티와 정책을 모두 캡슐화하는 래퍼 객체를 생성하는 것은 완전히 허용됩니다. 예를 들어, 현재 사용자가 액세스 할 수있는 다양한 위젯 또는 링크 외에 "hello"메시지를 표시해야하는 대시 보드 화면을 쉽게 만들 수 있습니다. 이 랩퍼 는 ID 및 정책 정보를 랩핑 하고 해당 정보를 소유한다고 주장하지 않는 한. 즉, 집계 루트 로 표시되지 않는 한 .
YAGNI 등으로 인해 새로운 애플리케이션을 처음 설계 할 때 단순한 보안 모델은 항상 좋은 생각처럼 보이지만 , 놀랍게도 새로운 기능이 추가되기 때문에 나중에 다시 물어 뜯는 경우가 거의 있습니다!
따라서 자신에게 가장 적합한 것을 알고 있으면 인증 및 권한 부여 정보를 별도로 유지하게됩니다. 지금 "권한 부여"가 "IsAdmin"플래그만큼 단순하더라도 인증 정보와 동일한 클래스 또는 테이블의 일부가 아닌 경우 보안 정책이 필요한 경우 이미 잘 작동하는 인증 시스템에서 재구성 수술을 수행 할 필요가 없습니다.