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

[ 프로젝트 BEP ] 제 4장 : 프로그래밍 언어 ② - 프로그래밍 언어의 역사


이전 글에서 왜 프로그래밍 언어에 대해 
어려울 수밖에 없는지에 대해 충분히 논의하였다.

프로그래밍 언어가 어려운 이유는 
다루는 사람이 머리가 좋거나 천재이기 때문이 아니라
프로그래밍 언어에 다소 익숙하기 때문이다.

이는 실제 다양한 나라의 외국어도 마찬가지이다.

그렇다면 이제 프로그래밍 언어의 역사에 대해 
자세히는 아니더라도 살펴볼 필요가 있다.

왜냐하면, 프로그래밍 언어 패러다임의 흐름을 
알아야 필요가 있으며,

현재 사용하고 있는 언어가 
과거에 패러다임에 다소 영향을 받고 있기 때문이다.

따라서 현재의 언어를 이해하기 위해서는 
과거의 언어가 어떻게 이루어졌는지 까지는 
알 필요는 없다고 생각하지만,
어떤 패러다임을 가졌는지에 대해서는 알 필요가 있다고 생각 한다.

또한 여기서 모든 프로그래밍 언어에 대해 
논하지 않으며, 핵심적인 언어들만 이야기 하려고 한다.

그럼 이제 본격적으로 
프로그래밍 언어의 역사를 살짝 살펴보자.


프로그래밍 언어의 역사(청사진)


아래의 사진은 대략적인 프로그래밍 언어의 청사진을 나타낸다.

물론 위의 사진에 표기된 언어 외에도 
아마 수 많은 언어가 있었을 것이고, 
최근에 들어서 나온 언어들도 있을 것 이다.

하지만 위에서도 언급했듯이 
모든 언어에 대해 이야기할 생각은 없다.

인류 역사를 살펴볼때, 핵심적인 부분만 살펴보듯이 
프로그래밍 언어의 역사도 마찬가지이다.

물론 모든 역사를 보는 것은 매우 흥미롭지만
나는 프로그래밍 언어를 이야기하기 위해 
역사를 이야기하는 것 뿐이다.

그렇다면 여기서 이야기할 언어들은 
위의 사진에서 몇 가지 뽑아 이야기를 해보기로 하겠다.

사실상 모든 프로그래밍 언어의 뿌리라고 할 수 있는 FortanAlgol60,
객체 지향 언어의 완전한 기초 설계를 제공한 SmallTalk계열,
살아있는 전설 C와 이로 파생된 C++, C#등의 C계열,
세계에서 가장 인기가 많은 Java, 그리고 JavaScript
객체 지향과 절차 지향의 패러다임이 녹아 들어가 있는 PythonRuby

이렇게 5개의 항목으로 나눠 이야기를 하기로 하겠다.

① Fortran과 Algol60


먼저 Fortran은 



1953년 말, IBM에서 IBM 704 컴퓨터에서 
프로그래밍을 위한 어셈블리 언어의 
실용적인 대안으로서 제안된 언어로서 
IBM Mathematical Formula Translating System의 약자이다.

초기 사양은 1954년 11월에, 
첫 번째 매뉴얼은 1956년 10월에,
그리고 가장 중요한 1957년 4월에 
최초의 최적화된 컴파일러가 제공되었다.

물론 그 당시에는 어셈블리어를 사용하는 것이 
당연한 시기였기 때문에

Fortran이 나올 당시, 
커뮤니티에서 컴파일러를 사용하는 것이 
어셈블리어를 사용하는 것 보다
더 나은 성능을 가져다 줄지에 대해서는 의문이 들었지만, 
명령문의 수를 20배까지 줄이자 수용되었다고 한다.

즉,
C 계열, Java등의 수 많은
고급 프로그래밍 언어의 기반을 닦은 것이
이 Fortran이라는 언어라는 것이다.

이 것만 하더라도 
Fortran은 역사적 가치가 있음에는 부정할 수 없다.

초기 Fortran이 이용될 당시에는 
텍스트 편집기나 터미널이 개발되기 전 이였기 때문에 


위와 같은 천공 카드를 사용했다고 한다.

물론 Fortan은 개선을 거쳐 
절차적, 객체 지향 패러다임을 가지고 있으며
지금도 여전히 사용되고 있는 언어이다.

