[ 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 분석 ⑧ : 나만의 추가 도전 과제 - 1

도전 과제는 이전 게시글로서 끝이지만
나는 여기서 한 발짝 더 나가고 싶은 욕망이 생겼다.

그 욕망의 내용은 아래와 같다.


바로 Admin 권한을 가진 User들만 볼 수 있고 사용할 수 있는
Admin Permission 기능이다.

이 기능들은 위의 사진과 같이

빌린 책들의 목록을 보고 수정이 가능한
All borrowed에서 이름을 바꾼 
Borrowed Management와 

모든 책들을 추가, 수정, 삭제할 수 있는 
Book Management

마지막으로
모든 작가들을 추가, 수정, 삭제할 수 있는
Author Management이다.

이런 기능을 구현하기 위해
다음과 같은 프로세스를 거칠 필요가 있다.

Borrwoed Management는 이름만 바꾸면 되고,

Book Management는 
먼저 디폴트 화면은 모든 책의 리스트를 보여주고
이 책의 각각의 요소들을 수정, 삭제가 가능하며
하단에는 추가도 할 수 있는 기능을 제공하게 한다.

Author ManagementBook Management와 동일하게
디폴트 화면은 모든 작가들의 리스트를 보여주고
이 작가들의 각각 요소들을 수정, 삭제 가능하며
하단에는 추가도 할 수 있는 기능을 제공하게 하는 것이 목표이다.

이를 구현하기 위한 Model, View, Template
각각 아래와 같은 솔루션으로 구현한다.

Model : 기존 Model들을 참고

View : 요소 리스트는 Function 기반,
추가,수정,삭제는 제너릭 편집 View 이용

Template : 요소 리스트는 Function 기반이기 때문에
이전 코드 참고

추가, 수정, 삭제는 제너릭 편집 View를 이용 하기 때문에
관련 코드 참고

먼저 All Borrowed를 Borrwoed Management로 바꿔보자.

이는 매우 간단한데,
먼저 catalog/templates/ 경로에 있는 


base_generic.html 파일을 
위와 같이 수정해 주기면하면 된다.

물론 이름이 바뀌면 가급적 
URL 이름을 포함해 관련 함수들의 이름도 
바꿔주어야 하는 것이 가독성 향상에 도움이 되겠지만

이는 시간 상 고려하지 않고 넘어가기로 하겠다.

엔터프라이즈 급의 배포용 애플리케이션이라면 하는 것이 좋을 것이다.


          <!-- <li><a href="{% url 'all-borrowed' %}">All borrowed</a></li> -->
          <li><a href="{% url 'all-borrowed' %}">Borrowed Management</a></li>
          <li><a href="{% url 'manage-book' %}">Book Management</a></li>
          <li><a href="{% url 'manage-author' %}">Author Management</a></li>

이 곳을 수정하는 김에 위와 같이
Book ManagementAuthor Management도 추가해보자.

물론 여기서 화면에 표시되는지 확인해볼 수는 없다.


왜냐하면 아직 Model, View, Template를 작성하고
URL에 추가하지 않았기 때문이다.

이제 본격적으로 기능을 작성해보자.

먼저 Book Management부터 해보자.

Book Management 구현

Model은 이미 만들어져 있기 때문에
만들어야 될 것은 View와 Template 뿐 이다.

선행으로 만들어야 할 View와 Template는
모든 Book List를 보여주는 View와 Template이다.

이것부터 작성해보자.

다만 이 부분은 따로 크게 작성할 필요는 없다.

왜냐하면 이전에 이미 이 관련 코드를 작성했기 때문이다.

따라서 View나 Template는 크게 바뀌지 않아도 될 것이다.

다만, Template의 경우에는 일반적인 User
권한이 있는 User와의 보여지는 것이 달라지기 때문에
파일을 추가해 작성할 필요가 있다.


① View



따라서 각 디폴트 화면(Template)의 View는 
위의 화면과 같이 
기존에 작성되어 있는 제너릭 View를 참고해 사용하면 될 것 같다.


class ManagementBookListView(generic.ListView):
    model = Book
    template_name = 'catalog/manage_book_list.html'
    paginate_by = 5

class ManagementAuthorListView(generic.ListView):
    model = Author
    template_name = 'catalog/manage_author_list.html'
    paginate_by = 5
따라서 위와 같은 제너릭 View코드를 작성할 수 있다.

단, 이번에는 template_name 필드를 정의할 필요가 있는데
이 필드를 추가하지 않으면 Model명을 기반으로 하여
Django가 자동으로 매칭시켜주기 때문이다.

template_name 필드를 정의하지 않을 경우
위의 두 클래스의 경우는 각각 book_list.html과
author_list.html이 매칭될 것이다.

② Template


우선적으로 추가해야할 Template는 
각 기능의 디폴트 페이지 Template이다.

즉, 링크를 누를 경우 나타나며,
추가, 삭제, 수정 했을 경우 리다이렉트될 페이지를 
우선적으로 구현해야 한다.

먼저 모든 책의 목록은 아래와 같이
catalog/templates/catalog/ 경로에


{% extends "book_list.html" %}
manage_book_list.html 파일을 생성하고 
위와 같은 코드를 추가 한다.

여기서 book_list.html 파일은 
이전에 작성했던 모든 책 리스트를 보여주는 Template이다.

동일하게 모든 작가의 목록은 아래와 같이
catalog/templates/catalog/ 경로에


{% extends "book_list.html" %}
manage_author_list.html 파일을 생성하고 
위와 같은 코드를 추가 한다.

여기서 author_list.html 파일은 
이전에 작성했던 모든 작가 리스트를 보여주는 Template이다.

③ URL 


작성한 View를 url에 이어보자.

catalog/ 경로에 


    # Addmin Management URLS
    path('manage-book/', views.ManagementBookListView.as_view(), name='manage-book'),
    path('manage-author/', views.ManagementAuthorListView.as_view(), name='manage-author'),
urls.py 파일에 위와 같은 코드를 추가하자.

④ Test


그렇다면 이제 
정상적으로 작동하는지 확인해보자.

홈 페이지를 확인해보자.

위의 화면과 같이 의도 한대로
Borrowed Management, Book Management, Author Management
가 표시되는 것을 확인할 수 있으며,

위와 같이 전체 책 리스트와 전체 작가 리스트가 
정상적으로 출력되는 것을 확인할 수 있다.

다음은 이 페이지에 추가, 수정, 삭제 기능을 만들면 된다.


이 블로그의 인기 게시물

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

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

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