[ 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, Essay - Developer ] 제 1장 : 컴퓨터 개론 - 왜 개발자는 컴퓨터 개론을 배워야 하는가?

드디어 본론으로 넘어갈 차례다.

앞서 우리는 몇 가지 개발자에 대한 논의를 해보았고,
이런 나의 논의가 교육을 받는 자로 하여금
그리고 이 글을 보고 있을 당신에게 도움이 되었기를 바란다.

또한 나의 논지에 동의하지 않더라도,
그에 대한 논의를 스스로 꼭 해보길 바란다.

왜냐하면,
이런 고찰을 해봐야 개발자가 하는일이 무엇이고,
어떻게 나아가야할지가
즉, 개발자로서 큰그림이 그려지기 때문에

이는 당신의 커리어에도 많은 도움이 될 것이다.

어쨋든 본론으로 다시 돌아가서

먼저 왜 개발자가 컴퓨터 개론을 배워야 하는지
논의부터 하고 넘어가야 된다.

이에 대해 또 논의야?라며 질색을 하는 사람이 있을지는 모르겠지만,
이런 논의들

그러니깐 철학적인 생각은 커리어 뿐만아니라 인생에서도
꼭 필요한 것들이다.

현대 교육에서는 이런 철학적 생각들 보다
지식을 머리에 쑤셔넣는 것을 우선시 하기 때문에

이것이 인생에 있어서,
더 나아가 커리어에 있어서 가장 중요함에도 불구하고
외면시 받고 있는 것이 현실이다.

이런 현실에 대해 밀은 고대 그리스(로마)이 교육을 비교하며,
인간에 대한 근본적인 철학적 생각들을 하지않는 것에
매우 유감스럽다는 표현을 한다.

나 또한 이에 동의한다.

어떤 학문을 받아들일때
왜 이 학문을 배워야하는가에 대해 진지한 고찰이 없다면,
그 학문의 '부분적 진리'라는 원석은 얻을 수 없고,

'단순한 지식'이라는 껍데기 밖에 얻을 수 없을 것이다.
심지어 그런 '단순한 지식'은 대개 '진리'는 아니며,

학자들이 논의와 실험을 통해
'이럴 가능성이 높겠다'라는 의견이다.
(그들을 비난하는 것이 아니다.
단지 '진리'가 아님을 이야기 하고 싶을 뿐이다.)

따라서 우리는 이런 학문조차 의심할 필요가 있다.

다시 말해서,
흔히 말하는 비판적 사고(Critical Thinking)를 통해
우리는 학문 조차 의심을 해볼 필요가 있다는 것이다.

왜냐하면 대개 '진리'가 아니기 때문이다.

다시 말하지만, '비판'이지 '비난'이 아니다.
오해 없기를 바란다.

따라서 학문을 배우기 앞서서,
학생으로서, 개발자로서, 배우는 자로서 우리는 학문에게
질문을 던져볼 필요가 있다.

'왜 이 학문을 학생으로서, 개발자로서, 배우는 자로서 배워야하는가?'
라고 질문을 던져보자.

물론 학문에게 질문을 던져봐야 대답은 해주지 않는다.

내가 여기서 질문을 던지라는 이야기는
스스로에게 질문을 던지라는 이야기 이다.

따라서 컴퓨터 개론도 마찬가지겠지만,
시작하기 앞서서 이런 '왜?'라는 것을 꼭 하고 넘어갈 것이다.

물론 이 것을 볼것이냐, 안볼 것이냐는 결국
보고 있는 당신의 판단이다.

나는 볼 것을,
그리고 한 번쯤 생각해 볼 것을 강력히 권하는 바이지만,
생각하고 싶지 않다면
그 것은 당신의 '자유'다

하지만, 자유에는 책임이 따르는 법,
당신이 나의 지식으로 훌륭한 Coder는 될 수 는 있겠지만,
훌륭한 Programmer, Developer는 될 수 없을 것 이다.

될 수는 있을 지는 모르겠다.
하지만 당신은 내가 말하는 '해결사'가 될 수 없을 것이다.

어쨋든 나는 이 글을 읽고 있는 당신의 선택을 존중한다.

또한 이런 지식을 전해줄때 가장 신경 쓰이는 부분은
역시 이 지식이 맞는 지식인가에 대한 이야기이다.

따라서 나는 이에 대해 가급적 출처를 달려고 할 것이며,
개념에 대해서는 대개 위키 백과를 참고할 것이다.

그리고 내가 이 프로젝트를 통해서
다른 사람들에게 전하고 싶은 것은 지식도 있지만,
왜 이런것들이 필요한지에 대한 직감을 전하고 싶었다.

이 직감을 전하는 것이 나의 프로젝트에 목표이며,
직감을 얻었더라면, 사실 지식은 크게 필요 없을지도 모른다.

따라서 나는 지식의 정확성 보다는
어떻게 하면 이런 나의 직감을 전할 수 있을지에 대해
더욱 고민할 것이다.

따라서 첫장인 컴퓨터 개론에서 내가 전달하려는
지식이 부분적으로 틀릴수 있음을 인정하는 바이다.

그리고 이런 나의 글을
내가 틀릴수 있음을 먼저 언급함으로써

나의 글을 비판적으로 보고,

이를 통해 비판적 사고가
어떤 것이지에 대해 한걸음 내딛었다면
더욱 기쁠 것이다.

이 이야기는 이번을 끝으로 언급하지 않을 것이다.

・왜 컴퓨터 개론을 배워야 하는가?


나의 지긋지긋한 잔소리를 참고 들었고,
나의 논지에 동의한다면