현재에 업계에서 보기 힘든 언어임에는 
부정할 수 없지만,

고성능 컴퓨팅을 하기 위해 여전히 사용되는 언어이며,[1]
세계에서 가장 빠른 슈퍼 컴퓨터의 
벤치마크와 순위를 매기는 프로그램에 사용된다고 한다.[2]

안정적인 버전으로는 
2018년 11월 28일 릴리즈된 Fortan2018이다.

다음으로 Algol 60은 


Algorithmic Language 1960의 약자로
Algol 계열에 속하는 프로그래밍 언어이다.

Algol 60은 Algol 58에서 제안된 
코드의 시작과 끝을 알리는 코드 블록(Algol 60에서는 begin, end)의 
개념을 도입해 구조화 프로그래밍(Structured Programming)의 기반을 닦고

또한 어휘 범위(Lexical Scope)로 
중첩된 함수(Nested function)를 구현한 
최초의 프로그래밍 언어이기도 하다.

이 중첩된 함수(Nested function)는 
함수 외부에는 보이지 않지만 
함수 내부에는 둘러 싸고 있는 범위의 함수, 변수, 상수 등에 
엑세스 할 수 있으며 일반적으로 읽기 쓰기가 허용 된다.

이는 현재 쓰이는 객체 지향 패러다임의 Class라는 
객체의 내부에 있는 지역 변수와 다양한 메소드라는 구성에 
큰 영향을 주었다고 생각하며,

이는 오늘날에도 유명한 C언어에 영향을 주었고,
개인적으로는 큰 영향을 주었다고 해도 과언이 아니라고 생각 한다.

② SmallTalk-80


현재 이 SmallTalk에는 여러가지 변형 언어들이 존재하지만,
일반적으로 말하는 SmallTalk는 SmallTalk-80을 말하므로
SmallTalk-80만을 이야기하겠다.

먼저 SmallTalk라는 것은 원래
Alan Kay가 이끄는 Xerox Palo Alto Research Center (PARC)에서 
Simula에 영감을 받아 SmallTalk-71이 만들어졌는데, 
이는 현대의 SmallTalk와는 매우 다르다.

현재 SmallTalk라고 이야기되어지는 것들은


위와 같은 개발 환경을 지원해주는 
SmallTalk-80에 기반을 두고 있는데

이 SmallTalk-80 부터 메타 클래스(Mata Class)를 추가하여,
(이 메타 클래스는 실제 Django에서 차용하고 있는 부분이기도 하다.)

속성(Properties)과 동작(behavior)을 포함해,
정수 및 부울 값과 같은 기본 요소들 까지 
개별 클래스에 연결시켜 "everything is an object" 을 실현하고, 
모든 것을 객체화 시켰다.

현재 객체지향 패러다임이 녹아들어가 있는 언어들
그러니깐 애플의 Object-C, Java, Python, Ruby 등의 언어들은
대개 이 SmallTalk-80에 영향을 받았다해도 과언은 아닐 것이다.

③ C, C++, C#등의 C계열


아마 대부분의 개발자들이 체감할 수 있는 것은
이 C계열 이후 부터 일 것이다.

C 언어는 



미국 컴퓨터 과학의 선구자이기도 하며,
벨 연구소에서 대부분의 커리어를 보낸 


켄 톰슨(Ken Thompson)이 새로운 유틸리티를 만들기 위한 
프로그래밍 언어를 원해 B라는 언어를 개발했지만, 
너무 느려 사용하지 않았던 것을

그의 동료인 


데니스 리치(Dennis Ritchie)가 
이 B를 개선하여 C언어를 개발했다.

여담으로 재미있게도
데니스 리치(Dennis Ritchie)와 
스티브 잡스가 같은 날에 사망했는데,

한국에서는 데니스 리치가 묻히고 
스티브 잡스가 부각되어버리는 재미있는 현상이 발생했었다.

기초 과학을 중요시 하지 않는 
한국의 모습을 보여준다고 생각 한다. 

어쨋든 이 C언어를 통해 
최초의 어셈블리어 이외의 언어로 만들어진
Unix라는 운영체제가 탄생하게 된다.

특히 메모리에 있는 
객체 또는 함수의 주소나 위치를 기록하는 포인터라는 개념은
프로그래머가 메모리 관리를 조작하게 해주면서
뛰어난 성능을 자랑하게 해주기도 한다.

