[java] Spring Security OAuth2를 이용한 소셜 로그인 구현

이번 글에서는 Spring Security와 OAuth2를 이용하여 소셜 로그인을 구현하는 방법에 대해 알아보겠습니다.

목차

  1. 소셜 로그인이란?
  2. OAuth2란?
  3. Spring Security OAuth2 설정하기
  4. 소셜 로그인 구현하기
  5. 토큰 기반 로그인 처리하기
  6. 참고 자료

소셜 로그인이란?

소셜 로그인은 사용자가 다른 웹 서비스의 계정으로 로그인할 수 있는 기능을 말합니다. 이를 통해 사용자는 별도의 계정을 생성하거나 로그인할 필요 없이 다른 웹 서비스에 접근할 수 있습니다. 대표적으로 Facebook, Google, Twitter 등이 소셜 로그인을 제공하는 서비스입니다.

OAuth2란?

OAuth2는 인증 및 권한 부여 프레임워크로, 소셜 로그인을 구현하는 데 사용됩니다. OAuth2는 클라이언트 애플리케이션이 소셜 로그인 프로바이더(Provider)에게 접근 권한을 얻기 위해 인증을 요청하고, 인가된 후에는 해당 접근 토큰(Access Token)을 사용하여 API에 접근할 수 있게 됩니다.

Spring Security OAuth2 설정하기

Spring Security OAuth2를 사용하기 위해 pom.xml에 필요한 의존성을 추가해야 합니다. 아래는 Maven을 사용하는 경우의 예시입니다.

<dependencies>
    <!-- Spring Security OAuth2 -->
    <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
        <version>2.4.1</version>
    </dependency>
</dependencies>

Spring Security OAuth2는 인증 서버를 위한 AuthorizationServerConfigurer와 리소스 서버를 위한 ResourceServerConfigurer를 설정해야 합니다. 인증 서버는 사용자의 인증 여부를 확인하고 액세스 토큰을 발급하는 역할을 담당하고, 리소스 서버는 실제로 소셜 로그인 프로바이더로부터 정보를 가져오기 위해 사용됩니다. 자세한 설정 방법은 Spring Security OAuth2 공식 문서를 참고하시기 바랍니다.

소셜 로그인 구현하기

소셜 로그인을 구현하기 위해서는 해당 소셜 로그인 프로바이더의 API를 사용해야 합니다. 대부분의 소셜 로그인은 OAuth2를 기반으로 하기 때문에, OAuth2의 인증 흐름을 따라야 합니다.

아래는 Facebook을 이용한 소셜 로그인 구현 예시입니다.

@Controller
public class SocialLoginController {

    @Autowired
    private FacebookConnectionFactory connectionFactory;

    @Autowired
    private OAuth2Parameters oAuth2Parameters;

    @RequestMapping(value = "/login/facebook", method = RequestMethod.GET)
    public String facebookLogin() {
        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
        String authorizeUrl = oauthOperations.buildAuthenticateUrl(GrantType.AUTHORIZATION_CODE, oAuth2Parameters);
        return "redirect:" + authorizeUrl;
    }

    @RequestMapping(value = "/login/facebook/callback", method = RequestMethod.GET)
    public String facebookLoginCallback(@RequestParam("code") String code, Model model) {
        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
        AccessGrant accessGrant = oauthOperations.exchangeForAccess(code, oAuth2Parameters.getRedirectUri(), null);
        Connection<Facebook> connection = connectionFactory.createConnection(accessGrant);
        Facebook facebook = connection.getApi();

        // 사용자 정보 가져오기
        String[] fields = {"id", "name", "email"};
        User userProfile = facebook.fetchObject("me", User.class, fields);
        
        // 로그인 처리 및 회원가입 처리 등 추가 작업
        // ...

        return "redirect:/home";
    }
}

위의 예시에서는 Facebook과 관련된 설정을 주입받아 소셜 로그인을 처리하는 컨트롤러를 작성하였습니다. /login/facebook 경로로 요청을 보내면 Facebook 인증 페이지로 리다이렉트되며, 사용자가 인증을 완료하면 /login/facebook/callback 경로로 리다이렉트됩니다. 이후 code 요청 파라미터를 이용하여 페이스북에서 액세스 토큰을 발급받아 사용자 정보를 가져올 수 있습니다.

토큰 기반 로그인 처리하기

OAuth2를 이용한 소셜 로그인은 액세스 토큰을 중심으로 동작합니다. 따라서 토큰을 이용하여 인증이 이루어지고, API 요청에 토큰을 함께 전송하여 사용자를 인증하게 됩니다. Spring Security OAuth2는 자동으로 토큰 기반 인증을 처리해주므로, 추가적인 설정은 필요하지 않습니다.

참고 자료