본문 바로가기
INFORMATION SECURITY · FREE LEARNING정보보안 학습센터원리 → MASTER → 문제·복습 → MUST KNOW

한 번의 인증을 여러 서비스에 연결한다

정보보안의 원리 · 방향 4

© K-BOOKS · 무료 웹 열람용 콘텐츠입니다. 무단 복제·저장·인쇄·재배포를 제한합니다.

열한 번째 발걸음한 번의 인증을 여러 서비스에 연결한다

회사의 메일과 문서함, 업무 시스템에 접속할 때마다 같은 비밀번호를 다시 입력하면 사용자는 불편하고 비밀번호를 처리하는 곳도 늘어납니다. SSO, 통합 로그인은 한 번의 인증 결과를 여러 서비스 이용에 연결하는 구조입니다. 핵심은 비밀번호를 모든 서버에 복사하는 것이 아니라, 어떤 인증기관의 증거를 어떤 서비스가 어떤 조건에서 받아들일지를 정하는 것입니다. 인증기관 장애나 탈취가 여러 서비스에 영향을 줄 수 있으므로 편리함과 함께 집중된 신뢰의 범위를 다룹니다.

Kerberos의 표는 누가 열 수 있는가

Kerberos는 중앙 KDC와 티켓을 이용하는 대표적인 네트워크 인증 프로토콜입니다. KDC에는 초기 인증을 담당하는 AS와 서비스 티켓을 발급하는 TGS라는 논리적 역할이 있습니다. 사용자와 각 서비스는 KDC가 알고 있는 장기 키를 가집니다. 사용자는 로그인 후 TGT를 얻고, 이것을 제시해 개별 서비스용 티켓을 받습니다. TGT는 여러 서버에 직접 들어가는 만능 입장권이 아니라 TGS에 서비스 티켓을 요청하기 위한 표입니다.

함께 따라가기 · 문서 서버에 비밀번호를 보내지 않고 접속하기

교육용 조직 LAB.EXAMPLE에서 사용자 hana가 docs 서비스에 접속합니다. 설명은 Kerberos V5의 전형적인 사전 인증 흐름입니다.

  1. hana의 클라이언트는 AS에 초기 인증을 요청하고, 설정된 사전 인증 방식으로 계정의 비밀을 제어한다는 증거를 제시합니다. 비밀번호 기반 방식에서는 키를 얻는 데 비밀번호가 사용될 수 있지만 문서 서버에 비밀번호를 전달하지 않습니다.

  2. AS는 TGT와 클라이언트–TGS 세션 키를 제공합니다. TGT의 필요한 내용은 TGS가 열 수 있는 키로 보호되고, 클라이언트가 사용할 세션 키는 클라이언트가 안전하게 얻을 수 있도록 따로 보호됩니다. 사용자가 TGT 자체를 열어야 하는 것은 아닙니다.

  3. 클라이언트는 TGT와 세션 키로 만든 새로운 authenticator를 TGS에 보내 docs용 티켓을 요청합니다. TGS는 티켓과 이번 요청 증거를 확인한 뒤, docs의 장기 키로 보호된 서비스 티켓과 클라이언트–docs 세션 키를 돌려줍니다.

  4. 클라이언트는 서비스 티켓과 새 authenticator를 docs에 제시합니다. docs는 자기 장기 키로 티켓을 열어 세션 키를 얻고 이번 요청의 증거를 검증합니다. 요구된 상호 인증에서는 서버도 대응하는 응답을 보냅니다.

  5. 시간 제한과 재전송 캐시는 과거 티켓·요청의 무분별한 반복 사용을 억제합니다. 기기 시간의 큰 오차는 정상 인증도 실패하게 할 수 있습니다. 티켓이 유효해도 특정 문서를 읽을 권한이 있는지는 docs의 인가 규칙이 판정합니다.

깨달음같은 비밀을 모든 서비스에 입력하는 대신 용도와 수명이 제한된 티켓과 세션 키가 이동합니다. KDC와 서비스 장기 키의 보호가 전체 신뢰를 지탱합니다.

