[ 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 ] 튜토리얼 예제로 살펴보는 Django 분석 ② : Model 생성 과 마이그레이션 생성, 활성화, 적용

DB 설치


Settings.py 파일에는 Django의 설정을 모듈 변수로 표현한 Python 모듈이다.

기본적으로 SqLite를 사용하도록 구성되어 있다.

따라서 데이터베이스를 처음 경험해보거나, Django를 처음 사용해본다면
Django에서 기본적으로 제공하는 SQLite를 사용하는 것도 나쁘지 않은 선택이다.

다만, 나중에 데이터베이스를 교체하느라 골치 아플지도 모르기 때문에, 좀 더 확장성이
있는 데이터베이스를 사용하는 것이 좋다.

이번은 튜토리얼 이기 때문에 SQLite를 사용하도록 하겠다.

settings.py - TIME_ZONE 변수


먼저 Settings.py 파일에 TIME_ZONE 변수를 시간대에 맞춰서 설정해 줄 것이다.
단, 이번과 같이 가상서버로 서버를 구동한다면 defalut값인 UTC를 사용해야 한다.

특히 윈도우라면 본인 운영체제에 맞는 시간을 사용해야 한다.



이에 대해 공식 도큐먼트에서는 위와 같이 설명한다.




나는 한국의 서울 기준으로 하기로 했다.



settings.py – USE_I18N 변수


Django의 변역 시스템을 활성화 할지를 결정하는 부울 변수이다.

이 값이 False로 설정되어 있으면, Django가 번역을 하지 않도록 해
프레임워크를 최적화 할 수 있다.


settings.py – USE_L10N 변수 


나라에 맞게 로케일 된 데이터 형식을 사용할지를 결정하는 부울 변수이다.


이 값이 True로 설정되어 있으면, TIME_ZONE의 로케일 형식을 사용하여 숫자와 날짜를 표시한다.

settings.py – INSTALLED_APPS 변수 

프로젝트를 생성한 후에, INSTALLED_APPS 변수에는 기본적으로 포함된다.

해당 앱의 내용은 아래의 사진과 같다.


이런 앱들 중 하나 이상의 데이터베이스 테이블을 사용하므로 
데이터베이스에서 테이블을 사용하기 때문에 
마이그레이션을 작성해야 사용할 수 있다.

마이그레이션 생성은 아래와 같은 명령어를 입력해야 한다.

python manage.py migrate

migrate명령어은 INSTALLED_APPS설정을 확인하고 
settings.py파일의 데이터베이스 설정 및 앱과 함께 제공된 
[1]데이터베이스 마이그레이션(the database migrations)에 따라 필요한 데이터 베이스 테이블을 만든다.

또한 적용되는 각 마이그레이션에 대한 메시지가 표시된다.


실제 migrate 명령어를 실행해보면 위의 사진과 같이 로그가 화면에 표시된다.

모델 만들기

이제 모델을 정의해 보려고한다.

여기서 모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조를 말한다.

Django는 고유한 개념 및 데이터는 단 한 번, 단 한 곳에 존재하는 DRY라는 원칙의
철학을 강조한다.

따라서 데이터 모델을 한곳에서 정의하며, 이것으로부터 자동으로 무언가를 유도하는
것이 목표라고 한다.

또한 Django는 모델(Model) Ruby On Rails와 달리 마이그레이션이 포함된다.

따라서 이 마이그레이션은 모델 파일에서 파생되며, 
기본적으로 Django는 현재 모델과 일치하도록 데이터베이스 스키마를 업데이트 하기 위해 
롤 오버(roll through)할 수 있다.

여기서는 설문 조사앱에 질문선택이라는 두 가지 모델을 만들 것 이다.

질문에는 질문출판 날짜가 있고, 선택에는 선택 텍스트투표 집계라는
각 두 가지 필드가 존재한다.

이 모델들은 아래와 같이 python 클래스로 프로그래밍 되어진다.



여기서 각 모델은 django.db.models.Model을 서브 클래스하는 클래스로 표시된다.

여기서 각 모델에는 여러 클래스 변수가 있으며, 각 변수는 모델의 데이터베이스 필드를 나타낸다
, 이 변수명을 데이터베이스에서는 컬럼명으로 사용할 것 이다.

따라서 Question클래스의 경우는 question_text(char ), pub_date(DateTime )이 데이터베이스 필드가,

Choice 클래스의 경우는 question, choice_text(char ), votes(Integer )가 데이터베이스 필드가 된다.

Field클래스의 경우 첫번째 매개변수를 전달하여 사람이 읽기 편하도록 이름을 지정할 수도 있다.


만약 이 매개변수를 지정하지 않으면, 컴퓨터가 읽기 좋은 형식의 이름을 사용하게된다.



이 예제에서는 Question.pub_date만 정의하도록 하겠다.


몇몇 Field클래스는 반드시 매개변수를 설정해야 하는 Field들이 있다.
CharField의 경우 반드시 max_length를 입력해주어야 한다.


또한 다양한 선택적 매개변수들을 가질 수도 있는데, 이 예제에서는
Default로 하여금 votes의 기본값을 0으로 설정하였다.

마지막으로 ForeignKey를 사용한 관계설정에 대한 경우이다.
이 예제에서는 각각의 Choice클래스가 Question클래스에 관계된다는 것을 Django에 알
려준다.

따라서 Django는 다대일(many to one), 다대다(many to many), 일대일(one to one)과 같은
모든 일반 데이터베이스의 관계들을 지원할 수 있다.

모델 활성화하기

모델(Model)의 짧은 코드가 실제 Django에게는 많은 양의 정보를 전달하게 된다.

Django는 이 정보를 가지고 아래와 같은 작업을 할 수 있다.


