[ Architecture, Technology ,Web ] SSO(Single Sign On) 그리고 SAML에 대해

이미지
이번 프로젝트 내부에서 어쩌다보니  유저 인증 관련 업무를 담당하게 되었고, 해야하는 업무는 내부에 사용했던 적이 없던  새로운 개발 플랫폼에서  SSO의 프로토콜 중  SAML을 이용해 앱의 인증을 구현해야만 했다. SSO를 생각해본적 조차 없는 상황에 이를 새로운 개발 플랫폼에 도입해야 했기 때문에 많은 시행착오를 겪었으나 구현에 성공하였으며 덕분에 SSO에 대한 전반적인 지식을 쌓을 수 있었다. 이번에는 그러한 과정에서 나온 지식들과 경험을  공유하고자 한다. SSO에 대한 정의 먼저 사전적 정의 부터 살펴보자. 다만, 기술적인 용어다보니 자주 사용하는 옥스포드 사전에 정의를 찾을 수 없기 때문에  검색으로 찾을 수 있는 정의를 몇 가지 살펴보고 교차 검증을 해보자. 첫 번째 정의를 살펴보자. Single sign-on (SSO) is an identification method that enables users to log in to multiple applications and websites with one set of credentials.  SSO는 웹사이트에서 한 번의 인증(one set of credentials)으로 복수의 어플리케이션에 로그인 할 수 있는 인증(identification) 방법(method) 이다. 두 번째는 위키피디아의 정의이다. Single sign-on (SSO) is an authentication scheme that allows a user to log in with a single ID to any of several related, yet independent, software systems. SSO는 독립적이지만 연관되어있는 몇몇 소프트웨어에 대해 하나의 ID로 로그인을 할 수 있도록 하는 인증 구조(scheme) 세부 설명에 조금 차이가 있어 보이지만 전체적인 틀은 매우 비슷해 보인다.  몇 가지 포인트가 되는 단어를 추출해 이를 연결해보자면 아래와 같은 의미를 산출 할 수 있다. 독립적이지만 연관되어 있

[ Django, Python ] mozilla 튜토리얼 예제로 살펴보는 Django 분석 ⑦ - 4 : Permissions(권한)

권한은 Model과 연결되어 있으며, 
권한이 있는 사용자만이 
Model 객체(Instance)에 접근 할 수 있도록 정의할 수 있다.

Django에서는 기본적으로 모든 Model
Add, Change delete 권한을 자동으로 부여하기 때문에
이 권한이 있는 사용자는 관리자 사이트에 접근할 수 있다.

① Model


class Meta Model에  
permissions 필드 추가하여 권한을 부여할 수 있다.

permissions 필드 안에는 권한 이름, 
권한 표시 값(permission display value)이 저장 된다.

class BookInstance(models.Model):
    ...
    class Meta:
        ...
        permissions = (("can_mark_returned", "Set book as returned"),)   
예를 들어, 사용자가 위와 같이 책이 
반환되었음을 표시하는 권한을 정의할 수 있다.

위의 코드를 catalog/ 경로에 있는 models.py 파일에 



빨간색 박스와 같이 코드를 추가해보자.

② Template


현재 사용자의 권한은 {{ perms }} 라는 템플릿 변수에 저장된다.

{% if perms.catalog.can_mark_returned %}
    <!-- We can mark a BookInstance as returned. -->
    <!-- Perhaps add code to link to a "book return" view here. -->
{% endif %}
예컨대 
Model에서 정의한 can_mark_returned라고 
이름을 정의한 Permission은 

위와 같이 {% if perms.catalog.can_mark_returned %}를 사용하여 확인 할 수 있다.

③ View


Permission은 Function 기반의 permission_required 데코레이터(Decorator) 또는
Class 기반의 PermissionRequiredMixin 사용해 정의할 수 있다.

from django.contrib.auth.decorators import permission_required

@permission_required('catalog.can_mark_returned')
@permission_required('catalog.can_edit')
def my_view(request):
    ...
Function 기반의 permission_required 데코레이터(Decorator)의 경우 
위와 같이 사용할 수 있으며

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View):
    permission_required = 'catalog.can_mark_returned'
    # Or multiple permissions
    permission_required = ('catalog.can_mark_returned', 'catalog.can_edit')
    # Note that 'catalog.can_edit' is just an example
    # the catalog application doesn't have such permission!
Class 기반의 PermissionRequiredMixin의 경우
위와 같이 사용이 가능하다.



이 블로그의 인기 게시물

[ Web ] 웹 애플리케이션 아키텍처 (Web Application Architecture)

[ Web ] 서버 사이드(Sever Side) ? 클라이언트 사이드(Client Side)? 1 [서론, 클라이언트 사이드(Client Side)]

[ Web ] 웹 애플리케이션? 웹 사이트?(Web Application? Web Site?)