[ 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 분석 ① : 프로젝트 만들기



프로젝트를 만들기 앞서서 
이번 2번째 튜토리얼에서는 꽤나 생략되는 부분이 있을 수 있다.
따라서
MVT 패턴에 대한 것과
공식 도큐먼트 튜토리얼 쪽을 먼저 이해한 다음 
이 포스팅을 보는 것이 좀 더 
직감을 얻어가는데 수월할 것이라 생각된다.

개발 환경 포스팅:

MVC 패턴과 MVT 패턴에 대한 포스팅:

공식 도큐먼트 튜토리얼 포스팅:

또한 여기서 작성한 코드들은 아래 링크에서 확인해볼 수 있다.

프로젝트 생성 하기


그럼 이제 프로젝트를 생성하기 위해
먼저 터미널을 열어 가상 환경으로 들어가자.



개발 환경에 대해서는 
공식 도큐먼트의 포스팅과 동일하기에 
위의 개발 환경 포스팅을 참고 하기 바란다.

그런 다음 새로운 프로젝트를 생성하고
생성한 디렉토리로 진입한다.


1
2
django-admin startproject locallibrary
cd locallibrary
cs



그런 다음 Atom을 실행해 프로젝트를 불러오자.


불러오기에 성공했다면,
방금 생성했던 locallibrary라는 
프로젝트가 추가된 것을 확인할 수 있다.

catalog application(App) 만들기


그렇다면 이 프로젝트 내부에 앱을 하나 만들자.


1
python3 manage.py startapp catalog
cs

성공적으로 앱을 만들었다면 
Atom에 자동적으로 갱신될 것이다.


위의 사진과 같이 catalog라는 디렉토리가 
생성된 것을 확인 할 수 있다.

catalog Applictaion 등록 하기


단순히 앱을 만들기만 했다면 
아무런 의미가 없다.

왜냐하면
서버를 구동한다고 한다하더라도
접속은 불가능하기 때문이다.

따라서 프로젝트를 생성한 다음
자동으로 생성되는 
디폴트 디렉토리(locallibrary)에 연결해주어야 한다.


1
'catalog.apps.CatalogConfig',
cs

이 코드를 입력함으로 써 
이제 catalog 앱과 연동될 수 있는데


정확히는
catalog 디렉토리의 apps.py안의 
CatalogConfig라는 클래스와 연동된다.

데이터베이스 설정하기


다음은 데이터베이스 설정이다.

이전 공식 도큐먼트 튜토리얼과 마찬가지로 
SQLite를 사용할 것이기 때문에 추가적인 코드는 없다.


프로젝트 그 외 설정


settings.py 파일 안에는 
DB설정 외에도 많은 설정이 있다.

일단 가장 중요한 TIME_ZONE 변수이다.


TIME_ZONE의 지역에 따라서 
시간 관련 메소드의 현재 시간이 
결정되기 때문에 가장 중요하다.

나는 튜토리얼이기 때문에 따로 수정하지는 않겠다.


그 외에 알아둘 필요가 있는 변수라면
SECRET_KEY 변수와 DEBUG 변수다.

먼저 SECRET_KEY 변수는 
Django의 보안 중 하나로 사용되는 비밀 키 이다.
유출되지 않도록 하는것이 좋으며,

개발 과정에서 잘 관리하지 않는다면
제품화 과정에서 다른 방법을 사용해야 할 것이다.

그 다음으로 DEBUG 변수다.

DEBUG 변수는 에러가 발생했을 때
HTTP 상태 코드 응답 대신
디버깅 로그표시되도록 한다.

지금은 디폴트 설정으로 True로 되어있지만,
디버깅 정보는 웹사이트를 해킹하려는
해커들에게 매우 유용한 정보가 될 수 있기 때문에

제품화 된 환경에서 개발하고 있다면 
False로 설정해야 한다.

URL Mapper 연결 하기


하나의 프로젝트가 새로 생성되면
같은 이름의 디폴트 앱이 자동으로 생성되는데
그 때 URL mapper 파일인 urls.py가 같이 생성 된다.


URL Mapping은 path() 함수의 
list 변수urlpatterns에 의해 관리된다.

path() 함수패턴이 일치 할 때 마다
지정된 View에 URL 패턴을 연결하거나,

다른 URL 패턴테스트 코드 목록에 연결 하는데
이 경우 패턴은 대상 모듈에서 
정의된 패턴의 기본 URL이 된다.

그럼 이제 catalog 앱과 연동해보자.


1
2
3
4
5
6
7
# Use include() to add paths from the catalog application 
from django.conf.urls import include
from django.urls import path
 
urlpatterns += [
    path('catalog/', include('catalog.urls')),
]
cs

다음으로 127.0.0.1:8000을 
127.0.0.1:8000/catalog/로 
리다이렉트 하도록 하기 위한 코드를 추가해보자.


1
2
3
4
5
from django.views.generic import RedirectView
 
urlpatterns += [
    path('', RedirectView.as_view(url='/catalog/', permanent=True)),
]
cs

Django는 기본적으로 CSS, JavaScript 그리고 
이미지와 같은 정적 파일을 제공하지 않지만,
웹 개발에 있어서 빠질수 없는 요소이기 때문에 
정적 파일들을 제공할 수 있도록 코드를 추가해 보자.


1
2
3
4
5
# Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static
 
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
cs

위에서 urlpatterns 변수를 
계속해서 +=연산으로 추가해줬지만
리스트 안에 넣는 방법도 있다.

사실 대개 리스트 안에 넣지만,
좀 더 명백히 구분하기 위해 +=연산을 사용했다.

따로 따로 분류해놨던 것을 
리스트안에 넣는 다면 최종적으로 아래와 같이
될 것이다.

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from django.conf.urls.static import static
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('catalog/', include('catalog.urls')),
    path('', RedirectView.as_view(url='/catalog/', permanent=True)),
 
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 
# urlpatterns += [
#     path('catalog/', include('catalog.urls')),
# ]
#
# urlpatterns += [
#     path('', RedirectView.as_view(url='/catalog/', permanent=True)),
# ]
#
# urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
cs


마지막으로 

catalog 디렉토리 안에 urls.py라는 파일을 만들고 
아래와 같은 코드를 작성하자.


1
2
3
4
5
6
7
from django.urls import path
from catalog import views
 
 
urlpatterns = [
 
]
cs


웹 사이트 뼈대 테스트 하기


여기까지 해서 
Django의 기본적인 틀을 잡았다고 할 수 있다.

물론 실질적으로 아무것도 
만든 것이 없다고 해도 말이다.

바로 또 다른 앱을 작성하는 것도 좋지만
그전에 서버가 제대로 돌아가야 하는지 확인 해봐야 한다.

처음부터 확인하지 않아 
나중에 큰 에러를 야기할지는 아무도 모르기 때문에 
가급적 리스크는 줄여주는것이 좋다.

①데이터베이스 마이그레이션(migration) 실행하기


공식 도큐먼트 튜토리얼에서도 
언급했던 걸로 기억한다.

Django는 ORM
(Object - Relational - Mapper : 객체 - 관계 - 매퍼)를 사용하여 
Django 프로젝트 코드 안에 있는 모델 정의를 
데이터베이스에서의 데이터 구조에 매핑한다.

모델의 정의를 바꿀 때 마다,
장고는 변화를 추적해서

데이터베이스 안의 기본 데이터 구조가 
모델과 일치하도록 
자동적으로  마이그레이트(migrate)하는 
스크립트를 생성할 수 있다.

아직 아무런 모델을 만들지는 않았지만
프로젝트를 생성할 때 애플리케이션 관리 앱이 
자동적으로 추가되기 때문에 

애플리케이션 관리앱 관련 모델들을 정의하기 위해 
cmd에 아래와 같이 명령어를 실행해보자.


1
2
python manage.py makemigrations
python manage.py migrate
cs

makemigrations 명령어는
프로젝트에 있는 모든 앱에 대한
migration들을 생성하지만, 적용하지 않는다.

migrate 명령어는 migration들을 데이터베이스 적용한다.

②웹 사이트 실행하기


마이그레이션 명령어를 실행했다면
이제 웹 서버를 실행해보자.


1
python manage.py runserver
cs

웹 서버 가동 후
웹 브라우저에 127.0.0.1:8000의 주소로
접속해보자.


이런 에러가 난다면 지극히 정상이다.

왜냐하면 우리는 아직 
Model, View, Template을 작성한 적이 없기 때문이다.

다만 빨간색 박스와 같이 
127.0.0.1:8000으로 접속했는데,
127.0.0.1:8000/catalog/로 접속된 이유는

이전에 127.0.0.1:8000으로 접속시
127.0.0.1:8000/catalog/로 리다이렉트 되도록 
아래와 같이 urls.py 파일을 코딩을 했기 때문이다.



이 블로그의 인기 게시물

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

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

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