또한 Django의 앱(polls와 같은)들은 뺐다꼈다할 수 있다.
, 앱을 다수의 프로젝트에서 사용할 수도 있고 배포 할 수도 있다.

따라서 특정 Django프로젝트에 앱들이 묶여있지 않아도 되는 것 Django가 추구하고자
하는 철학이다.

하지만, 가장 먼저 현재 프로젝트에게 polls앱이 설치되어 있다는 것을 알리는게 우선이다.

현재 앱을 프로젝트에 포함시키기 위해서는 (polls)의 클래스에 대한 참조를

setting.py 파일의 INSTALLED_APPS 변수에 추가해야 한다.


해당 클래스는 polls/apps.py내에 존재한다.


따라서 변수에 추가 할 코드는 'polls.apps.PollsConfig' 가 된다.

이제 Djangopolls앱이 포함된 것을 알게 됐다.
그럼 이제 다른 명령어를 내려보자.

python manage.py makemigrations polls

실행해보면 아래와 같은 로그를 볼 수 있다.


Makemigrations을 실행시켜, 모델을 변경한 사실과 이 변경사항을 migration으로 저장하고
싶다는 것을 Django에게 알려주었다.

여기서 마이그레이션은 Django가 모델(및 데이터베이스 스키마)에 대한 변경 사항을 디스
크에 저장하는 방식을 말한다.

원하는 경우 새 모델의 마이그레이션을 읽을 수 도 있다.


예제의 경우 polls/migrations/polls/0001_initial.py 파일이다


Django가 변경하는 방식을 수동으로 조정하려는 경우에는 사용자가 편집 할 수 있도록
설계되어 있기 때문에 Django를 만들 때 마다 읽을 필요는 없다.

Django에는 이 migration들을 실행시켜줘서 자동으로 데이터베이스 스키마를 관리해주는
migrate명령어가 있다.

sqlmigrate명령어는 migration 이름을 인수로 받아 실행된 SQL문을 보여준다.

이번 예제는 0001_initail.pymigration을 실행할 것이며, 명령어는 아래와 같다.


python manage.py sqlmigrate polls 0001


성공 시, 위의 사진과 같은 화면을 볼 수 있으며
이 로그들은 실제 모델안에서 데이터들의 코드를 기반으로 Create되어지는 테이블들이 된다.


또한 공식 도큐먼트에서는 위의 사진에 대해 아래와 같은 참고 사항을 적어뒀다.

(외래키의 관게는 FOREIGN KEY 제약 조건에 명시된다.

다만, 트랜잭션이 끝날 때까지 외래 키를 적용하지 않도록 PostgreSQL에 지시하기 때문에 
DEFERRABLE 부분에 대해 걱정하지 않아도 된다.)


(sqlmigrate 명령은 실제로 데이터베이스에서 마이그레이션을 실행하지 않는다.

다만, Django가 필요하다고 생각하는 것을 화면에 출력한다.

이는 Django가 수행 할 작업을 확인 또는 변경을 위해 
SQL 스크립트가 필요한 데이터베이스 관리자가 있는지 확인하는 데 유용합니다.)

관심이 있다면 python manage.py check 명령어를 통해 마이그레이션을 수행하거나,
데이터베이스를 건드리지 않고도 프로젝트의 문제를 확인 할 수 있다.

모델 적용하기

이제 실제 migrate 명령어를 통해 데이터베이스에 모델과 관련된 테이블을 생성해보자.
해당 실행문은 아래와 같다.

python manage.py migrate




실제 실행하면 위의 사진과 같이 로그가 나오며 마지막에 OK라는 로그가 나온다.

migrate 명령은 아직 적용되지 않는 마이그레이션을 모두 수집해 이를 실행하여,
결과적으로 모델(Model)에서의 변경 사항들과 데이터베이스 스키마의 동기화가 이루어진다.

이 마이그레이션은 매우 강력한 기능이며, 마치 프로젝트를 개발할 때 처럼 데이터베이스나
테이블에 손대지 않고도 모델을 변경할 수 있게 해준다.

또한 동작 중인 데이터베이스를 데이터 손실없이 업그레이드 하는 데 최적화 있기 때문
Django는 개발자들에게 큰 힘이 되어 줄 것이다.

따라서 모델 변경 및 추가를 하고 싶다면 아래와 같은 과정을 거치면 된다.

    모델(model.py)을 변경 및 추가 한다.

    python manage.py makemigration 명령어를 통해
     변경 및 추가에 대한 마이그레이션을 만든다.

    python manage.py migrate 명령어를 통해 변경 및 추가에 대한 마이그레이션을 적용한다.





위의 사진은 python manage.py makemigrations 명령어를 사용 할 때 참고되는 0001_initial.py파일이다.

실제 0001_initial.py 파일은 위의 사진과 같이 프로그래밍 되어져 있는데

이전에 models.py파일에 프로그래밍한 class 이름으로 각각의 테이블들이 설정되있는 것과
해당 class안의 변수들이 컬럼명으로 지정되어 있는 것을 확인 할 수 있다.



---------------------------------------------------------------------------------------------------------------------- 

[1] : 데이터베이스 마이그레이션 이란, 데이터베이스 스키마의 버전을 관리하기 위한
하나의 방법으로 개발 시스템에서 데이터베이스 스키마가 변경되었지만

운영 시스템의 데이터베이스 스키마가 변경되지 않았을 경우 마이그레이션을 수행한다.

마이그레에션은 보통 한 운영체제로부터 다른 운영체제로 옮기는 작업을 말한다.

---------------------------------------------------------------------------------------------------------------------- 

참고

첫 번째 장고 앱 작성하기, part 2 :


이 블로그의 인기 게시물

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

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

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