[ 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 ] 논의③ : 개발자는 무엇인가?(What is Developer?)


아마 마지막 논의가 될 것이라 생각된다.

앞서 우리는 개발자에게 학위가 필요한지, 그리고 수학이 필요한지에 대해
조금 논의해봤다.

그럼 마지막으로 개발자(Developer)라는 것이 무엇인지
그리고 어떻게 분류되어지는지,
마지막으로 각각 하는일은 무엇인지에 대해 논의해보자.

개발자란 무엇인가?


사실 한마디로 딱 정의 내리기가 어렵긴하다.

왜냐하면 이 개발자라는 개념 자체가 명쾌하지 않기 때문이다.
따라서 사람들마다 말하는 개발자가 다를 수가 있다.

또한 다른 사람들과의 논의 없이
개발자에 대해 정의내리는 것이 매우 꺼려진다.

그럼에도,
교육을 위해서 하고 넘어가야 하기 때문에
내 스스로 감히 정의 내려보겠다.

사람들이 흔히 말하는 개발자는 다소 다를 수 있지만,
비교적 명쾌하다고는 할 수 있다.

왜냐하면,
개발자가 '프로그래밍을 하는 사람' 이라는 직업이라는 것은
비교적 명쾌하기 때문이다.

하지만 정확히 어떤 일을 하는지에 대해서는
위와 같이 명쾌하지 않기 때문에 사람마다 이야기가 다를 수 있지만,
개발자가 '프로그래밍을 하는 사람'임에는 틀림없다.

하지만 정확히 개발자가 무엇을 하는지에 대해 논의하려면
좀 더 큰 틀에서 봐야할 필요가 있다.

왜냐하면 개발자로서 직업을 가질 수 있는 이유는
큰 틀의 사회에서 필요로 하기 때문이다.

그래서 큰 틀의 사회가 개발자들에게
어떤 것을 요구하는지 알 필요가 있다.

큰 틀에서 보면 개발자는
'사회에서 해결하지 못한 문제를 IT기술을 통해 해결해주는 사람'이다.

여기서 몇가지 단어를 추출해 줄여본다면
'사회의 문제를 해결해주는 사람'이다.

따라서 개발자는 크게 보면,
위와 같이 '사회의 문제를 해결해주는 사람'이다.

이런 개발자들이 두각을 나타내기 전의 근대의 사람들은
기록을 남길 때, 남들과 의사소통을 할 때
모두 '종이'라는 매체를 이용하고
이것이 남겨지고, 전달되어져 왔다.

하지만, 이런 방식은 몇 가지 단점이 존재했는데

크게 모두 종이를 필요로 했기 때문에
나무를 베어서 만들어야 하는 그리고 그 과정에서 생기는 에너지 낭비,

작게는 전달되는 시간이 걸린다는 점,
그리고 종이가 부패된다는 점 등 여러가지 문제점들이 있었다.

이런 문제가 컴퓨터가 발달됨에 따라
기계를 통해 디지털을 통해 해결되었다.

그 해결 과정에서 개발자들은 종이라는 매체를 대신하기 위해
IT기술을 활용해 사회에, 그리고 시장에
여러번 제안해왔고,

몇 가지 솔루션은 시장에서 성공해
우리는 현대의 컴퓨터를 이용해
자료를 보존 하거나,
메일을 보내거나,
인터넷으로 소통하는 등으로 패러다임이 바뀌었다.

이제는 그 어떤 회사도 사실상 
대량의 서류를 보관하지 않으며 
모두 디지털로 보관하는 시대가 온 것이다.

이런 IT기술이 발달하는 과정에서
세계의 사람들은 과다한 종이'사용으로 인한
자연 생태계의 파괴를 걱정했으나,

IT기술이 어느 정도 발전하자,
언제 그런 걱정이 있었나 싶을 정도로 조용해졌다.

