게으른 개발자의 끄적거림

SSO(Single Sign-On)이란? (feat. Java코드 예제)

끄적잉 2024. 6. 24. 22:23
반응형


### 싱글 사인 온 (SSO, Single Sign-On) 개요

**싱글 사인 온 (SSO)**는 하나의 로그인 자격 증명으로 여러 애플리케이션에 접근할 수 있도록 하는 사용자 인증 프로세스입니다. 즉, 사용자가 한 번 로그인하면 여러 시스템에 다시 로그인할 필요 없이 접근할 수 있습니다.

 

 


#### SSO 작동 원리

1. **사용자 인증**: 사용자가 서비스 제공자(SP, Service Provider) 애플리케이션에 접근하려고 하면, 인증 서비스(IDP, Identity Provider)로 리디렉션됩니다.
2. **IDP 로그인**: IDP는 사용자가 로그인했는지 확인합니다. 로그인이 되어 있지 않다면, 사용자는 IDP에 로그인해야 합니다.
3. **토큰 발급**: 사용자가 성공적으로 인증되면, IDP는 사용자를 식별할 수 있는 인증 토큰을 발급합니다.
4. **토큰 전달**: 이 토큰은 서비스 제공자에게 전달됩니다.
5. **SP 접근 허용**: 서비스 제공자는 토큰을 검증하고 사용자가 애플리케이션에 접근할 수 있도록 허용합니다.

 

 

반응형


### SSO의 장점

- **편리성**: 사용자는 여러 번 로그인할 필요가 없습니다.
- **보안 강화**: 중앙 집중식 인증으로 인해 보안 관리를 더 쉽게 할 수 있습니다.
- **관리 용이성**: IT 부서에서 사용자의 접근 권한을 중앙에서 관리할 수 있습니다.
- **생산성 향상**: 사용자는 로그인 문제에 대해 고민할 필요가 없어 업무 효율성이 높아집니다.

 


### Java로 구현하는 SSO 예제

SSO를 Java로 구현하기 위해서는 Spring Security와 OAuth2를 사용할 수 있습니다. 여기서는 Spring Boot와 OAuth2를 이용한 간단한 SSO 구현 예제를 소개하겠습니다.

 


#### 준비 사항

1. **Spring Boot 프로젝트 생성**
2. **필요한 의존성 추가**

먼저, Spring Boot 프로젝트를 생성하고, `pom.xml` 파일에 필요한 의존성을 추가합니다:

```xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
</dependencies>
```

 


#### 설정 파일 작성

`application.yml` 파일에 OAuth2 클라이언트 설정을 추가합니다:

```yaml
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_GOOGLE_CLIENT_ID
            client-secret: YOUR_GOOGLE_CLIENT_SECRET
            scope: profile, email
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
            user-name-attribute: sub
```

#### 보안 설정 클래스 작성

Spring Security 설정 클래스를 작성하여 OAuth2 로그인 기능을 활성화합니다:

```java
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .defaultSuccessURL("/home")
                .failureURL("/login?error=true");
    }
}
```

#### 컨트롤러 작성

인증 후 사용자가 접근할 수 있는 간단한 컨트롤러를 작성합니다:

```java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;

@Controller
public class HomeController {

    @GetMapping("/")
    @ResponseBody
    public String index() {
        return "로그인을 하세요 <a href='/oauth2/authorization/google'>구글로 로그인</a>";
    }

    @GetMapping("/home")
    @ResponseBody
    public String home(@AuthenticationPrincipal OidcUser principal) {
        return "환영합니다, " + principal.getFullName();
    }
}
```

 

 


이 예제는 사용자가 구글 계정을 통해 로그인할 수 있도록 하고, 로그인 후 사용자의 이름을 표시합니다.

 



#### 실행 및 테스트

프로젝트를 실행한 후 브라우저에서 `http://localhost:8080`에 접속하면, 구글로 로그인하는 링크가 표시됩니다. 링크를 클릭하면 구글 로그인 페이지로 리디렉션되며, 로그인 후 `/home` 페이지에서 사용자의 이름이 표시됩니다.

### 결론

SSO는 사용자 경험을 향상시키고 보안을 강화하는 중요한 인증 기술입니다. Spring Boot와 OAuth2를 사용하면 비교적 쉽게 SSO 기능을 구현할 수 있습니다. 위의 예제는 구글 OAuth2를 사용한 간단한 SSO 구현을 보여주었으며, 실제 환경에서는 더 많은 설정과 커스터마이징이 필요할 수 있습니다.

반응형