[ 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장 : 프로그래밍 언어 ① - 왜 프로그래밍 언어는 어려울 수 밖에 없는가?



왜 개발 업무는 입문이 어려울까라는
생각이 문득 들었다.

나의 대학 시절만 떠올려도
3학년 즈음되었을 때 
그래도 생각했던 함수 정도는 만들 수 있었다.

다시 말해서 
1~2년 때 까지만해도 
제대로된 Class나 Function을 만드는데에도
힘겨웠다는 말이다.

대략 3년이 걸린 것이다.
물론 군대까지 포함한다면 5년이 되겠지만 말이다.

물론 이는 사람의 따라 편차는 크겠지만 
대부분 꽤나 많은 시간이 걸렸을 것이고,
대 다수의 사람들은 
이 1~2년 사이에 그만두는 경우가 많을 것 이다.

그렇다면 왜 개발 업무는 입문이 어려울까?

정확히는 왜 프로그래밍 언어를 배우는게 
이렇게 힘들 수 밖에 없을까?

다른 사람들에게는 
그냥 넘어가는 것들이겠지만

파해치는것을 좋아하는 나에게는
이런 것들은 매우 흥미로운 주제이다.

프로그래밍 언어란 무엇인가?


그렇다면 항상 하던대로
프로그래밍 언어가 무엇인가에 대해 
정의를 하고 넘어가야 한다.

물론 어떤 합의를 통해 도출된 정의는 아니며
내 개인적인 직감에 도출된 정의이다.

그렇다면 프로그래밍 언어는 
왜 생기게 되었는가에 대한 이야기 부터 출발해야 한다.

컴퓨터는 정확히는 이 세상의 모든 기계는 
0과 1로만 이루어진, 0과 1로만 대화할 수 있다.

0과 1만으로 AND, OR, XOR 등의 산술 기법을 통해
원하는 결과값을 얻어 내는 것이 기계의 본질적인 역할이다.


How to Understand Binary Code - Instructables

위와 같이 0과 1로만 이루어진 코드를 
이진 코드(binary code)라고 한다.

이 세상에 모든 하드 웨어와 
소프트 웨어를 끝까지 파고 들어가면
결국에는 이런 0과 1로만 이루어진 이진 코드로 나타날 것 이다.

하지만 이진 코드는 기계가 보기에는 매우 익숙할지는 모르겠지만
인간이 보기에는 매우 불편하다.

단순히 위의 사진을 해석하기도 매우 불편하고 힘들다.

그 다음에 제시된 것이 

Assembly language - Wikipedia

명령어로 이루어진 어셈블리어(Assembly Language)를 사용하는 것 이였다.

어셈블리어는 가장 기계에 최적화되어 있기 때문에 
대안으로서는 훌륭하다고 할 수 있지만, 

어셈블리어를 능숙하게 사용하기 위해서는 
실제 기계의 주소를 만져야 하며, 이는 고도의 사고력이 필요로 하기에
이 마저도 너무 어렵다.

그 다음으로 제시 된것이 익히 들어봤을 법한 

Solved: (1) Go To Http://ideone.com/ To Run The Following ... | Chegg.com

1954년 FORTRAN이라는 것이 제시되고
사실상 처음으로 프로그래밍 언어 다운 언어가 세상에 제시되었다.

위의 FORTRAN의 샘플 코드를 보면 
개발자들에게 있어서는 다소 익숙한 구문들이 보일 것이다.

인간이 이해하기 쉬운 
고수준의 프로그래밍 언어(high-level programming language)가 
세상에 모습을 들어내기 시작한 것이다.

물론 FORTRAN도 초기에는 버그와 개발 지연 등으로
반응이 썩 좋지는 않았지만
하드웨어의 발달로 어셈블리어로 프로그램을 작성하는 것 보다
효율성이 좋아지면서 널리 사용되어졌다.

그 다음으로 1959년 COBOL이라는 언어가 등장하고
1972년에는 드디어 우리에게 익숙한 C언어가 제시된다.

그렇다면 이러한 사실로서 
이제는 왜 프로그래밍 언어가 필요했을까에 
대한 추론을 할 수 있을 것 이다.

기계어는 인간이 이해하기 힘들기 때문이다.
그에 대한 솔루션으로 제안된 것이 어셈블리어였고

어셈블리어 또한 이해하기 힘들었기 때문에
고수준의 프로그래밍 언어(High-level Programming Language)가 
세상에 제시된 것이다.

그렇다면 여기에서 더 나아가 
프로그래밍 언어에 대한 정의를 도출해 낼 수 있을 것이다.

크게는 기계와 대화하기 위한 언어,
그리고 작게는 기계를 원하는대로 움직이게 하기 위한 언어라고 말이다.

프로그래밍 언어는 왜 어려운가


프로그래밍 언어의 입문이 어려운 이유는 매우 간단하다.

영어권 사람들과 대화하기 위해 영어가 필요하듯이
기계와 대화하기 위해서는 프로그래밍 언어가 필요하기 때문이다.

따라서 영어가 어렵듯이
당연히 프로그래밍 언어는 어려울 수 밖에 없다.

어떤 사람은 프로그래밍 언어가 
사람들이 사용하는 언어와 유사해 보이기 때문에
'프로그래밍 언어'라고 이해하고 있을 지는 모르겠지만

프로그래밍 언어는 
영어, 일본어, 중국어와 같은 언어라고 
취급해도 무방하다고 생각한다.

단순히 문법이 존재하는 등의 
인간의 언어와 유사하기 때문이 아니라
본질적인 인간이 사용하는 언어와 목적이 같기 때문이다.

내가 다양한 언어를 배우면서 느끼는 것은
언어를 언어로 받아들이지 않으면 힘들다는 것이다.

어떤 사람은 이게 무슨 개소리냐라며 
벙찐 얼굴로 나에게 무언의 압박을 줄지는 모르겠다.

외국어를 하나라도 익힌 경험이 있는 사람이라면
충분히 이해할 수 있을 것이라 생각한다.

외국어를 외국어로 받아들이지 않는 사람들이 
외국어를 이용할 때 알고리즘은 방식은 다음과 같다.

1. 외국어를 듣는다.
2. 외국어를 모국어로 변환해 이해 한다.
3. 대답할 말을 모국어로 생각한다.
4. 생각한 모국어를 번역해 외국어로 바꾼다.
5. 번역한 외국어를 말한다.

이런 번역 알고리즘에서는 
외국어는 당연히 어려울 수 밖에 없다.

왜냐하면 문화적으로, 뉘앙스적으로 
외국어를 모국어로 정확히 동일하게 번역하기가 쉽지 않기 때문이다.

심지어 외국어를 모국어로 번역할 단어 자체가 
마땅치 않을 경우도 매우 흔하게 있다.

이처럼
외국어가 어려운 이유는 
외국어를 언어로 받아들이고 있지 않기 때문이다.

외국어를 언어로서 받아들이고 있을 때의 
알고리즘은 매우 간단하다.

1. 언어를 듣는다
2. 언어를 말한다

이것이 끝이다.

따라서 프로그래밍 언어가 어렵게 느껴지는 것은
프로그래밍 언어를 언어로서 받아들이지 못하고
계속해서 사람의 언어로 번역하려고 하기 때문이다.

다시 말해 언어를 언어로서 
느끼고 있지 못하기 때문에
번역하는데에 시간이 걸림과 동시에 

문화적인 표현이 들어가 있는 언어를 사용해야할 경우
마땅히 대체할 단어가 없기 때문에 번역할 때에 어려움을 느낀다.

언어에 관습과 같은 문화가 녹아들어가져 있는
즉, 밈(meme)이 녹아들어가져 있는 단어의 경우
번역하기 매우 난해하기 때문에 
이런 것들이 외국어를 어렵게 느끼게 한다.

동일하게 프로그래밍 언어에도 
이런 밈(meme)들이 녹아 들어가져 있다.

객체지향, 절차지향과 같은 패러다임들이 그런 것들이다.

언어에서 밈이 녹아들어가져 있는 단어를 설명하기 위해
왜 이런 단어가 나왔는지 부터 시작해야 
그때서야 그 단어를 이해할 수 있듯이 

프로그래밍 언어에서도
이러한 밈이 녹아져있는 언어들도
왜 그런 패러다임이 생겼는지 부터 시작해야
그때서야 프로그래밍 언어를 
프로그래밍 언어로서 정확히 이해할 수 있으며,

외국에서 살면서 끊임없이 외국 사람들과 
외국어로 대화하면서 외국어를 익히듯이

프로그래밍 언어를 사용하면서 컴퓨터와
프로그래밍 언어로 대화하면서 프로그래밍 언어를 익혀야만

프로그래밍 언어를 프로그래밍 언어로서 
받아들일 수 있을 것이다.

또한 어느 나라건 개발 업무는 
천재들만 하는 것이라는 
인식도 벽을 만드는 것에 한 몫을 한다고 생각한다.

이 세상에서 외국어 할 줄 안다고
천재라고 이야기 하지 않듯이

프로그래밍 언어를 할 줄 안다고
천재라고 이야기 할 수는 없다.

외국어를 할줄 아는 사람들이 
천재라고 이야기는 할 수 있겠지만,
이는 천재라는 가치를 너무 낮추는 행위이다.

따라서 언어를 할 수 없느냐 할 수 있느냐는 
대개 어떤 사람이 머리가 좋기 때문에, 
천부적인 재능을 지니기 때문이 아니라

익숙하냐 익숙하지 않느냐에 차이가 있을 뿐
대게 그 외에는 어떠한 것도 없다.
(물론 매우 안타깝게도 어떤 특별함을 가지고 있는 
예외인 사람이 간혹 있다.)

또한 언어에 능숙하던 그렇지 않던
상대방에게 어느 정도 의미 전달이 된다면 
그것만으로 언어는 언어의 역할을 다 한 것이다.

여기에 더 나아가 
외국어를 능숙하게 다루기 위해서
외국에서 생활하면서 익히듯이

프로그래밍 언어를 능숙하게 다루기 위해서는
코드의 세계에서 생활하면서 익히는 것이 
시간적으로 생각한다면 가장 효율이 좋다.

그렇다면 프로그래밍 언어에 익숙하게 하기 위해서는 어떻게 해야 하는가


그럼 어떻게 해야될까라는 
의문이 당연히 떠오를 것이다.

그리고 개발자가 되고 싶어하는 사람들에게
가장 큰 고민일 것 이다.

이런 의문에 대한 해답은
다시 언어에서 찾아야만 한다.

다시 일반적인 언어로 돌아와서
일반적으로 언어를 배우는 방법은 
크게 두 가지가 있다고 생각 한다.

1.자국에서 배우는 방법
2.모국에서 배우는 방법

흔히 1번을 많이 선택 한다.
접근성이 뛰어나기 때문이다.

수많은 책과 학원에서 
마치 이 책만 보면,
자신들의 학원을 다니기만 한다면
손쉽게 외국어를 배울 수 있을 것 같이 말하지만 
실상은 그렇지 않다. 

책과 학원은 대부분 문법을 비롯한 
읽고 쓰기에 대한 것을 주로 알려주기 때문이다.

정확히는 현대 교육 방식이 이런 교육 방식에 
크게 벗어나지 못한다고 말하는 것이 옳을지도 모른다.

물론 회화 학원이라는 것이 존재하지만,
생활 방식이 자국어인 이상
일정 수준이 된다면 대개 벽을 느끼게 될 것이다.

그러한 벽을 느끼고 있을때
다시말해 지지부진함을 느끼고 있을때
자국에서 한다면 몇년이 걸릴지 알 수 없지만,
심지어 벽을 깨부술수 있을 지 알 수 없지만

모국에서 살기만 한다면
그 벽을 비교적 단숨에 부술 수 있다.

모국에서는 언어를 언어로서 사용하기 때문이다.

다만 한 가지 생각해야 하는 것이 있는데,
외국어든 프로그래밍 언어이던 
'기본'에 대해 익히고 그러한 세계에 들어간다면

좀 더 빠르게 익숙해 질 수 있으며, 적응하기 편하다는 것 이다.

따라서 시간에 따른 효율성에 있어서는 
2번을 따라올 수 없다.

왜냐하면 흔히 
언어를 배우기를 원하는 사람들은
회화를 잘하기를 원하지 
읽고 쓰기를 잘하기를 원하지 않는다.

아무리 읽고 쓰기를 잘한다고 한들
커뮤니케이션이 되지 않는다면 소용 없다.

물론 노트에 적어가면서 한다면
할 수는 있을 것이다.

하지만, 누가 번거롭게 
매번 대화할 때 마다 노트에 적어가며
대화하고 싶어 한단 말인가?

반대로 회화를 어느정도 한다면
읽고 쓰기는 못해도 상관없다.

왜냐하면 
IT가 전세계적으로 발달해 있는 시점에서
일의 대부분은 컴퓨터로 작업하며,

컴퓨터로 작업한다면 
문자 모형만 알고 있다면
쓰는 방법은 몰라도 된다.

심지어 번역 기술이 발달됨에 따라 
사전과 번역 애플리케이션을 활용한다면
완벽하지는 않지만 
이해할 수준의 쓰기 능력을 보여줄 수 있다.

최근에 들어서는 이미지 번역 기술까지 좋아지면서
카메라로 가져다 대기만 하면 번역까지 해준다.

이러한 논지로 
프로그래밍 언어에 대입하면 방법은 2가지이다.

1.독학 및 학원에서 배우는 방법
2.실무에서 배우는 방법

가장 효율적인 방법은 
위에서 언어를 배울때와 마찬가지로 2번이다.

외국어 학원들이 늘 그렇듯이
프로그래밍을 배우는 책과 학원도 
자신들의 책을 읽고, 학원에 다닌다면 
훌륭한 개발자가 될 것처럼 이야기하지만
현실은 그렇지 않다.

흔히 프로그래밍을 알려준다고 하는 곳에 가보면
대개 이론이나 문법에 관한 것들 밖에 얻을 수 없을 것이다.

이는 위에서 언급한 일반적인 외국어를 
알려주는 학원들과 크게 다르지 않다. 
 
IT업계의 실무는 대개 추상화 되어져있다.
쉽게 말하면 정확한 메뉴얼이 거의 없다는 것 이다.

프로그래밍 방법, 툴을 다루는 법, 커뮤니케이션,
설계, 기술 등등 
심지어 문서화 되어있는 것들도 한 번에 이해하기 힘들다.

그렇기 때문에 대개 개발자들은 
이런 것에 대해 각자 추상화 되어 있는 직감을 가지고 있다.

그런 직감들을 어떻게 명확하게 알려준단 말인가?

특별한 이유가 없는 이상
이는 매우 귀찮고 번거로운 일이다.

하물며 IT세계의 패러다임은 
계속해서 빠르게 바뀌어져 가는데

그런것을 명확하게 할 수 있다고 한들
모두가 빠르게 이해할 수 있도록 
메뉴얼을 구성한다는 것은 시간적으로 불가능하다.

그렇기 때문에 
흔히 말하는 IT학원에서 실무는 알려줄 수 없다.

또한 설사 그런 사람이 있다고 한들
그런 사람들은 현장에서 일하고 있지
학원 선생으로서 일하고 있지는 않는다.

학원에서 배우는 것들은 사실 
구글링을 통해 충분히 얻을 수 있는 것들이다.

하지만
2번으로 가면 비교적 빠르게 
프로그래밍 언어를 언어로서 이해할 수 있게 된다.

외국에서 일하면서 혹은 생활하면서
외국어만을 사용해야 되면서
외국어에 익숙해지는 것 처럼

프로그래밍 언어도 일로서 
프로그래밍 언어만 사용하기 때문에
프로그래밍 언어에 익숙해 질 수 밖에 없다.



결론


프로그래밍 언어는 언어이기 때문에 
쉽게 말해서 기계와 대화하기 위한 언어이기 때문에
당연히 입문이 어려울 수 밖에 없다.

모든 외국어를 배울 때와 마찬가지로
프로그래밍 언어 또한 
그와 같은 언어이기 때문에 입문이 가장 어렵다.

하지만,
외국에서 삶이 쉽지만은 않은듯이
개발자로서 삶도 쉽지만은 않다.

왜냐하면 한마디로 힘들기 때문이다.

외국에서는 언어 뿐만아니라 
외국만의 음식을 포함한 문화에도 익숙해져야하며
그에 따른 관습 또한 익혀야만 하며

개발자도 프로그래밍 언어 뿐만아니라
계속해서 공부해야만 하는 것을 포함한 
개발 업무에 필요한 관습을 익히지 못한다면

결국 외국에서 일하러 나갔던 사람들이
빠르게는 1년 보통 2~년 내에 
대개 모국으로 돌아오는것 처럼

대개 개발자도 1~3년 내에 
개발직을 그만두게 된다.

언어가,
프로그래밍 언어가 어렵게 느껴진다면 
그건 지극히 정상이다.

자신을 탓할 문제는 아니라고 생각 한다.

외국어를 배울 때 능숙하지 않더라도
그 누구도 뭐라고 하지 않는다.

왜냐하면 너무 나도 당연하기 때문이다.

물론 매우 안타깝게도
항상 예외의 사람은 존재하기 때문에
그런 사람을 보며 자신을 탓할지는 모르겠지만

그런 사람들에게는 박수를 쳐주고 
위로 올라가라고 손짓하면 된다.

하지만 가끔 자신의 능력을 과시하거나 
남을 깔보기 위해서 그런 것도 못하냐며 
어깨를 으쓱하는 사람들이 있을 것 이다.

그런 사람들은 무시하는 것이 편하다.

왜나하면 내 짧은 인생 속에서 
그런 사람들은 대개 속이 텅 빈 사람들이였기 때문이다.

또한 나와 내 친구가 항상 이야기 하는 것이 있는데
'진짜들은 아무말도 하지 않는다'는 농담과도 같은 격언이다.

그런 사람들이 그러한 말을 하는 이유는
자신의 우월함 느끼고 싶어하는 
저열한 느낌을 받고 싶어하기 때문이다.

과거 선조들과 현대인들은 근본적으로 다르지 않으며
이는 역사가 증명하고 있는데
하물며 현대인들과 현대인들 사이에 
어떠한 우월함이 존재할 수 있겠는가?

그러한 관점에서 본다면
비교하는 것 자체가 웃긴 일이며
자신의 우월함을 남에게 과시하는 행위는 
저열하고 비열한 행위임에는 틀림이 없다.

하지만 그럼에도 불구하고
그런 생각에 벗어나지 못하거나
계속해서 어렵게 느껴진다면

과감히 포기하는 것이 좋을지도 모른다.

왜냐하면 각자 잘 할 수 있는 것과 
잘 할 수 없는 것이 다르기 때문이다.

큰 이유가 없다면 굳이 
자신의 필드 밖에서 싸울 필요는 없다.

자신의 일을 일로서 못 느끼고
일이 괴롭게 느껴지면
인생 전반적으로 불행해 질 수 밖에 없기 때문이다.

자신의 인생이 불행해 지기를 
그 누구도 바라지는 않을 것 이다.

그렇게 된다면
우리는 정작 우리가 해야할 
정말 중요한 일들을 하지 못하게되면서
수 많은 기회들을 놓치게 될 것이다.




이 블로그의 인기 게시물

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

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

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