스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, 쿠키 관리 클래스 구현하기

안녕하세요! 이번 글에서는 스프링 부트를 이용한 백엔드 개발에서 OAuth2를 활용한 로그인 및 로그아웃 구현 방법과 쿠키 관리 클래스의 구현에 대해 상세히 알아보겠습니다. 웹 애플리케이션에서 사용자 인증 및 세션 관리는 매우 중요한 요소입니다. 이 글에서는 이를 위한 다양한 개념과 기술 스택을 소개할 것입니다.

목차

  1. 1. OAuth2 개요
  2. 2. 스프링 부트 설정
  3. 3. OAuth2 로그인 기능 구현하기
  4. 4. 로그아웃 기능 구현하기
  5. 5. 쿠키 관리 클래스 구현하기
  6. 6. 결론

1. OAuth2 개요

OAuth2는 주로 API 인증 및 권한 부여에 사용되는 프로토콜입니다. 마치 타인의 정보를 안전하게 접근할 수 있는 중재자인 역할을 합니다. 이 프로토콜은 인증을 제3의 서비스 제공자에게 위임하고, 사용자 정보를 보호하는 데 도움을 줍니다.

예를 들어, 사용자가 Google 계정을 사용하여 다른 웹사이트에 로그인할 수 있게 할 때 OAuth2를 사용하는 방식입니다. 이 방식은 사용자에게 편리함을 제공할 뿐만 아니라, 개발자가 직접 비밀번호를 다루지 않아도 되는 장점이 있습니다.

1.1 OAuth2의 주요 용어

  • Resource Owner: 사용자, 즉 자원의 소유자.
  • Client: 사용자 정보를 요청하는 애플리케이션.
  • Authorization Server: 사용자 인증을 수행하고, Access Token을 발급하는 서버.
  • Resource Server: 보호된 자원에 대한 접근을 허가하는 서버.
  • Access Token: 리소스 서버에 접근하기 위한 인증 토큰.

2. 스프링 부트 설정

스프링 부트를 이용해 OAuth2를 구현하기 위해 필요한 의존성을 추가하겠습니다. spring-boot-starter-oauth2-clientspring-boot-starter-security를 포함해야 합니다.

pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

이 외에도 MVC 및 Thymeleaf 템플릿 엔진을 사용할 계획이라면 추가로 다음 의존성도 포함시켜야 합니다.


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

스프링 부트의 설정 파일인 application.yml에 OAuth2 관련 설정을 추가해야 합니다. 예를 들어, Google 로그인을 설정할 수 있습니다.

application.yml:
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope: profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        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

3. OAuth2 로그인 기능 구현하기

OAuth2 로그인을 구현하기 위해 필요한 설정을 마쳤다면, 이제 로그인 페이지를 만들어 보겠습니다. Thymeleaf를 이용해 간단한 로그인 버튼을 추가해줄 수 있습니다.

login.html:
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>로그인 페이지</title>
</head>
<body>
    <h1>로그인하세오</h1>
    <a href="@{/oauth2/authorization/google}">Google로 로그인</a>
</body>
</html>

위 코드에서 Google로 로그인하라는 링크를 클릭하면 OAuth2 플로우가 시작됩니다. 사용자가 Google에 로그인하고 권한을 허용하면, 해당 사용자의 정보가 애플리케이션으로 돌아옵니다.

3.1 사용자 정보 가져오기

로그인 후 사용자 정보를 가져오기 위해, 스프링 시큐리티의 UserDetailsService 또는 OAuth2UserService를 구현할 수 있습니다.

UserService.java:
@Service
public class UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = super.loadUser(userRequest);
        
        // 사용자 정보를 활용한 비즈니스 로직 추가
        
        return oAuth2User;
    }
}

이제 사용자가 로그인할 때마다 해당 서비스가 호출되어 사용자의 정보를 처리할 수 있게 됩니다.

4. 로그아웃 기능 구현하기

이제 로그아웃 기능을 구현해보겠습니다. 로그아웃은 사용자 세션을 종료시키고, 이를 통해 사용자 정보가 더 이상 유효하지 않게 됩니다.

LogoutController.java:
@Controller
public class LogoutController {

    @GetMapping("/logout")
    public String logout() {
        SecurityContextHolder.clearContext();
        // 추가적인 로그아웃 처리 로직
        return "redirect:/";
    }
}

로그아웃 후 사용자를 홈 페이지로 리다이렉트합니다. 로그아웃을 위한 버튼을 아래와 같이 만들 수 있습니다.

login.html:
<a href="@{/logout}">로그아웃</a>

5. 쿠키 관리 클래스 구현하기

이제는 사용자의 세션과 데이터를 효율적으로 관리하기 위해 쿠키 관리 클래스를 구현해보겠습니다. 쿠키는 클라이언트 측에서 작은 데이터를 저장하는 방법으로, 사용자 상태를 유지하는 데 유용합니다.

CookieManager.java:
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Service
public class CookieManager {

    public void createCookie(HttpServletResponse response, String name, String value, int maxAge) {
        Cookie cookie = new Cookie(name, value);
        cookie.setMaxAge(maxAge);
        cookie.setPath("/");
        response.addCookie(cookie);
    }

    public String readCookie(HttpServletRequest request, String name) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(name)) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

    public void deleteCookie(HttpServletResponse response, String name) {
        Cookie cookie = new Cookie(name, null);
        cookie.setMaxAge(0);
        cookie.setPath("/");
        response.addCookie(cookie);
    }
}

위의 CookieManager 클래스는 쿠키 생성, 읽기 및 삭제를 위한 다양한 메서드를 제공합니다.

5.1 쿠키 활용 예제

이제 쿠키를 실제로 사용하는 예제를 살펴보겠습니다. 사용자가 로그인할 때, 특정 정보를 쿠키에 저장할 수 있습니다.

LoginController.java:
@PostMapping("/login")
public String login(@RequestParam String username, HttpServletResponse response) {
    // 로그인 로직
    
    cookieManager.createCookie(response, "username", username, 60 * 60); // 1시간 유지
    return "redirect:/home";
}

이렇게 생성된 쿠키는 사용자의 브라우저에 저장되며, 이후 요청 시에 이를 쉽게 읽어올 수 있습니다.

6. 결론

이번 글에서는 스프링 부트를 사용하여 OAuth2 기반의 로그인 및 로그아웃 기능을 구현하고, 사용자 세션 관리를 위한 쿠키 관리 클래스를 구체적으로 알아보았습니다. OAuth2를 통해 인증을 쉽게 해결하고, 효과적인 쿠키 관리를 통해 사용자 경험을 개선할 수 있습니다.

이제 여러분은 스프링 부트를 기반으로 한 웹 애플리케이션에서 OAuth2와 쿠키 관리를 통한 사용자 인증 및 세션 관리 기능을 구현할 수 있는 능력을 갖추셨습니다. 이 글이 여러분의 개발 여정에 도움이 되기를 바랍니다.