[Server] SSO(Single Sign-On) 로그인이란?

jiwon·2025년 3월 3일
post-thumbnail

📌 SSO란?

SSO(Single Sign-On, 단일 로그인)는 한 번의 로그인으로 여러 서비스나 시스템에 접근할 수 있도록 하는 인증 방식이다.
사용자는 한 번 로그인하면 추가 인증 없이 여러 애플리케이션을 사용할 수 있다.



📌 SSO의 장점

  1. 편의성 증가 : 사용자가 여러 개의 아이디와 비밀번호를 기억할 필요 없음
  2. 보안 강화 : 비밀번호 입력 횟수를 줄여 피싱 및 키로깅 위험 감소
  3. 관리 효율성 증가 : 중앙에서 사용자 계정 관리 가능


📌 SSO의 작동 원리

SSO는 주로 토큰 기반 인증을 사용하며, 대표적으로 SAML, OAuth, OpenID Connect 등의 프로토콜을 활용한다.


SSO 인증 흐름

  1. 사용자가 애플리케이션 A에 로그인 요청을 보냄
  2. 애플리케이션 A는 SSO서버로 로그인 요청을 전달
  3. SSO 서버에서 사용자 인증(ID/PW, MFA등)
  4. 인증이 성공하면 토큰(Access Token, SAML Assertion 등)을 생성하여 애플리케이션 A에 전달
  5. 사용자는 애플리케이션 A에 로그인됨
  6. 이후 애플리케이션 B를 방문하면 동일한 토큰을 사용하여 자동 로그인

SSO 구성 요소

  • Identity Provider(IdP) : 인증을 담당하는 서버 (ex - Google, Okta, Keycloak 등)
  • Service Provider(SP) : 사용자가 접근하는 서비스 (ex - Gmail, Slak, 내부 시스템 등)
  • 토큰(Token) : 로그인 인증 정보를 담은 값 (JWT, SAML, OAuth 토큰 등)


📌 SSO 구현 방법

SSO를 구현하는 방식은 여러 가지가 있지만, 일반적으로 OAuth2.0, OpenID Connect(OIDC), SAML 프로토콜을 사용한다.


1) OAuth2.0 + OpenID Connect(OIDC)

OAuth2.0은 사용자 인증 보다는 권한 부여에 초점을 둔 프로토콜이며, OpenID Connect(OIDC)는 OAuth2.0을 확장하여 인증 기능을 추가한 표준이다.

📑 OAuth2.0 인증 흐름

  1. 사용자가 클라이언트(웹사이트)에 로그인 요청
  2. 클라이언트는 OAuth2.0 Authorization Server(IdP)로 리다이렉션
  3. IdP에서 사용자 인증 후 Authorization Code 발급
  4. 클라이언트는 Authorization Code를 사용하여 Access Token 요청
  5. IdP에서 Access Token 및 ID Token 발급하여 클라이언트에 전달
  6. 클라이언트는 Access Token을 사용해 API 접근 가능

📑 OpenID Connect(OIDC)

  • OAuth2.0을 기반으로 사용자 정보(ID Token 포함)를 제공
  • 대표적인 구현 예시 : Google, Facebook 로그인
  • OIDC가 필요한 경우 : 사용자의 프로필 정보(ID, 이메일 등)가 필요한 경우


2) SAML (Security Assertion Markup Language)

SAML은 XMl기반의 SSO 프로토콜로 기업 환경에서 많이 사용된다.

📑 SAML 인증 흐름

  1. 사용자가 서비스 제공자(SP) 접근 시, IdP로 리다이렉션됨
  2. IdP에서 사용자 인증 후 SAML Assertion(XML 형식의 인증 정보) 생성
  3. SAML Assertion을 SP로 전달하여 인증 완료


📌 SSO 구현 예제

Spring Boot + OAuth2.0 클라이언트 설정

  1. Spring Boot 프로젝트에서 spring-boot-starter-oauth2-client 추가
<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
  1. application.yml 설정
spring:
  security:
    oauth2:
      client:
        registration:
          keycloak:
            client-id: my-client
            client-secret: my-secret
            scope: openid
            authorization-grant-type: authorization_code
            redirect-uri: "http://localhost:3000/login/oauth2/code/keycloak"
        provider:
          keycloak:
            issuer-uri: "http://localhost:8080/realms/my-realm"
  1. 로그인 컨트롤러 작성
@RestController
public class LoginController {
    @GetMapping("/user")
    public Map<String, Object> getUser(@AuthenticationPrincipal OAuth2User principal) {
        return Collections.singletonMap("name", principal.getAttribute("name"));
    }
}


💡 SSO는 사용자 경험을 개선하고 보안을 강화하는 핵심 기술로, 한 번의 인증으로 여러 애플리케이션의 사용자 로그인을 허용하는 통합 인증 솔루션이다.
OAuth2.0 + OpenId Connect(OIDC) 또는 SAML을 사용하여 SSO를 구현할 수 있다.
기업 환경에서는 SAML, 일반 웹 서비스에서는 OAuth2.0 + OIDC를 선택하는 것이 일반적이다.

profile
내가 보려고 올리는 개발 일지

0개의 댓글