일기장/2007-02-09

간만에 권한에 관련된 부분 개발을 했다. 자바에서도 권한 개발 쪽에 꽤 많이 했었는데 여전히 쉬운 문제는 아니라는 생각이 든다. 물론 정답은 이미 나와 있다. RBAC을 쓰면 된다. User, Role, Permission, Object 네 가지의 개념을 모두 N:N으로 조합할 수 있으면 풀 수 없는 권한 문제는 없다. 문제는 RBAC을 풀로 구현하면 너무 복잡해진다는 것이다. 그래서 늘 중간 단계를 생략하거나, N:N 대신 1:N을 써서 모델을 단순화시켜서 해결하곤 한다. 주로 User당 Role을 하나로 제한하거나, Role과 Permission을 합치게 된다. 하지만 그러다보면 항상 꽁수로 피해가야 하는 구멍이 하나씩 생긴다. 이런 상황이 생기면 차라리 RBAC을 풀로 구현한 라이브러리가 있고 이에 대한 wrapper를 단순하게 만들어서 사용하는 것이 더 낫지 않을까 하는 생각도 든다. 어쨋든 궁극적으로는

  this_user.can_write_to? this_article

와 같은 식의 코드로 권한을 verify할 수 있으면 된다. Role은 구현 상의 중간 개념으로만 사용하고 실제 권한 처리 작업에서는 Role 개념을 쓰지 않는 것이 좋을 것 같다. 이번엔 User당 Role이 하나로 제한되는 상황이고 Role들이 포함 관계로 묶여서 Role 개념으로도 충분했지만 하나만 어긋나는 게 생겨도 꽤 많이 바꿔야 할 것 같다.

근데 루비 하다 보니까 annotation 류의 개념이 좀 아쉽다. 자바 같은 경우는 annotation으로 메쏘드별 권한을 명시적이면서도 간결하게 설정할 수 있고 파이썬도 decorator를 쓰면 간단하다. 루비도 그런대로 흉내는 낼 수 있지만 약간의 중복이 생기는 것이 아쉽다.