[ 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) 세부 설명에 조금 차이가 있어 보이지만 전체적인 틀은 매우 비슷해 보인다.  몇 가지 포인트가 되는 단어를 추출해 이를 연결해보자면 아래와 같은 의미를 산출 할 수 있다. 독립적이지만 연관되어 있

[ Essay - Technology ] API(Application Programming Interface)? 라이브러리(Library)? 프레임워크(FrameWork)?


최근 개발에 있어서 
그리고 다양한 프로젝트 진행에 있어서 


프레임 워크는 없어서는 안될 것들 중에 
하나로 자리 잡아 가고 있다.

마치 과거에 프로젝트 시작 전에 
좋은 API를 찾는 것과 비슷하게 말이다.

이전에는 프로젝트를 진행하기 앞서서
어떤 언어를 사용할 것인가를 고민 했지만

요즘에는 경우에 따라서 
먼저 유용한 프레임워크가 있는지를 
고민하기도 하는 것 같기도 하다.

어느 순간
개발의 패러다임이 
바뀌고 있는 것인지도 모른다.

내가 과거 대학 시절 때 공부했을 당시에 
프레임 워크 그리고 API와 라이브러리에 대한 
개념에 대해 조금은 혼란스러웠다.

과거에 내가 이런 경험을 한 적이 있기 때문에
다른 사람들 또한 이러한 경험을 했었거나
지금 하고 있을지도 모른다는 생각이 들었다.

그래서 이번에는 프레임워크(FrameWork)와 
API(Application Programming Interface),
라이브러리(Library) 대한 이야기를 하려고 한다.

하지만,
이전에도 계속해서 이야기한 바 있지만

IT 업계에서 자주 사용되어지는 
단어들의 대부분은 사실 명확하지 않으며
애매모호하다.

프레임워크, API, 라이브러리에 
대해 이야기할 때
큰 틀은 같을지는 모르겠지만, 
세세한 부분에 있어서는 대개 사람마다 다르다.

왜 이러한 현상이 나타나는지에 대해 
여러가지 이유가 있겠지만

나는 필요에 의해 먼저 만들어지고,
그 다음 개념화에 들어가기 때문이라고 생각 한다. 

그렇기 때문에
내가 여기서에 이야기하는 
프레임워크, API 그리고 라이브러리에 대한 것도
결코 진리는 아닐것 이다.

다른 사람들에 의해 
많이 이야기되어지는 정의에
나의 생각이 들어가 있기 때문이다.

그렇기 때문에 
정의에 대한 것은 각자 생각해 볼 필요가 있고,
이를 명확히 할 필요가 있긴 하나

사실 개발자들에게 그런 논의보다는 
각자 개발하기 바쁜 것도 있지만
이러한 논의 보다는 
새로운 기술에 더 관심이 많기 때문에
그런 부분에 있어서 손을 놓고 있는 것이 사실이다.

어쨋든 서론은 여기까지 하고

이에 대해 이야기하기 앞서 
정의에 대해 이야기해보자.

항상 했던대로 정의는 
위키 백과의 영문판을 기본 토대로 하였다.

API(Application Programming Interface)의 정의에 대해


먼저 위키백과 영문판에 정의에 따르면 다음과 같다.

API(Application Programming Interface)는 여러 소프트웨어 중개자 간의 상호 작용을 정의하는 컴퓨팅 인터페이스다. 

호출 방법, 사용해야하는 데이터 형식(타입), 
따라야하는 규칙 등의 호출하거나 응답(리턴)할 수 있는 방법을 정의한다. 

또한 확장 메커니즘을 제공하여
사용자가 다양한 방식(ways), 정도(degrees)로 기존 기능을 확장할 수 있다. 


—위키백과(영문판) ,Application Programming Interface


즉, 프로그래밍함으로써 나오는 
작게는 코드 부터 
크게는 애플리케이션까지
그 안에서 상호작용을 정의하는 
컴퓨팅 인터페이스를 말하며,

그러한 인터페이스를 부르기위한
Intiger, String, char와 같은 
데이터 타입을 포함한 
인터페이스를 오류 없이 사용하기 위한 규칙 등의
호출 및 응답(리턴) 할 수 있는 방법

