스프링 부트를 활용한 OAuth 2.0 단일 로그인 구현

스프링 부트란 무엇인가?

Spring Boot

스프링 부트는 자바 개발자들이 빠르게 웹 어플리케이션을 개발할 수 있도록 도와주는 오픈소스 프레임워크입니다. 스프링 부트는 스프링 프레임워크의 일부인 스프링 프로젝트 내에서 개발되었으며, 수많은 개발자들이 사용하고 있습니다. 스프링 부트는 개발자가 설정을 최소화하고, 생산성을 향상시키기 위해 여러 기술을 내장하고 있습니다. 이러한 기술들은 스프링 프레임워크에서 사용하는 기술들과 호환성이 높습니다.

스프링 부트는 자바 개발자들이 웹 어플리케이션을 쉽게 개발할 수 있도록 여러 기능들을 제공합니다. 또한, 스프링 부트는 임베디드 서버(Tomcat, Jetty, Undertow)를 내장하고 있어, 서버 설정을 별도로 하지 않아도 됩니다. 이를 통해 개발자는 더욱 신속하게 웹 어플리케이션을 개발할 수 있습니다.

OAuth 2.0이란 무엇인가?

OAuth 2.0

OAuth 2.0은 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 어플리케이션에 접근 권한을 부여할 수 있도록 하는 인증 프레임워크입니다. OAuth 2.0은 인증(authentication)과 권한 부여(authorization)를 위한 프로토콜을 제공합니다. 이를 통해 사용자는 자신의 계정 정보를 제공하지 않고도 다른 어플리케이션에 접근할 수 있습니다.

OAuth 2.0의 핵심 개념은 "클라이언트", "리소스 오너", "인증 서버", "리소스 서버"입니다. 클라이언트는 인증을 받지 않은 어플리케이션을 의미하며, 리소스 오너는 권한을 부여하고자 하는 사용자를 의미합니다. 인증 서버는 사용자의 인증을 담당하며, 리소스 서버는 클라이언트가 접근하고자 하는 리소스를 보유하고 있는 서버를 의미합니다.

단일 로그인(Single Sign-On)이란 무엇인가?

Single Sign-On

단일 로그인(Single Sign-On)은 사용자가 여러 개의 어플리케이션에 로그인할 때, 한 번의 인증으로 모든 어플리케이션에 접근할 수 있도록 하는 기술입니다. 단일 로그인은 사용자가 여러 개의 계정 정보를 기억하지 않아도 되도록 해주며, 사용자의 생산성을 향상시킵니다.

단일 로그인은 여러 개의 어플리케이션이 동일한 인증 서버를 사용하는 경우에 구현할 수 있습니다. 이를 통해 사용자는 한 번의 인증으로 여러 개의 어플리케이션에 접근할 수 있습니다.

스프링 부트를 활용한 OAuth 2.0 단일 로그인 구현 방법

Spring Boot OAuth 2.0

스프링 부트를 활용하여 OAuth 2.0 단일 로그인을 구현하는 방법을 알아보겠습니다.

1. 의존성 추가

OAuth 2.0을 구현하기 위해서는 스프링 부트에서 제공하는 OAuth 2.0 관련 의존성을 추가해야 합니다. 다음과 같이 build.gradle 파일에 의존성을 추가합니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'
}

2. OAuth 2.0 인증 서버 설정

OAuth 2.0 인증 서버를 구현하기 위해서는 SecurityConfig 클래스를 생성해야 합니다. 다음과 같이 SecurityConfig 클래스를 생성합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login/**", "/error", "/webjars/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()
                .defaultSuccessURL("/home");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("password")
                .roles("USER");
    }
}

위의 코드에서는 /login/, /error, /webjars/ 경로에 대해서는 인증을 거치지 않도록 설정하고, 나머지 경로에 대해서는 인증을 거쳐야 하도록 설정했습니다. 또한, OAuth 2.0 로그인 성공 후에는 /home 경로로 이동하도록 설정했습니다.

3. 어플리케이션 설정

OAuth 2.0을 구현하기 위해서는 어플리케이션 설정 파일(application.yml 또는 application.properties)에 OAuth 2.0 설정 정보를 추가해야 합니다. 다음과 같이 application.yml 파일에 OAuth 2.0 설정 정보를 추가합니다.

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: 
            client-secret: 
            scope:
              - email
              - profile
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://www.googleapis.com/oauth2/v4/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
            jwk-set-uri: https://www.googleapis.com/oauth2/v3/certs
            user-name-attribute: sub

위의 코드에서는 Google OAuth 2.0을 사용하기 위한 설정 정보를 추가했습니다. client-id와 client-secret은 Google API Console에서 발급받을 수 있습니다.

4. 어플리케이션 코드 작성

OAuth 2.0 로그인을 위해서는 사용자가 로그인할 수 있는 페이지를 제공해야 합니다. 다음과 같이 로그인 페이지를 제공하는 컨트롤러를 작성합니다.

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }
}

위의 코드에서는 /login 경로에 대한 GET 요청을 처리하는 컨트롤러를 작성했습니다.

또한, 로그인 후에는 사용자 정보를 보여주는 페이지를 제공해야 합니다. 다음과 같이 사용자 정보를 보여주는 컨트롤러를 작성합니다.

@RestController
public class UserController {

    @GetMapping("/user")
    public Principal user(Principal principal) {
        return principal;
    }
}

위의 코드에서는 /user 경로에 대한 GET 요청을 처리하는 컨트롤러를 작성했습니다. Principal 객체를 반환하면, 해당 사용자의 정보를 확인할 수 있습니다.

5. 어플리케이션 실행

위의 코드를 작성한 후에는 어플리케이션을 실행해보아야 합니다. 다음과 같이 어플리케이션을 실행합니다.

$ ./gradlew bootRun

위의 명령어를 실행하면, 어플리케이션이 실행되며, 브라우저에서 http://localhost:8080/login 경로로 접속할 수 있습니다. 해당 페이지에서는 Google 계정으로 로그인할 수 있습니다.

결론

위의 방법을 통해 스프링 부트에서 OAuth 2.0 단일 로그인을 구현하는 방법을 알아보았습니다. 스프링 부트의 다양한 기술을 활용하면, 보다 쉽고 빠르게 웹 어플리케이션을 개발할 수 있습니다. 또한, OAuth 2.0을 사용하면, 사용자가 비밀번호를 제공하지 않고도 다른 어플리케이션에 접근할 수 있도록 할 수 있습니다.