따라서 사람들이 모두 컴퓨터(또는 스마트폰을 포함한 유사한 전자기기)라는
전자기기 플랫폼에 익숙해져 있는 한,

IT개발자들의 일거리는 사라지지 않을 것이다.
그래서 뉴스에서 미래에 개발자들이 부족해질 것이라는
뉴스는 어찌보면 당연한 것 이다.

이에 따라 사람들은 
개발자들을 불쌍한 시선으로 바라보지 않으며
자신들이 개발자가 되고 싶어 한다.

특히 구글 알파고팀의 인간과 
배우는 기계 머신러닝의 세기의 쇼 매치가 
세계의 시선을 사로 잡는데 성공하면서

이러한 현상은 더욱 두드러지는 것 처럼 보인다.

실제로 대학다니던 이래저래 많은 도움을 받았던
논문 지도 교수님의 '요즘 애들은 너가 대학생일 때보다 
더 열심히 하더라 술도 안마시고 들어오고'라는 
농담 섞인 말은 그러한 현상이 사실임을 나에게 보여주는듯 하다.

이런 말을 하면,
개발자가 어떤 직업보다 우월하다는 뉘앙스로 받아들일지는 모르겠지만,
그렇지 않다.

개발자는 IT기술을 통해 문제를 해결해준다.
다른 직업 또한 고유의 능력으로 문제를 해결해주는 해결사들이다.

변호사 라면 자신의 능력을 활용해 법관련해서
곤란한 사람들의 문제를 해결해주며,
정치가들은 자신의 능력을 활용해 정치관련해서
곤란한 사람들의 문제를 해결해준다.

개발자는 IT기술을 통해 사람들이 불편해 하는 것을
개선하고 문제를 해결해주는 것 뿐이며,

적어도 난 개발자에게 그 이상의 의미는 없다고 본다.

사회가 고도로 발달되고, 
고도의 숙련도와 지식이 필요해졌기 때문에
이는 어찌보면 당연한 결과이다.

이는 개발자의 다음 단계인 엔지니어나 
아키텍터 또한 마찬가지다.

어쨋든 개발자라는 직업은 크게 보면
'사회의 문제를 해결해주는 사람'이다.

즉, 개발자는 사회에 요구에 따라
사회 문제에 대한 솔루션을 제시해야만 한다.

다른 사람은 어떻게 생각하는지 모르겠으나
난 적어도 그런 인식을 가지고 있으며,
그 속에서 나타나는 자긍심을 가지고 살아가고 있다.

개발자의 분류


그럼 조금 더 명쾌하게 개발자에 대해 이야기 하기 위해서
개발자를 조금 분류해보기로 하겠다.

위에서 언급했듯이
사람들에게 보통 개발자에 대한 인식은
'프로그래밍을 하는 사람'이거나
'영어로 알 수 없는 것을 적어서 프로그램을 만드는 사람'이 둘 중
어느 사이에 있을 것이다.

특히 내가 BEP프로젝트의 주 대상인
비전공자 주니어라면
'영어로 알 수 없는 것을 적어서 프로그램을 만드는 사람'
에 더 가까울 것이다.

왜냐하면, 이런 비전공자 주니어들은 
일반 주니어들과 다르게
심하면 프로그래밍에 대해 들어보지 못한 사람들도
심심치않게 있기 때문이다.

물론 실제 IT업계에서 꽤나 일한 사람들이라면 
프로그래밍을 하는 것 만이 
개발자의 일이 아니라는 것은 잘 알겠지만,
일반적인 인식은 프로그래밍만을 생각 한다.

따라서 이런 비전공자 주니어들이 영어에 익숙하다면 다행이고,
또 프로그래밍에 금방 익숙해 지거나, 흥미를 느낀다면 다행이지만

그렇지 않다면
그들에게는 개발자의 일이 지옥과도 다름없을 것이다.

