최근에 Beego Framework을 기반으로 여러 웹 응용 프로그램에 대해 SSO(Single-Sign-On)을 구현하는 프로젝트가 있습니다. 가장 많이 사용되는 SSO 프로젝트는 CAS이며 중앙에 CAS 서버가 있어야하며 각 웹 응용 프로그램을 시작하기 전에 CAS 클라이언트가 필요합니다. 불행히도, Beolo를 지원하는 go-cas/cas 및 adanteng/cas을 제외한 Golang에서 작성된 공식적인 CAS 고객은없는 것으로 보입니다.마이크로 서비스 앞에 SSO를 구현하는 방법이 있습니까?
하지만 CAS의 워크 플로는 약간 복잡합니다. 너무 많은 리디렉션, CAS, 웹 응용 프로그램 및 사용자 브라우저간에 너무 많은 티켓이 전송되었습니다. 사람들이 다음 그림과 같이, 오히려 앞보다, 모든 웹 응용 프로그램의 중심에 인증 서비스를 배포하는 이유는 알아낼 수 없습니다 :이 그림에서
, 모든 요청에 강제 성공적으로 인증되면 Authenticate Service에서 먼저 처리되고, 쿠키에 저장된 세션 ID를 생성하고 다른 마이크로 서비스가 공유하는 Redis를 생성합니다. 리디렉션이나 티켓이 전혀 없으며 전송 만 요청합니다.
이 다이어그램이 가능합니까? 아니면 무시한 중대한 문제입니까?
업데이트 0
세션 공유 방법은 참으로 Nadh 권고로 확장 가능한 모듈 형이 아닙니다. nginx-sso에있는 Heipei의 창작물과 같이 인증 서비스와 다운 스트림 서비스 간의 요청 헤더에 이름, 이메일 등의 사용자 정보를 전송하는 것은 어떻습니까? Building Microservices의 Sam Newman이 공유하는 SSO 게이트웨이로 작동하도록 할 수 있습니까?
업데이트 1
Heipei 샘 뉴먼에서 많은 오해가없는 것을 바라고, 조금 명확하게 내 유치 아이디어를 설명하기 위해, 다음과 같이 더 자세한 그림이 표시됩니다.
많은 수의 리디렉션과 핸드 셰이크를 처리하는 대신 모든 요청은 MySQL의 사용자 정보를 세션 공급자로 Redis에 기록하고 인증 헤더에서 다운 스트림 서비스로 전송하는 인증 서비스에서 먼저 처리됩니다. 요청이 성공적으로 인증되면
이렇게하면 위의 공유 -Redis 대신 HTTP 헤더를 통해 Nadh 경고가 전송되고 Redis는 auth 서비스로 삭제되거나 auth 인스턴스간에 만 공유 될 수 있습니다.
업데이트 2
은 쿠키 및 세션이 구식 기술자 것 같다. 쿠키의 교차 도메인 문제와 세션 공유 문제는 최신 웹 응용 프로그램의 확장 성과 유연성에 대한 주요 장벽입니다. 다행스럽게도 JSON Web Token은 서버 측에서 클라이언트 측으로 사용자 정보를 이동하여 필요한 경우에만 전송함으로써 요즘 여러 개의 경량 서비스를위한 최고의 단일 사인온 솔루션이되었습니다.
구조적으로 세션 쿠키를 얻기 위해 A와 B를 Redis 지속성에 종속시키지 않는 것이 좋습니다. '인증 서비스'만 Redis에 연결해야합니다. A와 B는 세션 정보를 얻기 위해 (HTTP API 또는 무언가를 통해) 인증 서비스와 대화해야합니다. – Nadh
@Nadh 답장을 보내 주셔서 감사합니다. 사용자 정보 세션을 공유하기 위해 모든 서비스에 대해 하나의 세션 만 있으며 각 세션은 "appname.sessionname"과 같은 접두어로 값을 키로 설정합니다. A와 B가 Auth Service와 통신하는 경우 CAS와 똑같이 작동합니다. CAS 패턴 만 유일한 선택입니까? 다른 솔루션이 있습니까? – Yang
CAS는 정의상 "중앙"입니다. 당신의 방법은 또한 단기간에 효과가 있지만, 모듈화 나 확장 성이별로 없습니다. A와 B가 다른 데이터 센터로 이동하면 어떻게 될까요? 인터넷을 통해 Redis 연결을 설정하는 것은 어려울 것입니다. 또한, 귀하가 만드는 모든 서비스에는 Redis 드라이버와 연결 장치가 있어야합니다. 다양한 종류의 구현에 대한 개요를 보려면 여기를 확인하십시오. - https://en.wikipedia.org/wiki/List_of_single_sign-on_implementations – Nadh