한때, 워드프레스는 사람들이 무료이고 쓰기 쉬워서 찾는 거지, 구식 개발이고 소스 코드도 알아보기 어렵고… 아무튼 이건 진짜 별로다. 이렇게 생각한 적이 있었습니다. 그러다가 생각이 바뀌게 된 계기가 있는데, 바로 역할과 권한(Role and Capability, 줄여서 RC) 체계를 접하게 된 것이었죠. 이후 워드프레스에 대한 평가가 긍정적으로 변했죠. 특히나 RC의 풍부한 표현은 정말 마음에 듭니다. 조금 어렵기는 해도, 사용자 레벨 같은 거와는 비교할 바가 아닙니다.
워드프레스는 CMS입니다. 단연코 콘텐츠의 관리와 유통에 있어 전문가입니다. 잘 뜯어보면 세심하게 배려한 부분이 정말 많습니다. 개발자 입장에서 볼 때 어떤 콘텐츠를 잘 관리하고 전파할 목적이라면, 어설프게 만들지 말고 워드프레스 써라고 충고하고 싶습니다. 10여년간 그들이 쌓아 올린 콘텐츠 관리에 대한 노하우는 만만한 것이 아닙니다.
사실 그동안 역할과 권한은 잘 쓰면 굉장히 멋진 것이 될 거라 생각은 해 왔습니다. 그러나 그 잘 쓰는 법을 여전히 잘 터득하지 못한 것 같았습니다. 물론 코덱스를 잘 읽으면 어지간한 정보는 습득할 수는 있지만 이것저것 만져보면서 직접 경험해보는 해킹(hacking)이 필요했습니다. 직접 좌충우돌하는 경험을 하고 싶었습니다. 그리고 이 포스트는 그 경험을 기록하기 위해 작성하는 것입니다.
계획
- 두 개의 플러그인을 사용합니다. 하나는 한 사용자에서 다른 사용자로 계정 전환을 시켜 주는 “User Switching“, 다른 하나는 RC에 대한 제어를 간편하게 할 수 있는 “User Role Editor“입니다.
- 멤버(member)라는 역할을 하나 생성합니다. 같은 이름인 member라는 사용자 하나를 그 역할로 생성합니다. 멤버는 초기에 어떠한 권한도 가지지 않습니다.
- 기본 역할인 구독자(subscriber), 저자(author), 기여자(contributor), 편집자(editor) 역할을 가진 사용자도 하나씩 생성합니다. 각 필요에 따라 적절한 행동을 하면서 멤버와 비교를 할 것입니다.
- 멤버는 점차적으로 권한의 폭이 넓어집니다. 다른 역할을 가진 사용자와 비교하면서, 또 코덱스의 설명을 참고하면서 각 권한이 어떤 의미를 가지는지 직접 경험해 봅니다.
포스트를 작성하면서 User Role Editor 제작자분에게 감사를 표하고 싶습니다. 아마 이 분은 제가 하려고 하는 역할과 권한의 마스터이십니다. 이 분의 에디터를 사용하면 한눈에 역할과 권한을 파악할 수 있어 많은 도움이 되었습니다. 마찬가지로 User Switching 제작자분께도 감사드립니다. 이 분이 없었다면 매번 로그인 화면에서 쓸데없이 패스워드를 입력해야만 했었을 겁니다.
Member 역할 생성
사용자 > User Role Editor로 가서 Add Role 버튼을 눌러 Member 역할을 생성합니다.
처음에는 어떤 권한도 주지 않습니다. 기존의 가장 약한 권한을 가진 구독자는 read 권한을 가지는데, 멤버는 그것마저 가지지 않습니다.
Read 권한
read는 관리자 화면에 접근할 수 있는 가장 최소한의 권한입니다. 이 권한이 없다면 관리자 화면에 접근할 방법이 없습니다. 멤버가 로그인한 후 프론트 화면을 보실까요?
가장 좌측은 wordpress.org와 관련 있는 로그이고, 그 다음 대시보드 아이콘이 있습니다. 그러나 이 아이콘에 커서를 가져가도 메뉴가 나오지 않습니다. 클릭해도 관리자 화면으로는 들어갈 수 없습니다. 이 정도면 로그인을 하나 안 하나 별 차이가 없네요.
에디터를 사용해 read 권한을 주어 보았습니다. 이제 알림판 메뉴가 나옵니다.
관리자 화면입니다. 자신의 프로필 외에는 볼 것이 없습니다. 진짜 아무것도 할 수 없는 맨몸이죠?
포스트 보기
이제 포스트 위주로 권한을 불려 나가보고자 합니다. 커스텀 포스트와 깊은 관련이 있기도 하고 이 쪽의 권한을 잘 이해하면 다른쪽은 수월한 편입니다.
우선 멤버가 포스트 목록을 접근할 수 있도록 하려고 합니다. 이 때 필요한 권한은 ‘edit_posts‘입니다. 이 권한을 가지면 포스트 목록에 접근할 수 있으며, 새 글을 작성할 수 있습니다.
글(post)을 작성할 수 있게 되었네요! 새 글 쓰기 화면으로 들어가 보겠습니다.
아, 그러나 아직 권한이 부족하여 글을 발행(publish)할 수는 없습니다. 더 높은 권한을 가진 사람의 승인이 있어야 글이 공개적으로 발행될 수 있습니다. 그리고 ‘상태’와 ‘가시성’ 둘다 선택할 수 있는 여지가 없습니다. 아무튼 글을 등록하고 목록으로 돌아옵니다.
권한별로 글 목록 화면 비교
멤버의 목록 화면입니다.
타인이 작성한 포스트를 편집할 권한이 없어 기본적으로 자기 글을 필터링하는 것이 기본 동작입니다.
위 그림처럼 전체 목록을 나오게 할 수는 있지만, 자신 이외의 글은 편집할 수 없습니다. 편집 불가인 항목은 제목의 색깔이 회색입니다.
그러나 사실 멤버는 모든 포스트 목록을 보고 있는 것이 아닙니다. 같은 시각, 관리자는 글 목록을 아래처럼 보고 있었습니다.
멤버가 보는 포스트 총 개수는 5개, 관리자는 7개의 포스트를 보고 있습니다. 관리자는 편집자의 비공개 포스트 (2번째 줄), 작가의 비공개 포스트 (3번째 줄)를 더 보고 있기 때문입니다. 물론 관리자라 각 포스트를 맘대로 할 수 있는 권한이 있구요.
글 지우기
참고로 현재 멤버의 권한은 기여자(contributor)와 별반 다를 것이 없습니다. 글을 작성할 수는 있되, 모든 글은 상위 권한을 가진 사용자의 승인이 있어야만 합니다. 한 가지 다른 점은, 기여자는 자신의 글을 삭제할 수는 있지만 멤버는 그마저도 불가능합니다. 글을 지울 수 있는 권한이 부여되지 않았기 때문입니다.
그림에서 보는 것처럼 글을 지우는 항목이 없습니다. 에디터를 사용하여 ‘delete_posts‘ 권한을 부여하면 멤버는 자신의 글을 삭제하는 것이 가능해집니다.
글 공개하기
이제 멤버가 글을 공개할 수 있도록 만들어 볼 것입니다. 간단합니다. publish_posts 권한을 주면 됩니다.
그러면 이제 ‘공개하기’ 버튼이 나오게 되고, 멤버는 ‘상태’나 ‘가시성’, 공개 시점도 자유롭게 조절할 수 있게 됩니다.
글을 공개하고 목록으로 돌아옵니다. 그런데, 글을 재차 편집할 방법이 없군요? 당연지사 권한 부족 때문이겠죠.
발행한 글 편집
권한 목록을 보면 ‘edit_published_posts‘라는 항목이 따로 있습니다. 이 권한이 없다면, 낙장불입입니다. 글 발행이 이메일 보내기처럼 무시무시(?)할 것 같습니다.
edit_published_posts 권한을 주고 나니 편집이 가능해집니다. 그러나 삭제 관련 메뉴는 여전히 볼 수 없습니다.
발행한 글 삭제
delete_published_posts 권한을 주면 됩니다.
다른 이의 글까지 관리
찬찬히 글을 읽으신 분은 권한 문자의 규칙을 이해하실 수 있을 겁니다. ‘delete_’로 시작하면 글을 삭제하는 권한, ‘edit_’로 시작하면 글을 작성, 수정하는 권한입니다. 중간에 ‘published_’가 붙은 권한이 있어야 발행된 글에 대해 점진적인 수정이 가능합니다. posts로 끝나면 포스트에 대해 권한을 행사한다는 뜻입니다. 비슷하게 ‘pages’로 끝나면 페이지에 대한 권한 설정입니다. 포스트나 페이지나 근본적으로 별 차이가 없으니 페이지까지 일일이 해킹하는 것은 생략하도록 할께요.
이제 멤버는 자신의 글 뿐만 아니라 다른이의 글도 편집하기를 원합니다. 이 때 필요한 것이 ‘others_’가 붙은 권한들입니다. 포스트에 대해 ‘edit_others_posts‘, ‘delete_others_posts‘ 두 가지 권한이 있습니다. 이 두 권한에 체크를 하면 다른 글쓴이가 작성한 글을 편집하거나 지우는 것이 가능해집니다.
멤버는 다른 글쓴이의 글도 편집하거나 삭제가 가능합니다. 이 수준까지 가능한 역할은 편집자(editor)입니다. 그러나 아직 편집자와 대등한 수준은 아닙니다. 왜냐하면 아직 멤버는 타인의 비공개 포스트를 건드릴 권한이 부족하기 때문입니다. 좀 더 위에서 언급한 바 있습니다. 관리자가 보는 포스트는 모두 7개입니다. 편집자와 작가가 각각 비공개로 포스트를 작성중이기 때문입니다. 반면 여전히 멤버는 5개의 포스트를 보고 있습니다.
타인의 비공개 포스트까지 관리
멤버는 비공개 포스트까지 완전히 장악할 것입니다. 우선 자신의 비공개 포스트는 관련이 없습니다. 자기 소유니까요. 문제는 다른 이의 비공개 포스트입니다. 가장 먼저 ‘read_private_posts‘ 권한이 필요합니다. 이 권한을 통해 멤버는 타 소유 포스트를 읽을 수 있습니다.
비공개 포스트를 읽거나 삭제하는 권한은 ‘edit_private_posts‘, ‘delete_private_posts‘입니다. 중요한 점은, 이 두 권한은 다른 여러 권한에 의존적입니다.
- read_private_posts 권한에 의존합니다. 읽을 수도 없는 글을 편집, 삭제할 수는 없으니까요.
- 마찬가지로 edit_others_posts, delete_others_posts 권한에도 의존적입니다. 타인의 포스트를 편집, 삭제는 가능해야 하니까요.
- 단, edit_published_posts, delete_published_posts와는 독립적입니다. 만약 edit_private_posts 권한이 있지만, edit_published_posts 권한이 없다면 비공개 포스트만 편집할 수 있고, 공개 포스트는 안 됩니다.
여기까지 권한이 상승되었으면 이제는 편집자와 필적할 수준이 되었습니다.
포스트와 관련된 권한 나머지
User Role Editor에 의하면 포스트와 관련된 권한은 총 13개입니다. 10가지는 이미 체크를 마쳤습니다. 이제 나머지 3개에 대한 설명을 해야겠네요.
create_posts 권한
이것은 코덱스에서도 언급되지 않고 거의 사용되지 않는 권한입니다. edit_posts가 이 권한을 사실상 대치한다고 보면 됩니다.
manage_categories 권한
‘manage_categories’ 권한이 있어야 카테고리, 태그 메뉴에 접근할 수 있습니다. 즉 택소노미 관리 권한입니다. 그러나 이 권한이 없어도 포스트에 태그를 넣거나 이미 이 존재하는 카테고리를 지정하는 것은 가능합니다.
moderate_comments 권한
댓글 반려를 자동으로 통과하는지 말지를 결정하는 권한입니다. 이 권한이 동작하는지 확실히 알아보려면 ‘설정 > 토론’ 메뉴에서 ‘댓글은 수동으로 승인돼야 합니다’ 항목을 체크하는 것이 좋습니다. 왜냐하면 자동 승인을 하는 경우 로그인한 사용자에 대해서는 워드프레스가 적당히 자동으로 반려하여 승인 처리를 합니다. 그러면 이 권한이 동작할 여지가 없습니다.
수동 승인 상태에서 타인이 쓴 글에 댓글을 달아 봅니다. 만약 moderate_comments 권한이 있다면 바로 승인이 될 것이고, 그렇지 않다면 로그인한 사용자라도 반려 단계를 거쳐야만 합니다.
위의 댓글은 권한이 없을 때 단 것입니다. 검토 단계를 밟는다는 메시지가 있는 것을 볼 수 있습니다.
또 이 권한이 있다면 관리자 화면 댓글 메뉴에서 스팸 댓글을 일괄적으로 비우는 버튼을 볼 수 있기도 합니다. 그 외 이것은 워드프레스 이곳저곳에서 댓글 승인과 관련된 작업과 관련되어 있습니다. moderate_comments 권한에 관한 설명은 여기까지 하고 더 자세한 사항은 다른 블로그 포스트를 참고하는 것이 좋을 것 같습니다.
나머지 권한에 대해
포스트에 관련 권한 외의 다른 권한들은 사실 그 종류는 다양하지만 위에서 예를 든 사항을 참고하면 어려운 것은 별로 없습니다. 그리고 User Role Editor가 나누어 놓은 분류의 도움을 받으면 더욱 쉽게 파악이 가능합니다. 아래 그림은 코어의 권한 목록을 나열한 것입니다. 포스트와 페이지는 거의 동일하여, 페이지는 생략했습니다. 중복되는 항목도 일부 존재합니다.
일반 12항목
- edit_dashboard
- export
- import
- manage_categories
- manage_links
- manage_options: 옵션 설정과 관련된 권한입니다. 플러그인에서 커스텀 메뉴를 만들 때 단골로 쓰는 권한입니다.
- moderate_comments: 포스트의 moderate_comments와 동일한 권한입니다.
- read: 포스트의 read와 동일합니다.
- unfiltered_html
- unfiltered_upload
- update_core
- upload_files
테마 6항목
- delete_themes
- edit_theme_options
- edit_themes
- install_themes
- switch_themes
- update_themes
플러그인 5항목
- activate_plugins
- delete_plugins
- edit_plugins
- install_plugins
- update_plugins
사용자 6항목
- create_users
- delete_users
- edit_users
- list_users
- promote_users
- remove_users
마치며
예전에 커스텀 포스트와 관련하여 커스텀 포스트의 커스텀 권한을 설정하려고 무작정 달려들었다가 제대로 설정이 안 되어 포기하고 기본 값으로 놔두고 넘어간 적이 있었습니다. 지금도 RC에 대해 정밀하게 운영하는 것은 참 힘들다고 생각합니다. 그래서 아는 것도 다시 한 번, 돌다리도 두들겨 보고 가자는 느낌으로 복습하면서 포스팅을 하였습니다.
해외에는 워드프레스의 고급 기능에 관한 포스팅을 심심찮게 볼 수 있는데 반해, 국내에서는 이 이상 상세하고 자세하게 RC 같은 것들을 연구 분석하는 포스팅이 드물어 아쉬운 마음에 글을 써 보았습니다. 그리고 개인적으로 RC에 있어 더 중요한 개념은 map_meta_cap()에서 보이는 기본 권한(primitive capability)과 메타 권한(meta capbility)이라고 생각합니다. 이것들은 차후 포스팅에서 다루고자 합니다.
좋은 글 잘 봤습니다.^^
항상 연구하고 공부하는 남팀장님 멋있습니다.