[ 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 ] 제 1장 : 컴퓨터 개론 - 컴퓨터 아키텍처에 대해


이번 글에서는 컴퓨터 아키텍처에 대해 이야기 할 것이다.

현재에 와서는 여러가지의 컴퓨터 아키텍처가
언급될 수 있으나,
소프트웨어 개발자로서,
그 중 비전공자 주니어에게 알아야 하는 것은
폰 노이만 구조 만 알면 된다고 생각한다.

왜냐하면,
지금 존재하고 있는 컴퓨터 기기들은 모두 이런
폰 노이만 구조에 크게 벗어나지 않았다고 봐도 무방하기 때문이다.

따라서 일단 폰 노이만 구조에 대해 대략적으로 이해하기만 한다면,
다른 컴퓨터 아키텍처에 대한 것은
필요할때 마다 공부하면 된다.

이는 사실 Programmer라던가 Developer등의
다음 레벨의 개발자들에게도 마찬가지라 나는 생각하고 있다.

따라서 이번 글에서 이야기하고자 하는 것은
폰 노이만 구조 단 하나의 컴퓨터 아키텍처만 설명할 것이다.

그럼 이에 대한 이야기를 시작해보자.

폰 노이만에 대해


소프트웨어던 하드웨어던,
우리가 개발자로서 일을 할수 있는 것은
사실 이런 폰 노이만 구조와 같은 이론을
제시한 사람들이 있기 때문이다.

따라서 우리는 개발자로서 초기 컴퓨터 구조를 제시해준
폰 노이만과 그의 동료들에게
머가리를 천번 박아도 모자를 지도 모르겠다.

어쨋든 폰 노이만은 천재로서 세상에 알려져 있다.

그의 업적을 보면,
그 누구도 이에 동의하지 않는 사람은 없을 것이다.

폰 노이만은 아래와 같이 생겼다.

폰 노이만
하지만 이런 의문이 든다.

폰 노이만이 분명 천재이고,
그가 위대한 업적을 남긴것에 깊이 공감하며,
그 업적에 대해서는 찬사를 보내는 바이지만,
소프트웨어 개발자로서 그를 자세히 알 필요가 있을까?

나는 없다고 생각하기 때문에
딱히 언급하지는 않겠다.

하지만, 컴퓨터를 제외하고도 수학 등의 업적을 남긴 사람이기 때문에
어떻게 생긴 사람인지는 알아야 되며,
폰 노이만은 충분히 그럴 자격이 있는 사람이다.