왜냐하면
항상 문제를 해결해야만하는 상황에 노출되어있는
개발자들에게 문제해결능력 중 하나인 
잘하건 잘 하지 못하건 프로그래밍에 흥미를 느끼지 못한다면
일상 속에서 엔트로피가 쌓여서 
늦던 빠르던 일을 할 수 없게 되는 것은 
보지 않아도 이미 정해져 있는 미래이기 때문이다.

그런 상황에서 
내가 해줄 수 있는 것이라고는
내 지식과 관점을 나누어주는 것 밖에 없기 때문에

나의 지식과 관점을 나누어주는
이 프로젝트 BEP를 완수하는 것이
내가 해줄 수 있는 최선이라고 생각한다.

어쨋든 본제로 돌아와서
개발자에 대해 분류하기 할탠데,

분류하기 앞서서 IT업계에서는
그래도 어느 정도 분류하는 것은 있다.

막 입사한 개발자를 어떤 실력을 가지고 있던간에
주니어(Junior) 개발자라고 부르며,

어느정도 일을 한 개발자를 어떤 실력을 가지고 있던간에
시니어(Senior) 개발자라고 부른다.

이는 IT업계의 어떤 관습적인 규칙같은 것인지라
개발자의 실력대로 
그에 따른 카테고리가 붙여져야 함에도
이런 모순적인 것이 있음을 먼저 알린다.

또한 여기서 이야기하는 분류는 
내가 생각하는 분류법이므로,
이것이 '진리'는 아님을

그리고 여기서 이야기하는 개발자는 
소프트웨어 개발자임을 먼저 밝힌다.

따라서 분류법에 대한 모순에 대해 
나에게 이야기한들 나는 딱히 해줄말이 없다.

나는 개발자들을 다음과 같이 분류한다.

코더(Coder) → 프로그래머(Programmer) → 개발자(Developer) → 소프트웨어 엔지니어(Software Engineer)

그럼 코더부터 시작해서 차례대로 어떤 일을 하는지 살펴보자.

①코더(Coder)

여기서 코더는 흔히 이야기하는 막 입사한 주니어와 
그 레벨에 있는 사람들을 모두 이야기한다.

직함으로는 시니어라고 불리울지는 모르겠지만,
실력면으로는 코더에 불과한 사람들이 꽤나 있다.

어쨋든 여기서 코더의 정의는 
'단순히 결과물만 신경쓰는 사람'을 말한다.

물론 실력 좋은 주니어들 중에서는 
프로그래머 급의 실력을 
가지고 있는 사람도 있지만 
이는 매우 드물며,

그런 실력을 가지고 있다고 하더라도 
대개 실무에서의 프로그래머 급의 실력을 보유하고 있지는 않다.

이는 일반적으로 사회에 
매우 유용한 엔터프라이즈 급의 시스템 개발은
혼자 개발할 수 없기 때문이다.

생각해보아라.

이제는 일상으로 사용되는 유튜브는 
단순한 기술로 만들 수 있는 것이 아니다.

대량의 데이터 센터도 필요하며
이를 잘 분산 시킬 서브 시스템 뿐만 아니라
지금의 유튜브 크리에이터들과 매출을 공유하는 시스템은
단순히 프로그래밍을 잘한다고 나올 수 없는 시스템이다.

프로그래밍 뿐만 아니라 법률적인 부분까지 시스템에 반영해야한다.

따라서 이런 코더들은 단순히 결과물만 신경쓰기 때문에
그들은 코드의 가독성, 종속성, 재사용성 등의 최적화에 대해 고려하지 않는다.

따라서 그들이 만든 크게는 프로그램, 
작게는 함수 안에는 
이런 것들을 고려하지 않아 나오는 
수 많은 버그들이 포함되있을 가능성이 매우 높다.

따라서 프로그램이 크면 클 수록 이런 리스크에 노출되어있다.

또한 실무에 대한 경험이 없기 때문에
암묵적인 룰이나 커뮤니케이션 등에 익숙하지 않아 
시니어들의 세심한 보살핌이 필요하다.

