[ 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 분석 ⑤ : 자동화 테스트(Automated Test) - 2

(View) 수정하기


설문 조사 목록에는 아직 게시되지 않은 설문 조사가 표시될 것이기에

표시되지 않도록 수정해보자.

 

먼저 이전 튜토리얼 4장에서 클래스 기반의 View

다시 작업하였는데



그 부분 중 IndexViewget_queryset 메소드를 수정할 것이다.



현재와 미래를 비교해야만 하기 때문에 

timezone import 해야한다.



원래 코드를 주석처리하고,

빨간색 박스와 같이 코드를 수정한다.

 

여기서

Question.objects.filter( pub_date__lte = timezone.now() )

Timezone.now 보다 pub_date가 작거나 같은 

Question을 반환 하는 코드이다.


여기서 pub_date 이름 뒤에 붙은 

__lte filter[1]조건 키워드로 같거나 작다(<=)를 의미한다.

 

, 지금이거나 과거일 경우 queryset을 반환하게 된다는 이야기 이다.

 

공식 도큐먼트에서는 여기서 끝내버리지만

나는 실제로 잘 작동하는지를 보고 싶기 때문에

미래의 데이터를 넣어 확인한 다음


그 데이터를 과거로 바꿔 

제대로 화면에 출력하는지를 확인할 것이다.


그렇기 위해서는 먼저 shell로 진입해야 한다.



셀로 진입한 후 Question 객체에 미래의 데이터를 넣기로 하자.


데이터를 넣었다면 명령어를 통해 

데이터가 정상적으로 들어가 있는지 확인한다.


그런 후 서버를 가동하고 

브라우저로 데이터가 나타나지 않는지 확인해 보자.


위의 사진과 같이

Shell을 통해 등록했던 

future Question text가 보이지 않는 것을 확인 할 수 있다.

 

그렇다면 역으로 등록했던 것의 날짜를 

바꾼다면 제대로 보이는지 확인해보자.



위와 같이 2020년이였던 것을 과거인 2018로 수정해 서버를 가동후 확인해 보자.


브라우저에는 빨간색 박스와 같이

등록한 데이터가 과거일 경우 정상적으로 출력되는 것을 알 수 있다.


물론 위와 같이 shell에서 

데이터를 추가하고 수정하지 않고도



django에서 제공해주는

 관리자 앱을 사용한다면 좀 더 손쉽게

데이터를 추가 및 수정하여 확인해 볼 수 있다.


관리자 앱에 대한 내용은 

이전 포스팅을 참고하길 바란다.

 

마지막으로 자동화 테스트를 작성할 것이다.

 

이번 자동화 테스트는

1개의 클래스(함수 5)1개의 함수로

6개의 테스트 케이스를 만들 것 이다.

 

먼저 



자동화 테스트 과정 중에 사용할 create_question 함수,

여기서 days인수는 과거의 설문조사와 

미래의 설문조사를 나누는 일 수를 말한다.


예를 들어

이번 자동화 테스트에서는

이 인수에 미래의 경우 30이 과거의 경우 -30이 들어가는데


오늘 기준 pub_date 30일 후의 경우 

미래에 진행할 설문 조사 목록이며

오늘 기준 pub_date30일 이전에 경우에는 

과거에 끝난 설문조사 목록이 된다.



시행할 설문 조사가 없을 경우,

설문 조사가 없다는 메시지를 출력해주는 test_no_questions 함수



설문 조사 목록 중에 pub_date가 과거인 설문조사를 페이지에 출력하는

Test_past_question함수


설문 조사 목록 중에 pub_date가 미래인 설문조사를 페이지에 출력하는

Test_future_question 함수



설문 조사 목록 중에

과거의 끝난 설문 조사와 미래에 진행할 설문 조사 둘 다 존재할 경우

과거에 끝난 설문조사만 출력하는

Test_future_question_and_past_question 함수



마지막으로

설문 조사 목록 중에서

과거에 끝난 설문 조사와 

미래에 진행할 설문 조사 둘 다 출력하는

Test_two_past_question 함수이다.

 

6가지 함수 중에는 

새롭게 사용되는 메소드들이 있기 때문에

이에 대해 살펴보고 가는 것이 옳을 것이라 생각 된다.

 

하나의 함수만 살펴보고자 하는데,

Test_fufure_question_and_pass_question 함수를 살펴보려고 한다.



Test_future_question_and_past_question 함수는 위와 같으며

먼저 create_question함수부터 살펴보려고 한다.



Create_question 함수는 2가지의 매개변수를 가지고 있는데

매개변수 question_text는 만들고자하는 질문의 텍스트를

매개변수 days는 가산하고 싶은 날의 수를 입력 받는다.

 

지역변수 time에는 현재의 시간과 매개변수 days에 들어있는 수를

더한다.

여기서 datetime.timedelta 함수는 date형을 리턴해주는 함수로

시간을 더 할 때 사용한다.

자세한 것은 아래 링크를 참고하길 바란다.

https://www.geeksforgeeks.org/python-datetime-timedelta-function/

 

Return 값은 model

Question 클래스에 명시되어 있는 코드의 오브젝트를 생성하고,

오브젝트의 지역변수인 question_text에는

매개변수 qeustion_text의 문자열을,

지역변수인 pub_date에는

매개변수 현재 시간에 days를 합산한 시간을 넣는다.

 

따라서 리턴 되는 것은 model에서의 Question 오브젝트이고

이 오브젝트 안에는 질문 문자열과

현재 시각에 매개변수 days에서 받은 일수를 더한 시간 값이 들어 있다.

 

다음으로 지역 변수 response에는



reverse함수를 이용해 urls에서 

이름이 polls로 지정되어 있는 url패턴

안에 이름이 index로 되어있는 경로를 얻어 온다.


코드는 아래와 같다.



그리고 url 패턴을 통해 참조해야하는 View

어떤 Vew인지 알 수 있게 되었는데,

바로 IndexView이다.



위의 사진이 IndexView이다.

빨간색 박스와 같이 이전에 다른 제너릭 뷰 들과는 다르게

Context_object_name이라는 지역변수를 따로 설정해 준적이 있다.

 

IndexView의 경우 많이 사용할 것 같은

View들을 미리 만들어 놓은 제너릭 뷰들 중 하나로

JAVA에서의 인터페이스를

Django에서 제공해준다고 생각하면 이해하기 쉬울 것 이다.

 

어쨌든 IndexViewListView라는 제너릭 뷰 인데,

List 자료형의 변수를 가지고 있는 View이다.


따라서 데이터 입/출력이 필요 할 때

IndexView를 이용하게 될 것이다.

 

작성을 완료했다면,

실제 테스트를 시행해보자.



작성한 자동화 테스트를 시행해보자.

 

이전에 작성한 2개의 자동화 테스트 함수와

이번에 작성한 6개의 자동화 테스트 함수를 합해

8개의 자동화 테스트를 시행한 결과

작성한 코드의 문제가 없음을 확인했다.


DetailView 테스트하기

지금까지 작성한 코드들은 잘 작동된다.

 

하지만 미래에 진행할 설문들은

페이지에 나타나지는 않지만,

 

사용자가 URL을 알고 있거나,

추측한다면 접근할 수 있다.

 

따라서 DetailViewIndexView 때와

마찬가지로 유사한 제약조건을 추가할 필요가 있다.



빨간색 박스와 같은 함수를 추가한다면,

쿼리를 불러올 때 미래의 값들은 불러오지 않는다.



또한 위와 같이

시간이 지난 pub_date 값을 가지고 있는 설문은 표시되고

미래의 pub_date는 표시되지 않는 테스트 케이스도 추가하자.

 

[1] 조건 키워드 :

키워드

설명

__lt / __gt

작다 / 크다

__lt / __gte

작거나 같다/ 작거나 크다

__in

리스트([1,2,3와 같은])

의 데이터와 동일한

검색

__year / __month / __day

, , 일 검색

__isnull

Null인 값 검색

__contains

지정한 문자열을

포함하는 데이터를 검색

__icontains

지정한 문자열을

포함하는 데이터를 대소문자

구별하지 않고 검색

__startswith

지정한 문자열로 시작하는

데이터를 검색

__istartswith

지정한 문자열로 시작하는

데이터를 대소문자

구별하지 않고 검색

__range

문자, 숫자, 날짜의 범위를

지정해 검색



이 블로그의 인기 게시물

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

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

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