[ 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 : 책 목록 페이지 만들기


책 목록 Page


책 목록 페이지는 
모든 사용 가능한 책 레코드들의 목록을 페이지 안에 나타낼 것이다.

해당 페이지는 catalog/books/로 접근하며,
각 레코드마다 제목과 저자를 나타내고
제목은 관련된 책 페이지로 이동하게 끔 하이퍼 링크 처리를 할 것이다.

① URL Mapping


/catalog/urls.py 파일을 열어 아래와 같이 코드를 추가한다.


urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
]
이전 공식 도큐먼트 튜토리얼에서도 사용했던 
Java의 인터페이스와 비슷하게 
Django에서 지원하는 오버라이딩 할 수 있는 제네릭 뷰이다.

Django의 클래스 기반 View에서는 as_view() 클래스 메소드를 호출해
적절한 View함수에 접근할 수 있다.

② View(클래스 기반)


catalog/views.py 파일에 아래와 같은 코드를 추가해보자.


from django.views import generic

class BookListView(generic.ListView):
    model = Book
이제 코딩한 모델 Book으로 부터 모든 레코드를 가져오기 위해
데이터베이스를 쿼리할 것이다.

역시 함수 기반보다 클래스 기반의 제너릭 뷰가 
확실히 깔끔하다는 것을 느낄 수 있다.

class BookListView(generic.ListView):
    model = Boo
    context_object_name = 'my_book_list'   # your own name for the list as a template variable
    queryset = Book.objects.filter(title__icontains='war')[:5] # Get 5 books containing the title war
    template_name = 'books/my_arbitrary_template_name_list.html'  # Specify your own template name/location
또한 같은 모델을 사용하지만
여러 개의 뷰를 사용해야 하는 경우 혹은
book_list 템플릿 변수명이 마음에 들지 않는 경우,

위와 같이 다른 템플릿의 파일을 명시할 수 도 있다.

③ 클래스 기반 뷰의 메소드 오버라이딩


위에서 잠깐 언급했듯이 
메소드 오버라이딩도 가능하다.

class BookListView(generic.ListView):
    model = Book

    def get_queryset(self):
        return Book.objects.filter(title__icontains='war')[:5] # Get 5 books containing the title war
예를 들어,
get_queryset() 메소드를 오버라이딩 해 
반환되는 레코드 리스트를 
위와 같이 바꿀 수도 있다.

또한 템플릿에 추가적인 컨텍스트 변수들을 전달하기 위해

class BookListView(generic.ListView):
    model = Book

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get the context
        context = super(BookListView, self).get_context_data(**kwargs)
        # Create any data and add it to the context
        context['some_data'] = 'This is just some data'
        return context
get_context_data() 함수를 오버라이딩 할 수도 있다.

이에 대한 자세한 사항은
아래 링크의 공식 도큐먼트를 참고하기 바란다.

④ 리스트 뷰 템플릿 생성하기


/locallibrary/catalog/tempates/catalog/book_list.html 경로에
아래와 같이 파일 및 코드를 추가해보자.


{% extends "base_generic.html" %}

{% block content %}
  <h1>Book List</h1>
  {% if book_list %}
  <ul>
    {% for book in book_list %}
      <li>
        <a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
      </li>
    {% endfor %}
  </ul>
  {% else %}
    <p>There are no books in the library.</p>
  {% endif %}       
{% endblock %}

⑤ 조건부 실행


if, else 그리고 endif 템플릿 태그들은 
book_list가 정의되었는지,
그리고 존재하는지 체크할 수 있다.

{% if book_list %}
  <!-- code here to list the books -->
{% else %}
  <p>There are no books in the library.</p>
{% endif %}
위의 조건문에 elif를 추가한다면 
추가적인 조건을 걸 수 있다.

⑥ 반복 구문


{% for book in book_list %}
  <li> <!-- code here get information from each book item --> </li>
{% endfor %}
for와 endfor 라는 템플릿 태그들은 
위와 같이 도서 목록을 살펴보기 위해 사용할 수 있다.

⑦ 변수 접근


반복 구문 내에서의 코드는 
각 책에 대한 리스트 아이템을 생성한다.

이 리스트 아이템은 타이틀과 작가 이름을 나타낸다.

<a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})

⑧ 베이스 템플릿 업데이트

base_generic.html에 아래와 같이 코드를 추가한다.


<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="{% url 'books' %}">All books</a></li>
<li><a href="">All authors</a></li>






이 블로그의 인기 게시물

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

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

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