우리는 다음 단계로 넘어갈 수 있을 것이다.

왜 '개발자는 컴퓨터 개론을 배워야 하는가?'에 대해 질문을 던져보자.

흔히, 서점에 컴퓨터 개론의 교과서들을 보면,
이런 저런 많은 내용들이 있을 것이다.

사실 현재 사람들의 대학교에 대한 인식은 '직업 훈련소' 라는 인식이 강하다.

이런 인식에 따라 '대학 졸업장'을
이 사람이 직업 훈련소를 훌륭히 마쳤다는 증명서로서 생각 한다.

하지만 그렇지 않다.

그런 인식이 있다고 하더라도,
대학교라는 곳은 엄연히 '학문'을 하는 곳이다.

기본적으로 '학문'은 탐구다.
어떤 사실에 대해 깊은 탐구를 하고
이에 대한 이론을 연구하는 '학문'을 하는 곳이다.

따라서 대학교는 '학문'을 하는 곳이지
'직업 훈련소'가 아니다.

이런 인식을 가지게 되었던 것은
아마 사회가 발전하고 고도화됨에 따라
이런 '학문'이 현실에서도 그 일부가 필요하며,
도움이 되기 때문이라고 생각한다.

그렇기 때문에
그런 '학문'의 일부를 배우기 위해
그 일부를 배우고 취업하기 위해,

그 일부를 배웠다는 증명서인
'졸업장'을 얻기 위해 대학에 간다는 인식이
사람들로 하여금,
대학교를 '직업 훈련소'로서 인식하게 끔 했으리라 생각된다.

따라서 대학에서 배우는 이런 것들은
'학문'으로서 설명되기 때문에

마치 역사책 처럼 이 이론을 제안한 제안자의 이론 부터
그 과정의 사장된 이론의 학자들과 그 이론,
그리고 논의가 진행되고 있는 현대의 이론 까지
(대부분 가장 유력한 이론이 나온다)
세세한 부분 까지 설명이 되어져있는 책일 것이다.

따라서 기본적으로 학문으로서의
이런 책들은 두꺼울 수 밖에 없다.

하지만 개발자
특히 그 중 소프트웨어 개발자들에게 필요한
컴퓨터 개론에서 얻을 수 있는 '부분적 진리'에 대해서는
극히 일부만 알면 된다.

왜냐하면, 여기서 다루는 이야기는
대부분 하드웨어적인 이야기이기 때문에

소프트웨어랑은 거리가 조금 멀다.

그럼에도 소프트웨어 개발자들이
컴퓨터 개론을 배워야 하는 이유는 명쾌하다.

왜냐하면, 하드웨어로 구동되는 것이 소프트웨어이기 때문에
소프트웨어 개발자로서 컴퓨터가 어떻게 구성되는지
대략적인 그림은 이해하고 있어야하며,

또한 어쩌면 이런 하드웨어가 훌륭하지 못한 상황에서
소프트웨어를 구동해야하는 상황이 올지도 모르기 때문이다.

특히 CPU, RAM(Cache), HDD(저장장치)에 대해서는
우리가 꼭 알고 넘어갈 필요가 있다.

・결론

여기까지 나의 논지에 동의한다면 
아마 당신은 컴퓨터 개론을 배워야할 필요가 있을 것이다.

왜냐하면 
하드웨어로 구동되는 것이 소프트웨어이므로
소프트웨어는 하드웨어에 종속될 수 밖에 없다.

그렇기 때문에 제한적인 하드웨어를 가질 경우
이에 대비해야 한다.

물론 어떤 사람은 나의 이야기에 
그건 당연한 이야기가 아니냐며 
항의 아닌 항의를 할지도 모르겠지만

앞서 계속해서 언급했듯이 
중요하다고 이야기하면서도
왜 중요한지에 대해 이야기를 해주는 사람은 드물기 때문이다.

물론 내가 내린 결론이 꼭 맞다고 하기는 힘들다.

왜냐하면 이것은 오로지 나의 의견이기 때문이다.

사람마다 중요하다고 생각하다고 부분이 다를 수 있다.

물론 나의 의견이 충분히 비판받고 개선되어
다른 동료 개발자들이 동의한다면 
비교적 옳바른 의견이라고 할 수는 있겠지만
그렇지 않기 때문에 
이러한 점에서는 생각을 해보는 것이 좋다.

이는 프로젝트 BEP의 모든 글에도 해당되는 말이다.

하지만, 이러한 부족한 나의 의견에도 
'부분적 진리'가 있음에는 믿어 의심치 않기 때문에

나의 '부분적 진리'를 잘 캐내어서 
원석을 얻어내기를 바란다.

따라서 이번 1장에서 
내가 여기서 이야기 할 내용은
컴퓨터 아키텍쳐들을 살펴보고,

그리고 CPU,RAM,HDD(저장장치)에 대한 이야기
가장 중요한 폰 노이만 구조의 병목 현상에 대한 이야기까지
하고 끝낼 것이다.

특히 내가 이야기하고자 하는 
컴퓨터 개론에 대한 이야기들은
아마 직접 부품들을 사서 조립이 가능한 사람들에게는
다소 쉽게 다가올 수 있을 것이다.

여기까지 해서 왜 개발자는 
컴퓨터 개론을 배워야 하는가에 대한 이야기를 해보았다.

나의 이런 논의가 컴퓨터 개론이라는 학문을
개발자로서 받아들일때 도움이 되었길 바란다.

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

2020.03.18 초기 논의 작성 완료
2020.03.20 개행 및 내용 수정
2020.05.29 개행 및 내용 수정

이 블로그의 인기 게시물

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

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

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