OAuth 2.0을 공부하다보니 현대의 웹 애플리케이션 환경에서 다양한 서비스 간의 사용자 인증을 통합하고 사용자 경험을 단순화하기 위한 방식으로 Single Sign-On (SSO)이 많이 사용된다라는것을 알게되었다. SSO는 여러 서비스 제공자(Service Provider, SP)에 대해 한 번의 인증으로 접근할 수 있도록 하는 기술이다. SSO의 구현에서 중요한 역할을 하는 것은 JWT (JSON Web Token)와 PKI (Public Key Infrastructure)라고 생각한다. JWT와 PKI를 사용하여 SSO 시스템을 구성하는 방법을 설명하고, 각 요소의 역할과 동작 방식을 알아보려한다 !!
JWT (JSON Web Token) 이해
- JWT (JSON Web Token)는 클레임 기반의 보안 정보를 안전하게 전송하기 위한 JSON 객체를 사용하는 인코딩된 문자열이다. JWT는 보통 다음 세 가지 파트로 이루어져있다.
JWT 구조
- Header (헤더): JWT의 타입과 서명 알고리즘 정보를 포함
- Payload (페이로드): 사용자 정보(클레임)가 들어 있으며, 이 정보는 SP에서 사용자 접근을 결정하는 데 활용
- Signature (서명): 헤더와 페이로드를 특정 비밀 키로 해시한 값
각 파트는 Base64Url 인코딩 방식으로 인코딩되며, . 문자로 구분된다.
<Header>.<Payload>.<Signature>
JWT의 장점
- 간단한 구조로 클라이언트-서버 간 데이터 전송에 사용하기 쉽다.
- 서명을 통해 무결성을 보장하며, 서명을 검증하여 토큰이 변조되지 않았음을 확인할 수 있다.
- 확장성이 좋아서 다양한 시스템과의 통합이 용이하다.
JWT 클레임
JWT의 클레임에는 다음과 같은 정보가 포함될 수 있다.
- 등록된 클레임 (Registered Claims):
iss (발급자), sub (주체), exp (만료 시간) 등 표준화된 클레임이다.
- 공개 클레임 (Public Claims):
userId, role과 같이 애플리케이션에서 사용하는 사용자 정의 클레임이다.
- 비공개 클레임 (Private Claims): SP와 IDP 간의 특별한 계약에 따라 사용되는 클레임이다.
PKI와 비대칭 키 서명
PKI는 공개 키 암호 방식을 활용해 데이터의 무결성과 인증을 보장하는 시스템이다. 이걸 SSO에 적용시켜본다면 ?! SSO에서 PKI는 IDP가 JWT를 서명하고, SP가 이를 검증하는 역할을 한다.
비대칭 키 개념
- 공개 키 (Public Key): 누구에게나 공개할 수 있는 키로, 주로 서명 검증에 사용
- 개인 키 (Private Key): 오직 소유자만이 가지고 있는 비밀 키로, 주로 서명 생성에 사용
IDP는 개인 키로 JWT에 서명하며, SP는 공개 키를 사용하여 JWT가 변조되지 않았음을 검증한다.
토큰 발급자만이 가질수있는 개인키로 서명함으로써 신뢰관계를 형성 할 수 있는 것이다 !
JWKS (JSON Web Key Set)
- JWKS는 공개 키를 JSON 형태로 제공하는 일종의 키 저장소
- SP는 IDP의 JWKS 엔드포인트에서 공개 키를 가져와 JWT 서명을 검증
- JWKS는 여러 키를 포함할 수 있으며, 각 키는 kid (Key ID)를 통해 식별
자 이제 SSO를 좀 더 이해하기위한 기본 개념을 다루었으니 이어서 SSO의 기본을 다뤄보겠다 !!
SSO (Single Sign-On)의 이해
- Single Sign-On (SSO)는 사용자가 한 번의 로그인으로 여러 독립된 애플리케이션 또는 시스템에 접근할 수 있도록 해주는 인증 방식이다. SSO는 사용자의 편의성을 극대화하고, 각 서비스에서 별도의 로그인 절차를 거치는 불편함을 없애준다.
SSO의 필요성
- 사용자 경험 향상: 한 번의 로그인으로 여러 서비스에 접근 가능하게 하여 사용자가 반복적인 로그인을 할 필요가 없도록 한다.
- 중앙 집중식 관리: IDP를 통해 인증 정보가 중앙에서 관리되므로 보안성과 효율성이 향상된다.
- 애초에 인증하는 길이 하나인 셈이니 길이 여러개일때보다 위험이 적을것이다 !
SSO의 구성 요소
- IDP (Identity Provider): 사용자 인증을 담당하며, Access, ID, Refresh 토큰을 발급한다.
- SP (Service Provider): IDP가 발급한 토큰을 검증하고 사용자가 접근하려는 서비스에 대해 권한을 부여한다.
JWT 기반 SSO 아키텍처 설계
SSO 시스템은 크게 IDP와 SP로 나뉘며, 이들이 협력하여 사용자 인증 및 권한 부여를 수행한다. 이때 JWT는 사용자에 대한 인증 정보를 안전하게 SP로 전달하는 매개체 역할을 한다.
주요 아키텍처
- IDP: 사용자를 인증하고 JWT를 발급한다. 각 JWT에는 서명이 포함되어 있어 무결성을 보장한다.
- SP: 클라이언트로부터 JWT를 수신한 후, 이를 검증하여 사용자의 인증 여부와 접근 권한을 확인한다.
- JWT와 JWKS: SP는 JWT에 포함된 kid 값을 사용해 IDP의 JWKS 엔드포인트에서 적절한 공개 키를 가져와 서명을 검증한다.
IDP와 SP의 역할
IDP (Identity Provider)의 역할
- 사용자 로그인 페이지 제공
- 사용자 자격 증명 확인
- 성공적인 인증 후 Access 토큰, ID 토큰, Refresh 토큰을 생성
- JWKS 엔드포인트를 통해 공개 키를 제공하여 SP들이 서명을 검증할 수 있도록 함
SP (Service Provider)의 역할
- IDP로부터 발급받은 JWT를 검증하여 사용자가 인증되었음을 확인
- Access 토큰을 통해 사용자가 요청한 리소스에 대한 권한을 결정
- JWKS를 사용하여 서명 검증을 통해 JWT의 무결성을 확인
이와 같은 내용으로 JWT와 PKI를 사용한 SSO 시스템의 개요와 기본 원리를 설명하였다. 다음 포스팅에서는 JWT 토큰의 종류와 목적, SSO 플로우에서의 토큰 발급 및 갱신 과정, IDP와 SP 간의 통신 및 인증 과정 등을 더 깊이 있게 다룰 예정이다 ! ! !