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

[ Ruby ] 30분만에 대충 살펴보는 Ruby의 기본 ②



난 Harsh를 모른다.
그렇기에 일단 코드를 복사 붙여넣어 결과물을 봤다.


정확히는 모르겠지만, 대충 
books라는 객체에 Hash를 추가하는 것 같다.

다음으로 넘어가자


튜토리얼에서는 이 블록({ })을 이야기하려고 했던것 같다.


Ruby는 메소드 뒤에 {} 을 붙여서 
추가적인 처리를 할 수 있는 것 같다.


이번에는 블록({})과 파이프 기호에 대해 설명하는 것 같다.

5.times의 결과물을 블록의 시작 부분에 파이프로 넘길 수 있다고 설명한다.

따라서 .times 메소드의 결과물은 
블록 내부의 time이라는 파이프에 넘기게 될 것이다.

이를 확인해보자.


예상대로 각 결과물이 화면에 표시되는 것을 알 수 있다.

다음으로 넘어가보자.


다음으로 괄호()에 관한 이야기 이다.

Ruby에서는 ()를 붙이건 붙이지 않건 올바르게 작동한다고 한다.

물론 개인적으로는 괄호를 명시해주는 것이 가독성이 좋다고 생각한다.


위에서 언급한대로 있건 없건 컴파일 에러는 나오지 않는것을 확인할 수 있다.

다음으로 넘어가자.


이번에는 메소드를 정의하는 방법에 대한 예제인것 같다.

위의 코드를 작동해보면


위와 같이 메소드의 이름이 출력되는데,
아무것도 정의되어 있지 않으면 메소드 이름을 출력하는 것 같다.

다음으로 넘어가자.


이번에는 메소드 내부를 채워서 결과물을 확인하는 것 같다.

실행해보자.


정의한 메소드의 숫자를 집어넣으면
위와 같이 숫자 만큼 puts이 실행되는 것을 확인할 수 있다.

다음으로 넘어가자.


다음은 실제 메소드를 실행하는 것인데 
나는 위에서 먼저 확인했었다.

다음으로 넘어가자.


다음은 메소드에 return을 넣어 반환값을 확인하는 것이다.

결과를 확인해보자.


결과는 함수 내부의 처리대로 3번 puts이 실행되고
마지막 코드의 puts에 의해 
tame(3)의 리턴 값이 표시되는 것을 확인할 수 있다.

다음으로 넘어가자.


이제 본격적인 메소드 제어에 관한 이야기를 시작하는 것 같다.

튜토리얼에서 셰익스피어의 책의 목록을 저장한
get_shakey라는 변수를 제공해주었다.


get_shakey를 실행하면 위와 같이 
셰익스피어의 책 목록들을 확인할 수 있다.

다음으로 넘어가자.


이 데이터는 JSON 형식으로 지정되어 있다고 한다.

이를 코드로 출력해보면


예제의 코드로 
s라는 변수에서 각 리턴 값들을 
key, val에 넣고 val값을 출력하는 것을 볼 수 있다.

다음으로 넘어가자.


위의 예제의 메소드는
특정 년도를 메소드의 매개변수로 집어넣을때
해당 년도에 셰익스피어가 작성한 희극의 수를 반환하는 메소드이다.

위를 실행해보면


해당 메소드에 1591를 넣으면 
각 타이틀이 puts에 의해 출력되고 
마지막에 .count메소드에 의해 길이가 출력되는 것을 알 수 있다.

다음으로 넘어가자.


다음은 2개의 년도를 입력하면 
그 사이에 있는 희극들을 출력해주는 메소드로 보인다.

get_shakey라는 JSON파일에서 
William Shakespeare라는 키 값을 찾아오고
받아온 Value 값을 .select{}에 넣어 검색하고
마지막으로 .each{} 메소드를 활용해 

파이프 라인에 변수를 넣어 해당하는 책의 타이틀과 년도를 출력하는 것으로 보인다.

실제 확인해보자.


위와 같이 타이틀 이름과 년도가 출력되는 것을 확인할 수 있다.

다음으로 넘어가자.


다음은 Ruby에 제어문에 관한 내용인 것 같다.


제어문은 다른 프로그래밍 언어들과 큰 차이는 없어보인다.

다음으로 넘어가자.


이번에는 비교 연산자인 equal에 관한 문제인 것 같다.

이 부분은 많은 프로그래밍 언어에서 '=='를 채택하고 있기 때문에 
Ruby도 ==가 아닐까 싶다.


=를 사용할 경우 a가 0인데도 불구하고
a가 100일 경우의 메시지가 출력되며, 옳지 않다는 메시지를 확인할 수 있다.

그럼 ==를 사용해보자.


위와 같이 올바르게 else의 루틴으로 들어가는 것을 확인할 수 있다.

다음으로 넘어가자.


이번에는 메소드 정의에 관한 내용인 것 같다.

위의 코드를 살펴보면 맨 상단에 끝에 ?가 달려있는 메소드를 볼 수 있는데
내가 알고 있는 다른 언어에서는 없는 특성이다.


if와 같은 문법을 활용할때 주의해야할 점은 
끝낼때 end를 꼭 붙어줘야 한다는 점이다.

또한 흥미로운 점은 마치 C언어의 매크로 처럼 
메소드를 제어한다는 점인데 조금 가독성은 떨어져 보인다.

이 블로그의 인기 게시물

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

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

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