### 싱글 사인 온 (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 구현을 보여주었으며, 실제 환경에서는 더 많은 설정과 커스터마이징이 필요할 수 있습니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
토큰 넣는 방법 (Header vs 쿠키) (0) | 2024.06.26 |
---|---|
HTTP 헤더란? (header 구조, 구성 요소) (0) | 2024.06.25 |
HTTP란? (구조, 동작 방식, 요청 메서드 등) (0) | 2024.06.20 |
소켓(SOCKET)통신 이란? (0) | 2024.06.19 |
Dispatcher Servlet(디스패처 서블릿) 완벽 정복 (0) | 2024.06.18 |