그리고 이러한 인터페이스를 활용해
기능의 확장을 할 수 있는 인터페이스를 
API라고 말한다고 이야기할 수 있다.

라이브러리(Library)의 정의에 대해


위키백과 영문판에서는 
라이브러리에 대해 아래와 같이 설명한다.

컴퓨터 과학(Computer Science)에서
라이브러리는 종종 소프트웨어 개발을 위한

구성 데이터(configuration data),
설명서(Documentation),
도움말(help data),
샘플(pre-written) 코드 및 서브 루틴,
값 또는 타입 등의 사양(specifications)을 포함하는
컴퓨터 프로그램이 사용하는 비 휘발성 자원의 모음을 말한다. 
 
—위키백과(영문판) ,Library (computing)

좀 더 이해를 쉽기 하기 위해 
아래와 같이 추가로 설명하겠다.

또한 라이브러리는
프로그래밍 언어로 작성된
행동의 구현 모음(collection of implementations of behavior)으로
동작이 호출되기 위한 인터페이스가 잘 정의되어 있다.

예를 들어 
더 높은 수준의 프로그램을 작성하려는 사람들은
시스템 호출을 반복해서 구현하는 대신
라이브러리를 사용하여 시스템을 불러올 수 있다.

또한 여러 독립된 프로그램에서 재사용 할 수 있도록 
방법(behavior)이 제공되는데
프로그램은 프로그래밍 언어 메커니즘을 통해
라이브러리 제공 방법(behavior)을 불러온다.

예를 들어,
C언어와 같은 간단한 명령형 언어에서
라이브러리의 행동(behavior)은
C의 일반 함수 호출(normal function-call)을 
사용하여 불러온다.

호출은 라이브러리 함수에 대한 호출(call)과
동일한 프로그램의 다른 함수에 대한 호출(call)을
구별하는 것은 시스템에서 코드가 구성되는 방식이다 


—위키백과(영문판) ,Library (computing)

즉, 라이브러리란 
소프트웨어 개발에 있어서 사용되어지는 
비휘발성 자원의 모음으로

행동의 구현 모음으로 동작이 호출되기 위한 인터페이스와
여러 독립된 프로그램에서 
재사용할 수 있도록 하기 위한 방법 제공 등을 
제공해준다고 할 수 있다.

프레임워크(FrameWork)의 정의에 대해


먼저 이야기하기 앞서서 
위키 피디아의 이야기를 들어보자.

컴퓨터 프로그래밍에서
소프트웨어 프레임 워크는
일반적인 기능을 제공하는 소프트웨어를
추가 사용자 작성 코드로 선택적으로 변경하여,
응용 프로그램 별 소프트웨어를 제공 할 수 있는 [1]추상화 이다.

또한 응용 프로그램을 빌드하고
배포하는 표준 방법을 제공하며,
응용 소프트웨어 프로그램, 
제품 및 솔루션 개발을 촉진하기 위해
더 큰 소프트웨어 플랫폼의 일부로
특정 기능을 제공하는 재사용 가능한 소프트웨어 환경이다.

—위키 백과(영문판), Software Framework

사실 현재에 있어서
이 프레임 워크에 정의에 대해 논란이 많다.

정확히는 정의라기 보다는 
라이브러리와 프레임워크가 
무엇이 다르냐는 그런 논란이다.

일단 프레임워크와 라이브러리의 유사한 점은
'함수나 객체의 모음'인것은 확실하지만,
어떤 면에서 다르냐는 것이다.

그래서 API란 무엇인가?


본격적인 이야기는 여기서 부터다.

위에서 언급했듯이 
IT 용어의 대부분은 비교적 명쾌하지 않다.

왜 그렇게 되었는지에 대해서는 
여러가지 이유를 추측해볼 수 있지만,
나는 크게 두 가지 이유라고 생각하고 있다.

첫째 필요에 의해 사용되어진 다음에 
개념화가 이루어졌기 때문

둘째 개발자는 커뮤니케이션이 능숙하지 않기 때문에
암묵적으로 개념화되어진 채로 사용되어지고 있었기 때문

셋째 개발자는 논의보다 기술에 대해 더 관심이 많기 때문

이 세 가지 이다.

그래도 API는 라이브러리나 프레임워크에 비해
비교적 명쾌하기는 하다.