그렇기에 주니어로서 주어지는 일은 테스트와 같은
간단한 일이 주어질 것이다.

하지만, 프로젝트 기간이 촉박하다면
비교적 어려운 일이 주어질지도 모르지만,
그럴 경우 수 프로젝트가 많은 리스크에 노출되기 때문에 
프로젝트 입장에서는 좋은 선택은 아니다.

②프로그래머(Progarmmer)

프로그래머는 단순히 결과물에 머물러 있지 않고
로직의 코드의 가독성종속성재사용성 등의 
완벽하지는 않더라도 최적화를 염두해두고 있으며,
적어도 한 가지 이상의 프로그래밍 언어를 다룰 수 있는 사람을 말한다.

하지만, 시스템에 대한 전체적인 이해의 부족
그리고 최적화에는 염두를 하고 있지만 애매한 최적화로
결국 결과물 중심에 크게 벗어나지는 못하기 때문에
여기서 생길 수 있는 리스크에 노출되어 있다.

뭔가 애매한 위치의 개발자이다.

코더와 다르게 설계는 할 수 있으나 어설프며,
함수나 클래스와 같은 코드의 설계에 머물러 있어
전체 시스템적 설계는 할 수 없다.

따라서 코더를 논외로 치자면,
사실상 개발직 중에서 가장 코드에 묶여 있다고 볼 수 있다.

일반적으로 많은 개발자들이 이 레벨에 머물러 있다고 생각한다.

③ 개발자(developer)

프로그래머(Programmer)의 상위호환으로 
전체적인 시스템을 설계할 수 있고, 
적어도 2개 이상의 언어를 다룰수 있어 
다양한 언어에 대한 이해,
다양한 시스템의 개발 경험과 지식이 있는 개발자들을 말한다.

이들은 프로그래밍 언어에 대한 이해가 충분하기 때문에
어떤 시스템에 어떤 언어가 좋은지 알고 있다.

따라서 시스템 관점의 설계가 가능하고,
이를 바탕으로 코드의 최적화를 고려할줄 아는 개발자를 말한다.

어떤 요구사항이 와도 뛰어난 퍼포먼스의 코드를 만들 수 있지만,
대부분 설계에 시간을 보내기 때문에 
프로그래머(Programmer)보다는 프로그래밍에는 많은 시간을 투자하지 않는다.

따라서 코드에 어느정도 벗어나 
사회의 문제를 IT기술로 해결 해 줄 수 있는 해결사의 역할을 할 수 있는 
진정한 의미에 개발자가 이 개발자(Developer)들이다.

④ 소프트웨어 엔지니어(Software Engineer)

코더, 프로그래머, 개발자들은 코드에 어느정도 종속되어 있지만,
이 들은 코드에서 완전히 벗어나 있다.

소프트웨어 엔지니어(Software Engineer)들은 
코드와 어떤 한 시스템에서 벗어나 그 이상의 것을 생각한다.

개발자(Developer)의 능력을 기본으로
아직 해결되지 않은 문제들을 소프트웨어로 해결하기 위해
특정 문제를 수치화해 분석하고 솔루션을 제시해주는 개발자다.

이들은 아직 해결되지 않은 현실의 문제를
어떻게 하면 코드의 세계와 현실의 세계를 연결할 수 있을 지를 생각하고,
전체적인 소프트웨어 시스템을 설계하고 현실에 제안한다.

또한 단순히 이 시스템이 좋은지, 좋지 않은지가 아닌
그 시스템이 현실에 정말 유용한지, 유용하지 않은지를 고려한다.

물론 현실의 소프트웨어 엔지니어는 
모든 개발 단계에서 활약할 수 있는 풀 스택 엔지니어에 의미에 가깝다.

여기서 말하는 소프트웨어 엔지니어는 현실의 아키텍터와 가깝다.