혹시 알고 싶은 사람을 위해서 아래 위키백과의 링크를 남긴다.
(https://en.wikipedia.org/wiki/John_von_Neumann)

폰 노이만 구조에 대해


실제 우리들이 쓰고 있는 컴퓨터 시스템들이
이런 아키텍처로 이루어져 있기 때문에

앞서 우리는
이 폰 노이만 구조를 세상에 제시해준
폰 노이만와 그의 동료들에게 깊은 찬사를 보냈다.

또한 이 자리를 빌어
다시 한번 그에게 찬사를 보내는 바이다.

이 쯤하면 그도 충분히 만족하리라 생각된다.

그럼 이제 우리의 목표인 폰 노이만 구조를 살펴보자.



위와 같은 아키텍처를 폰 노이만 구조(Von Neumann architecture)라고 한다.

물론 이 아키텍처는 폰 노이만과 그의 동료들이
에드박(EDVAC) 보고서의 최초 초안(First Draft of a Report on the EDVAC)에서
서술된 기반으로 만들어진 아키텍처이다.

따라서 사실 폰 노이만이 혼자서 제시한 아키텍처는 아니며,
에드박의 보고서에는 수학적 논증만이 있을 뿐
위와 같은 아키텍처를 실제로 그들이 제시한 것은 아니라고 한다.

어쨋든 나는 현재(2020년)의 컴퓨터 아키텍처와
폰 노이만 아키텍처를 구분하여, 분류 할 것이다.

보기 쉽게 일단 색으로 표시해놨다.

분류는 다음과 같이 하였다.

제어 장치, 산술장치 → CPU(중앙처리장치)
메모리 → RAM, Cache, HDD(SSD)
누산기와 입력, 출력 → 프로그램(소프트웨어)

누산기와 입력, 출력에 대해 조금 오해의 소지가 있을 수 있어서
따로 언급하지만,

산술 장치 안에 있는 누산기는 물론 하드웨어로 구성되어 있다.

하지만, 좀 더 소프트웨어에 대한 이해를 돕기 위해
이런 누산기를 따로 빼서 이를 프로그램으로 취급하겠다.
물론 이를 좀 더 작은 개념에서 함수클래스와 같은 것으로 생각해도 무방하다.

그럼 분류를 하였으니 각각 살펴보자.

① 제어 장치, 산술 장치 → CPU(중앙처리장치)

이런 제어 장치와 산술 장치가 합쳐진 것이
현재 컴퓨터의 CPU라고 봐도 무방할 것이다.


따라서 우리는 위의 폰 노이만 아키텍처를 현실의 하드웨어에 대입해보면

AMD사의 RYZEN

위와 같은 AMD사의 RYZEN이라는 모델명의 CPU라고 할 수 있을 것이다.

이런 CPU에서 하는 일은 간단하다.
우리가 컴퓨터를 사용할때의 모든 명령과 계산은 이 CPU를 거친다.

우리는 컴퓨터를 부팅하면 운영체제로 진입할 탠데,
이런 운영체제와 그 운영체제 안에서 이루어지는 대부분의 명령 및 연산은
CPU에서 이루어진다.

② 메모리 → RAM, Cache, HDD(SSD)

폰 노이만 구조에서의 메모리는 모든 저장장치를 말한다.



현재 많은 사람들이 메모리라고 인식하는 것은
아마 RAM일 것이다.
RAM

하지만, 폰 노이만 구조에서의 메모리는 모든 저장장치이기 때문에
하드 디스크라고 불리우는 HDD와 SSD도 포함되며,
Cache도 마찬가지다.

Hard Disk Drive(HDD)

Soild State Drive(SSD)
Cache
심지어 Cache의 경우는 중앙처리장치인 CPU에서도 활용된다.

③ 누산기와 입력 출력 → 프로그램(소프트웨어)

다시 한번 말하지만,
설명의 편의를 위해 소프트웨어 취급 하는 것이다.


이런 소프트웨어는 크게 운영체제나

MS사의 Windows 운영체제

게임


Blizzard사의 WOW

등의 소프트웨어가 포함될 수 있으며,
작게는 단 하나의 함수와 같은 모듈도 포함된다.

그리고 이런 아키텍처의 부품들(물론 소프트웨어는 제외)은 Mother Borad라는
메인보드에 모두 장착되어져,

Mother Board(메인보드)

폰 노이만 구조 기반의
하나의 컴퓨터로서 기능을 하게 된다.

현대의 컴퓨터 기기라고 불리우는 것은
모두 이런 기반으로 만들어져있다고 해도 과언이 아니다.

현실에서 우리가 자주 볼수 있는 기기들인
데스크톱 컴퓨터, 노트북 컴퓨터와

데스크톱

노트북

그리고 최근에 패러다임인 모바일 컴퓨터의 대표 기기인

스마트폰
스마트폰까지 속 내부를 들여다보면
대개 이런 폰 노이만 구조에 크게 벗어나지 않는다.

이에 따라 우리는 폰 노이만 구조를 조금 더 확장 할 수 있다.

폰 노이만 구조의 확장

위와 같은 그림으로 확장 할 수 있으며,
소프트웨어 개발자로서 신경써야 할 부분은
보라색 박스 부분 뿐이다.

따라서 컴퓨터 개론에서 추출 할 수 있는
소프트웨어 개발자로서의 학사적 지식인 '부분적 진리'는
보라색 박스에 있다고 조심스럽게 결론지을 수 있다.

하지만, 나의 이런 논지에
어떤 사람들은 '나머지도 알고 가면 좋지 않느냐'라는 식으로
반박할지는 모르겠다.

물론 알고 가면 좋을 수 도 있다.

왜냐하면 그런 사람들은
'언젠가는 도움이 될것이다' 라는식의 논지이며,
나도 '언젠가'는 도움이 될지는 모르겠다는 의견에는 동의한다.

하지만 그 '언젠가'가 정확히 언제인지,
어느 시점인지는
그런 이야기를 하는 사람들은 모르는 척 한다.

만약 당신이 미래의 임베디드 개발자나 하드웨어 개발자로
전직한다는 계획을 가지고 있다면,
얼마나 도움이 될지는 알 수 없으나,
알고 있는 것도 괜찮을 것이라 생각한다.

하지만 그렇다고 하더라도
지금 당장 우리는 소프트웨어 개발자로서 일해야 하며,
소프트웨어 개발자로서 알아야 할 
컴퓨터 개론의 학사적 지식은 저 부분 뿐이다.

또한 설사 임베디드 개발자나 하드웨어 개발자로 전직하더라도
그 때가서 공부해도 충분히 늦지 않다.

흔히 듣는 이야기겠지만
선택과 집중을 할 필요가 있다.

어떤 사람들에게는 매우 불행한 이야기 일지는 모르겠지만
개발자는 평생 공부하는 직업이다.

자신의 가치를 증명하기 위해서
패러다임의 변화라는 큰 파도에 같이 올라 타야만
오래 살아남을 수 있다.

대게 저런 식으로 반박하는 사람들은
공부는 학생때 하고 끝이라는 생각을 가지고 있기 때문에
필요 없을지도 모르는 지식들 까지 모두 배우고
고찰과 성찰 없이 지식 만을 머리에 쑤셔 넣으려고 한다.

물론 이런 나의 이런 이야기에 그들은 손사래를 치며
그렇지 않다고 말할지는 모르겠다.

단 한번에 이해의 영역에 도달하기는 매우 힘들다.

물론 어떠한 사람들은 '난 됐는데'라며 이야기 할지는 모르겠으나

내가 됐기 때문에 다른 사람들도 될 것이라는 생각에서 
이제는 벗어날 필요가 있다.

이전과 다르게 이미 사회가 고도화 되었고 
이에 따라 고도로 분업화 되었기 때문에 
내가 할 수 있는 것을 다른 사람들은 못할 수 있다.

만약 그러한 생각이 아니라
단순히 상대를 업신여겨서 자신의 비열함을 만족시키기 위해서 라면
내가 이에 대해서 더 이상 말할 필요는 없을 것 같다.

하지만 정말로 그렇지 않다면
그런 것 들은 필요할 때 마다 탐구라는 이름의 공부하면 되는 것이다.

따라서 소프트웨어 개발자로서 일하고 싶은 우리들은
하드웨어 지식까지 알 필요는 없다고 나는 생각하고 있다.

하지만 그럼에도 더 알고 싶은 사람들은 따로 공부하면 된다.

탐구라는 이름의 공부를 해야하는 
적절한 시기는 있을지도 모르겠지만
해야만하는 시기는 존재 하지 않는다.

시중에 학문적인 컴퓨터 개론의 교과서가 많으며
거기에는 그런 사람들을 만족시킬 수 있는 지식들이 많을 것이다.

선택은 각자의 몫이다.

어쨋든 이런 폰 노이만 구조로 인해 확장된 것이
아래와 같은 아키텍쳐 구조이다.

폰 노이만 구조 기반의 현재 컴퓨터 아키텍처

혼란을 피하기 위해
폰 노이만 구조의 색을 그대로 가져왔다.

위에서 언급했던 것과 동일하게 아래와 같이 분류하겠다

제어 장치, 산술장치 → CPU(중앙처리장치)
메모리 → RAM, Cache 등
그외의 디바이스(저장 장치 등) → HDD, SSD , USB Drive ,CD Drive 등  

여기까지 해서 컴퓨터 아키텍처에 대한 이야기는 끝이다.
아키텍처에 대한 이야기는 끝났지만,

이런 아키텍처에 큰 단점이 있는데,
이는 우리 소프트웨어 개발자들에게도 매우 관련있는 이야기이다.





참고 -

폰 노이만 구조 :
https://ko.wikipedia.org/wiki/%ED%8F%B0_%EB%85%B8%EC%9D%B4%EB%A7%8C_%EA%B5%AC%EC%A1%B0

RAM 속도에 관해 :
https://www.howtogeek.com/438671/why-you-should-overclock-your-ram-its-easy/

CPU 속도에 관해 :
https://www.howtogeek.com/177790/why-you-cant-use-cpu-clock-speed-to-compare-computer-performance/

Cache Memory에 관해:
https://searchstorage.techtarget.com/definition/cache-memory




이 블로그의 인기 게시물

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

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

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