API는 말 그대로 개발 인터페이스이다.

다만, 
자신이 만든 것도 포함되기는 하지만
대개 다른 사람들이 개발해 놓은 기능의 집합체를 말한다.


위의 사진과 같이 from과 import으로
절차지향과 객체지향의 패러다임이 녹아들어가있는
최근의 api를 사용하는 방법이다.

과거에도 그리고
지금까지도 유용하게 쓰이고 있는
절차지향형 패러다임의 C의 경우는


조금 다르게 include로 사용했었다.

따라서 include와 같은 방법을 포함해
import 뒤에 있는 것들인
admin, path, include, 
RedirectView,settings, static이 바로 API라고 부를 수 있을 것이다.
 
물론 이것들의 호출, 리턴 방법을 포함한
명세서가 있어야 비로소 정의한대로의
API라고 부를 수 있을 것이다.

이 API들은 
과거 절차지향형 패러다임이였을 때는
하나씩 따로따로 제공되어졌지만,

비교적 최근에 
객체지향형 패러다임이 더해져서
객체화되어 최근에 흔히 말하는 API로서 제공되어진다.

이런 API는 과거에는 
toolkit 형태로 많이 제공되어져 왔지만
최근에는 클라우드 컴퓨팅에 의해 
클라우드 인프라로서 제공되어지기도 한다. 

라이브러리? 프레임워크?


문제는 이 라이브러리와 프레임워크에 대해서 이다.

이 두 가지의 차이점에 대해서 깊은 고찰이 필요하다.

왜냐하면 
이 부분에 있어서는 아직도 
논란이 많은 부분이기 때문이다.

넓게 보자면 API의 모임들이 
라이브러리나 프레임워크라고 말할 수 있기 때문이다.

라이브러리는 API들이 모여있는 집합체일 수 있고,
프레임워크도 API들이 모여있는 집합체일 수 있다.

아마 여기서 많은 사람들이 혼란이 오는 것 같다.

이는 나 또한 마찬가지이다.

이 글을 작성하기 이전에도 
어느 정도 직감은 가지고 있었지만 혼란되는 것은 마찬가지다.

그렇기 때문에 비교적 명쾌한 API보다는
프레임워크와 라이브러리에 대해 
좀 더 시간을 할애할 필요가 있다.

그래서 라이브러리란 무엇인가?


여러가지 교차 검증을 했을 때,
대부분 사람들의 직감은
위에서 언급했듯이
 
라이브러리도 API들이 모여있는 집합체일 수 있고,
프레임워크도 API들이 모여있는 집합체일 수 있다.

하지만
차이점에 대해서는 의견이 갈린다.

나는 위에서 IT업계의 개념은 
필요에 의해 만들어지고 그 다음 개념화되며,
이러한 사실 때문에 개념들이 
애매모호 할 수 밖에 없다고 이야기 했었다.

그렇다면 왜 라이브러리가 필요했었는지 부터 시작한다면
좀 더 진리에 접근 할 수 있지 않을까하는 생각을 하게 되었다.

그렇다면 생각해 보자.
왜 라이브러리가 필요했을까?

혹시 lib라는 폴더에 대해서 알고 있는가?

지금이야 좋은 API들이 내장되어 있거나,
클라우드 컴퓨팅의 발달로 클라우드에서 불러오지만

사실 과거에는 그렇지 못했다.


애플리케이션 마다 
lib라는 폴더들이 하나씩 존재 했었다.

비교적 최근에 나온 python이라던가
ruby와 같은 언어들에게는 찾아보기 힘드나

Java의 경우에는
애플리케이션을 생성할 때 마다 
lib라는 빈 폴더가 자동으로 생성되었고,
인터넷으로 검색한 유용한 오픈소스 파일들을 
이 lib파일에 넣어 사용했다.

비교적 과거의 패러다임들 일수록 
이런 lib파일이 있다.

더 과거로 가서 C언어에서는 


오픈 소스 헤더 파일 .h와 API .c들을 lib라던가 
library 등의 형식으로 개발에 있어서 유용한 자원들을
여기에 넣어 관리했었다.

따라서 적절한 API들의 모음을 가지고 있으냐에 따라서 
개발을 빨리 할 수 있었을 것이고,
이것들을 라이브러리(library)라 사람들이 불렀을 것이다.