결론

 
여기까지 해서 개발자는 무엇이고,
개발자를 분류 해보고, 이에 대해 이야기했다. 

또한 위에서 언급했듯이
나의 의견이 '진리'가 아님을 다시 한번 강조하고 싶다.

따라서 혹시 논지들 중에서 논리적 모순이라던가,
잘못된 논리를 열심히 찾으려는 사람이 있을지는 모르겠지만,
그런것이 있더라도 나는 딱히 해줄말이 없다.

왜냐하면 내가 이 프로젝트를 진행하고,
진행하기 전에 이런 논의를 하는 이유는 

내 의견에 동의하게 하는 것이 아닌,
이런 논의를 통해 자신이 어떤 일을 하고 있는지,
그리고 어떤일을 하게 될지에 대해
스스로 납득하고 이해하길 원하기 때문이다.

어쨋든 내가보았던 주니어들 중 
이 프로젝트의 대상자인 비전공자 주니어들은
대부분 코더에 머물러 있다가 퇴사했다.

난 그들의 마음을 이해 한다.

왜냐하면, 
나도 그들과 똑같은 시절이 있었기 때문이다.

물론 나는 대학 시절이였고, 
그들은 사회에 들어와서 배웠기 때문에 
비교적 압박감이 다르겠지만
그 느낌이 어떤 느낌인지는 공감하고 있다.

프로그래밍 언어에 대한 난해함, 
몇 천줄의 코드들,
수 많은 기술들에서 나타나는 부정적인 감정들

그리고 결정적으로 같이 입사한 사람들 중에 

훌륭히 적응하는 사람들과
적응하지 못하는 자신과 비교했을 때 
나오는 열등감과 좌절,

그에 따른 자신감의 하락은 
'자아'를 공격하기 때문에 '자존감'에 상처를 입히게되
결국 업계를 떠날 수 밖에 없는 것이다.

늦던 빠르던 말이다.

하지만
나는 현재의 개발자라는 직업은 
지금 미래를 보장받고 있으며,

앨빈 토플러가 말한 
'지식 근로자'에 가장 가까운 직업이라 생각하고 있다.

왜냐하면, 앨빈 토플러는 멀지 않은 미래에
더 이상 한 회사에 종속되어져 있지 않으며,

자신의 자본을 돈이 아닌 지식으로 삼는 '지식 근로자'들이 
드러나며, 두각을 나타낼 것이라 말했기 때문이다.

이런 앨빈 토플러가 말한 '지식 근로자'에 
개발자들이 가장 가깝다고 생각하는 이유는 간단하다.

휼륭한 개발자들은 회사에 종속되어 있지 않으며,
몸 값이 굉장히 높다.

회사들은 그들의 지식을 
즉, 보유한 기술을 잠시 접속하기를 원한다.

훌륭한 개발자들은 자신이 보유한 기술을 
자본으로 소유하고 있다는 점,

그리고 더 이상 회사에 종속되어 있지 않는다는 점에서
나는 앨빈 토플러의 '지식 근로자'에 개발자가 가장 가깝다고 생각한다.

그렇기 때문에 
나는 이런 훌륭한 직업에 다양한 사람들이
일하길 원하며, 그들이 이런 일을 함으로써 
비교적 일상에서의 행복을 찾아낼 수 있었으면 한다.

개인이 사회를 바꾸는 것은 매우 힘든일이지만
그 주변을 바꾸는 것은 충분히 가능한 일이며,

각 개인이 이러한 임무를 완수하게 된다면
이런 것들이 모여 시너지 효과로 세계가 진보하게 될 것이며
세계의 진보는 다시 개인에게 긍정적인 영향을 줄 것임에는 틀림없기 때문이다.

이 블로그의 인기 게시물

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

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

[ Web ] 웹 애플리케이션 서버 아키텍처의 정의 및 유형 ( Define and Types of Web Application Server Architecture )