후에 개발되어진 C++와
마이크로소프트에서 개발한 C#은 C에서 
직접 또는 간접적으로 차용되어져 만들어진 언어이고,

이외에도 Java, JavaScript, Objective-C, Python 등[4]
근본적으로는 다르지만
C언어의 느낌과 비슷한 제어 구조 및 기본 기능을 
차용하고, 유사한 구문을 사용하고 있다.

후에 1978 년 Dennis Ritchie 는 Brian Kernighan와 함깨  
The C Programming Language의 초판을 작성했는데,
이 책은 C 프로그래머들에게 비공식적인 표준이되기도 했다.

이 책에서 그 유명한 


위의 사진[3]과 같은  
"Hello, world"라는 예제가 처음 등장하기도 했다.

④ Java와 JavaScript

세계에서 가장 많은 인기를 자랑하는 언어를 꼽으라면 



나는 망설임 없이 Java와 JavaScript를 꼽을 것이다.

현재에 들어서는 최고의 인기를 자랑하는 언어이지만
이 두 언어가 과거에 받은 취급은 매우 곱지만은 않았는데

Java는 자바 가상 머신과 가비지 컬렉터 그리고 
이로 인한 메모리 누수에 의한 성능 이슈 때문에

그리고 JavaScript는 변수를 선언하지 않은 
매우 불안정한 언어로 
때때로는 이게 무슨 프로그래밍 언어냐는 취급 받았다.

아이러니하게도 시간이 조금 지나고 
하드웨어가 급속도로 발전하자
이런 이야기는 금세 사그라들기 시작했다.

모르는 사람이 보면
이 두 언어가 매우 연관있는 것 처럼 보이지만
재미있게도 전혀 연관이 없다.

어쨋든 잡담은 그만하고 본론으로 들어가보자.

먼저 Java는


제임스 고슬링(James Gosling)에 의해


C와 C++로 설계된 언어이다.

이 언어를 개발하기 위한 프로젝트를 1991년 6월에 시작하였는데,
원래는 대화형 TV용을 개발하기 위해 설계되었었다고 한다.

Java의 중요한 특성을 몇 가지 꼽으면
자바 가상 머신(Java Virtual Machine ,JVM)
가비지 컬렉터(또는 Garbage Collection)을 꼽을 수 있는데

자바는 자바 가상 머신(JVM)을 제공함으로써 
Java로 작성된 애플리케이션을 
운영체제와 상관없이 사용할 수 있게 되었다.

가상 머신에 대한 추가적인 이야기로
안드로이드 운영체제는 
다양한 하드웨어에서 실행되도록 설계되어 있기 때문에 
Java와 마찬가지로 가상 머신(VM)을 사용하는데 

윈도우라는 운영체제에서 


위와 같은 안드로이드를 구동하는 
애플리케이션을 설치하고, 
안드로이드 애플리케이션을 사용할 수 있는 것은 

이 안드로이드에 VM(dalvikVM)이 포함되어 있기 때문이다. 

여담으로 스마트폰의 운영체제인 Android에서 
일부 Java기술(API ,JVM)을 사용하고 있다며 

Sun Microsystems를 소유하고 있는 Oracle이 
Android를 소유하고 있는 Google에게 소송을 걸었는데
현재까지 법적 공방이 진행되고 있는 것을 보이며
 
JVM에 대한 이야기로
실제 Google측에서는 JVM을 사용하지 않으며
자사에서 개발한 dalvikVM을 사용하고 있다고 주장 한다.

또한 안드로이드의 커널은 C++로 개발되었고 ,
Java 바이트 코드를 사용하지 않기 때문에 
기술적으로는 순수 Java를 사용하지 않는다.

이야기가 길어질것 같으니 
Java와 Android에 대해서는 추후에 글을 작성하기로 하겠다.

다음으로 넘어가 가비지 컬렉터는 
자동으로 메모리를 할당하고 
해제하는 역할을 하는 애플리케이션인데,

프로그래머가 메모리 할당과 해제를 
수동으로 처리 하지 못하게 함으로써
메모리 할당 해제로 발생할 수 있는 잠재적인 리스크를 차단해준다.