하지만, 이러한 라이브러리들은 .h, .c, .java 등의 요소들을
매번 구축하기가 매우 까다롭고 번거로웠다.

아마 이런 것들을 프레임워크화 시킴과 동시에 
대중화 시킨 것은 



다양한 java 프레임워크(toolkit에 가까운)가 아닐까 싶다.

하지만 
나는 여기서 java에서 말하는 프레임 워크와
현재(2020년) 말하는 프레임 워크에 개념과는 
매우 차이가 크다고 생각하고 있다.

과거 java에서 말하는 프레임 워크는
GUI와 같이 그래픽 작업 등의
자주 사용할법 한 것들의 API들을 
모아 분류하고 객체화 시켜 
사용하기 편하게 만든 라이브러리에 불과하다. 

정확히는 toolkit에 가깝다고 생각한다.

이러한 팽창 과정을 거치면서
프레임워크의 패러다임이 바뀌었다고 나는 보고 있다.

그래서 프레임워크란 무엇인가?


먼저 프레임 워크는 
왜 필요하게 되었는지 부터 이야기를 해보자.

아무리 훌륭한 라이브러리를 가지고 있다고 한들
개발 시간 등과 같은 코스트를 줄이는데에는 한계가 있다.

가장 큰 문제는 개발 과정에서 
중복되는 부분이 많다는 것이 많으며,
어떤 부분은 중요도에 비해 오류가 자주 발생함에 따라
개발이 지연되는 경우도 많았다.
(주로 오타와 같이 사람의 실수로)

그렇기 때문에 라이브러리 뿐만 아니라
이런 중복되는 작업을 일부 대신해주고,
중요도에 비해 오류가 자주 발생하는 곳을 
대신 해주기를 바랐을 것이다.

컴퓨터는 실수 할리가 없기 때문이다.

그리고 이런 생각이 라이브러리로 시작해서
프레임워크로 계속해서 확장해나가다가 
지금의 프레임워크에 도달했다고 나는 생각하고 있다.

java의 프레임워크의 이야기로 시작하면
좀 더 내가 전하려하는 직감에 쉽게 도달할 수 있을 것이다.

구글에 java framework라고 검색하면
두 종류를 볼 수 있을 것이다.

위에서 언급한 GUI를 포함한 


과거 프레임워크라고 불리었던 java framework와


struts, spring, hadoop과 같은 
framework이 두 가지를 찾아 볼 수 있다.

나는 이에 대해 라이브러리와 같은 유사한 framework와 
현재의 framework의 혼동을 막기 위해

일단 라이브러리와 유사한 프레임 워크를
pre-framework라 부르기를 권하고 싶고
여기서 부터는 그렇게 부르기로 하겠다.
(무엇이 좀 더 좋을지에 대해서는 고민 중이다)

IT업계에 조금이라도 발을 담가본 사람이라면
직감적으로 느끼고는 있을 것이다.

내가 생각하는 프레임워크가 가지는 특성은 아래와 같다.

첫 번째, 높은 재사용성을 가지고 있으며,
애플리케이션을 구현하기 위한 
유용한 API, 라이브러리뿐만 아니라
이외에 모델 등도 제공 해준다.

두 번째,  IOC(Inversion Of Control, 제어 역전)의 특성을 가지고
일부 제어권을 프레임 워크가 가진다.

여기서 제어 역전 이란,
소유자가 시스템에게 제어권을 넘기거나 
없기 때문에, 제어권이 시스템에 있는 것을 말한다.

martin fowler는 이런 제어 역전 현상이 
프레임 워크를 확장 시키면서 나타난다고 설명 한다.

여기에 나의 설명을 덧 붙이면
pre-framework가 현재 이야기하는 framework로 확장되면서
이러한 제어 역전(IoC)이 강하게 나타난 것 이다.

특히 객체지향형 패러다임과 
절차지향적 패러다임이 섞여있는 Python계열의
Django의 경우 
제어 역전의 정도가 강하게 느껴지기 까지 한다.


왜냐하면 위의 Django의 MVT패턴을 보면
개발자가 좀 더 비지니스 로직에 시간을 할애할 수 있게 끔
URL만 지정해주면 
프레임워크(Django)에서 알아서 클라이언트와 통신하기 때문이다.