웹에서는 인증 결과를 누가 전달하는가

웹 연합 인증에서는 신원 제공자 IdP가 인증을 수행하고 서비스가 그 결과를 받아들입니다. SAML은 서명된 assertion으로 주체와 인증·속성 등에 관한 진술을 전달할 수 있습니다. 서비스는 서명뿐 아니라 발급자, 수신 대상, audience, 유효 조건과 요청의 연결을 검증합니다. 정상 서명된 assertion도 다른 서비스용이거나 이미 처리된 응답이면 그대로 로그인 증거로 사용해서는 안 됩니다. 브라우저를 거쳐 전달되는 값이므로 검증을 생략한 화면 이동 자체를 인증 성공으로 취급하지 않습니다.

OAuth 2.0은 애플리케이션이 자원에 접근할 권한을 위임받는 틀입니다. 사용자가 사진 편집 앱에 특정 사진 읽기 권한을 주는 상황처럼, 앱이 사용자의 비밀번호를 갖지 않고 범위가 제한된 토큰을 받게 합니다. 이것만으로 표준화된 사용자 로그인 결과가 완성되는 것은 아닙니다. OpenID Connect, OIDC는 OAuth 2.0 위에 사용자 인증 정보를 전달하는 층을 더하고 ID 토큰을 정의합니다. API 접근용 access token과 클라이언트가 인증 결과를 확인하는 ID token의 수신자와 용도를 섞지 않습니다.

함께 따라가기 · 인증 코드 하나가 로그인으로 바뀌는 과정

가상의 메모 앱이 OIDC의 Authorization Code 흐름과 PKCE를 사용합니다.

  1. 앱은 이번 시도의 상태값과 예측하기 어려운 비밀 검증값인 code_verifier를 만듭니다. 검증값은 보관하고, 이를 SHA-256 기반의 S256 방식으로 변환한 code_challenge를 인증 요청에 담습니다. 등록된 redirect URI와 필요한 scope, 변환 방식 S256도 함께 보냅니다. OIDC 요청에 nonce를 사용했다면 이후 ID 토큰에서도 같은 값을 확인합니다.

  2. 인증기관이 사용자를 인증하고 필요한 동의를 얻으면 짧게 유효한 인증 코드를 정해진 callback으로 보냅니다. 앱은 요청과 응답의 연결을 확인하고, 받은 코드와 보관한 code_verifier로 토큰을 요청합니다. 인증기관은 이 값을 같은 S256 방식으로 변환해 해당 코드에 연결된 code_challenge와 대조합니다. 일치해야 교환을 계속하므로, 코드를 가로챈 것만으로는 비밀 검증값을 모르는 주체가 토큰을 받을 수 없습니다.

  3. 앱은 ID 토큰의 서명, issuer, 자신을 가리키는 audience, 유효 시각과 적용되는 nonce 조건을 검증합니다. 주체 sub는 발급자와 함께 계정에 연결합니다. 이메일 표시 문자열만 전역적으로 같은 사용자라고 가정하지 않습니다.

  4. API는 access token의 수신 대상과 권한 범위를 확인합니다. 토큰 형식이 JWT일 수도 있지만 OAuth가 모든 access token을 JWT로 요구하는 것은 아닙니다. 토큰을 해독해 읽었다는 사실은 서명·정책 검증을 마쳤다는 뜻이 아닙니다.

깨달음SSO는 증거를 다른 서비스가 신뢰할 수 있게 전달하는 설계입니다. 어떤 토큰을 누구에게 보여 주는지까지 이해해야 실제 로그인이 완성됩니다.

참고 [151] · [152] · [153] · [154]

이 브라우저에 학습 기록을 저장합니다.

CONTINUE LEARNING

지금 공부한 흐름을 책으로 이어가세요

무료 학습은 그대로, 종이책은 필요한 분을 위한 선택지입니다.

정보보안 MUST KNOW전체 도서 12권