물론 단점도 존재하는데,
이 가비지 컬렉터를 사용하기 위한 추가적인 리소스 사용하는 점, 
수동으로 메모리 할당/해제를 할 수 없는 점 등의 단점도 존재 한다.

Java에서 가상 머신(바이트 코드)을 사용하고, 
가비지 컬렉터를 사용하기 있기 때문에
지금 까지 성능에 대한 여러가지 논란이 있지만,

확실한 것은 현재에 들어서는 과거에 비해 
컴파일러를 차용하는 언어(C와 같은)들과 
미세한 성능 차이는 있겠지만, 큰 차이는 없어 보인다는 점이다.
(내가 알고 있는 한)

Java의 구문은 C와 C++의 영향을 받았지만,
새로운 방식의 구문을 차용하고 있으며
모든 코드가 Class 내부에 작성되는 특징을 가지고 있다.

JavaScript는
 


고수준 프로그래밍 언어 중 하나로 
언어 중에서 스크립팅 언어로 분류되어 있는 언어다.

HTML과 CSS와 함께 클라이언트 단의 핵심 기술 중 하나이다.

JavaScript의 큰 특징 중 하나로 
동적으로 타입이 지정된다는 것이다.

예컨데, 일반적인 고 수준 언어들은 
변수를 선언할 때, 
데이터 타입을 명시함과 동시에 그 타입 외에는 
변수에 데이터를 넣을 수 없는데,

동적으로 타입이 지정되는 JavaScript와 같은 언어들은
변수를 선언할 때,
데이터 타입을 명시하지 않기 때문에 
다른 타입의 값들을 넣을 수 가 있다.

이를 느슨한 타이핑(loose typing) 이라고도 하며,
데이터 타입을 정확히 명시하는 것은 
강력한 타이핑(strong typing)이라고 한다.

이는 스크립팅 언어들이 가지고 있는 큰 특징이다.

이 JavaScript와 관련된 라이브러리 중 
가장 유명한 것이 바로 


HTML 태그의 값을 불러오고 
값을 저장하게 해주는 JQuery가 있다.


⑤ Python 과 Ruby


Python은 


1990년에 등장한 언어로서


귀도 반 로섬(Guido van Rossum)에 의해 설계된 언어이다.

Python은 위에서 언급한 JavaScript의 
동적 타이핑(dynamically typed)의 특징을 가지고 있고,
또한 Java와 동일하게 가비지 컬렉터를 지원 하며,

구조적, 객체지향, 기능적 등의 다양한 패러다임을 지원한다.

특히 구조적, 객체지향 패러다임을 완벽하게 지원해주기 때문에
함수, 그리고 클래스와 내부의 메소드의 정의가 가능하다.

또한 Python은 내부에 모든 핵심 기능을 내장하는 대신에 
확장 가능(Extensibility)하도록 설계되었기 때문에 
많은 호응을 얻었는데,

이러한 특징이 현재 머신 러닝 관련 강력한 API를 
Python이 소유할 수 있도록 도왔다고 생각 한다.

Python의 철학은 The Zen of Python이라는 
Python을 작성하기 위한 19가지 법칙에서 잘 드러나는데[5]
다른 것보다 생산성에 주목한 것을 알 수 있다.

Python의 웹 서버 프레임워크 중 
가장 유명한 것은 




Django이다.

다음으로 Ruby는 


1995년에 처음 등장한 언어로서


마츠모토 유키히로에 의해 설계되었다.

Ruby는 동적 타이핑을 지원하며 가비지 컬렉션도 사용하며,
구조적, 객체지향, 기능적 등의 다양한 패러다임을 지원한다.

Python과 매우 유사한 느낌을 받을 수 있다.

Ruby의 철학은 설계를 한 
마츠모토 유키히로의 인터뷰에서 살펴볼 수 있는데,[6]

그는 "루비로 전 세계의 프로그래머들의 생산성을 높이고
프로그래밍을 즐기고 행복할 수 있게 돕고 싶으며
이것이 루비의 주요 목적"이라고 이야기하며,

Python과 유사하게 생산성에 주목한 것을 엿볼 수 있다.

Ruby의 웹 서버 프레임워크 중 
가장 유명한 것은 


Ruby On Rails이다.






참고 : 






















2020.10.04 초안 작성 및 개행 완료




이 블로그의 인기 게시물

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

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

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