위의 MVC패턴을 보면 Controller가 
브라우저와 통신하는 거에 비해

MVT패턴의 경우는 Url만 설정하고 나머지는 
프레임워크(Django)에게 맡기기 때문에 
MVC에 비해 비교적 IoC의 강도가 강하다고 볼 수 있다.

또한 프레임워크가 IoC특성을 가지는 것에 대해 
martin fowler는 Richard Sweet가 
Mesa라는 프로그래밍 언어 환경에 대한 
논문에서 언급한 할리우드 법칙을 언급한다.

Don't call us, we'll call you (Hollywood's Law)

—Richard Sweet, The Mesa Programming Environment (p.218)

즉, 과거 처럼 개발자가 library를 불러오거나
API를 불러오는 것이 아닌, 
우리(프레임 워크)가 부른다는 말이다.

물론 Richard Sweet의 
실제 논문에 framework의 개념을 말하고 있지는 않다.

다만, 나의 프레임워크에 대한 직감 또한
위와 같은 할리우드 법칙으로도 
어느 정도 설명이 가능했기 때문에
martin fowler에 이러한 예시에 깊이 공감한다.

이 중 특히 제어 역전(IOC)이
pre-framework와 구별되는 점이 아닌가 싶다.

실제로 javaFX는 IoC특성을 가지고 있지 않다.

따라서 javaFX에 IOC 특성을 가지게 하고 싶다면,
Spring과 같은 프레임워크를 같이 사용해야만 한다.

또한
어떤곳에서는 Django, Spring, Struts와 같은 프레임워크를
풀 스택 프레임워크(Full Stack Framework)라 말하기도 하는 것 같다.

결론


나의 논지에 동의한다면 
아래와 같이 추상화 할 수 있을 것이다.




기본적인 API부터 시작해
필요에 의해 계속해서 지금까지 확장(expand)해왔고
API에서 Library로 재사용성을 높이기 위해 계속해서 팽창하다가

지금까지 팽창한 결과가 
지금의 IoC의 특성을 가지는 Framework라고 볼 수 있다.

그렇기 때문에
JavaFX나 swing과 같은 것들은 
프레임워크 이기보다는
라이브러리들을 잘 모아서 객체화 시킨
pre-Framework에 가깝다고 볼 수 있다.

그런 것들을 프레임 워크라고 말하기에는 
사실상 라이브러리랑 다를게 없기 때문이다.

따라서 현재 이야기되어지고 있는 
프레임워크들은 그런 요소를 포함해,

다시 말해서 
API, Library, pre-Framework의 특징을  
모두 가지고 있으며

개발하고 운용함에 있어서 일부분을 
프레임워크라는 시스템에 맡기고,

개발자는 좀 더 비지니스 로직에 
전념할 수 있도록 하는 틀(frame)을 
제공하는 것 또는 
그러한 개발 환경이 
현재 이야기 되어지고 있는 
프레임워크(FrameWork)에 가깝다고 생각한다.

여기까지 해서 나의 논의를 마치려고 한다.

물론 항상 이야기 하는 것이지만
나의 주장이 진리는 아닐 것이다.

나는 나의 직감이라는 원석으로부터 깎아낸
부분적 진리를 말하는 것 뿐이다.

또한 나의 논의만으로 
끝낼 수 있는 문제도 아니며, 
논의도 충분치도 않을 것이다.

내 생각는 이에 대해 
좀 더 논의가 이루어져야 좀 더 명확해질 수 있을 것이다.

하지만 이 정도면 
라이브러리와 프레임워크에 대해 
IT업계에서 논의해 
정확히 명시할 필요성에 대해서는
충분히 증명했다 믿어 의심치 않는다.



컴퓨터 과학(Computer Science)에서 말하는 추상화는

물리적, 공간적, 시간적인 세부 사항 또는 속성
을 제거하여 오브젝트나 시스템 연구에 집중하는 프로세스를 말하며,
일반화 프로세스와 매우 유사한 것을 말한다.

예를 들어
설계라던가 웹 프레임워크에서 이야기 되어지는 
MVC패턴이나 MVT패턴도 이런 추상화이다.


이 블로그의 인기 게시물

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

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

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