저자: 조광형
날짜: [현재 날짜]
1. 서론
현대 애플리케이션은 사용자 인증과 권한 부여를 위해 OAuth2 프로토콜을 많이 사용합니다. 이 프로토콜은 다양한 클라이언트 애플리케이션에서 안전하고 유연한 방식으로 사용자 정보를 처리할 수 있도록 도와줍니다. 본 강좌에서는 스프링 부트를 활용하여 OAuth2를 기반으로 한 로그인과 로그아웃 기능을 구현하는 방법을 단계별로 안내합니다.
2. 스프링 부트 프로젝트 시작하기
스프링 부트 프로젝트를 시작하기 위해서는 첫 단계로 Spring Initializr를 이용하여 기본 프로젝트 구조를 생성합니다. 다음은 초기 설정 절차입니다.
- 웹 브라우저를 열고 Spring Initializr에 접속합니다.
- 프로젝트 메타데이터를 설정합니다:
- Project: Maven Project
- Language: Java
- Spring Boot: 최신 안정 버전
- Group: com.example
- Artifact: oauth2-demo
- Name: oauth2-demo
- Description: OAuth2 예제 애플리케이션
- Dependencies 섹션에서 다음 의존성을 추가합니다:
- Spring Web
- Spring Security
- Spring Boot DevTools
- Spring Data JPA
- H2 Database (개발 및 테스트를 위한 인메모리 데이터베이스)
- ‘Generate’를 클릭하여 ZIP 파일을 다운로드하고, 이를 원하는 디렉터리에 압축 해제합니다.
3. 의존성 추가하기
이제 Maven의 pom.xml 파일을 열고 OAuth2 관련 의존성을 추가합니다. 다음 코드를 pom.xml의 `
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
위의 의존성을 추가하면 OAuth2 클라이언트의 기본 설정을 사용할 수 있습니다. 그 다음으로는 JpaRepository를 사용하여 사용자 정보를 저장할 수 있는 엔티티를 생성해야 합니다.
4. 사용자 엔티티 및 리포지토리 설정하기
애플리케이션의 사용자 정보를 저장하기 위한 엔티티 클래스를 생성합니다. 아래 코드는 사용자 정보를 담을 User 엔티티의 예입니다.
package com.example.oauth2demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String name;
// Getters and Setters
}
다음으로, User 엔티티에 대한 JpaRepository를 생성합니다.
package com.example.oauth2demo.repository;
import com.example.oauth2demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
5. OAuth2 설정하기
OAuth2 로그인 기능을 추가하기 위해, application.yml 파일에 OAuth2 클라이언트를 설정해야 합니다. 아래의 예시를 참고하세요.
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope:
- email
- profile
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
여기에 본인의 Google API 클라이언트를 등록해야 합니다. Google Cloud Console에서 클라이언트를 생성하여 client-id와 client-secret을 얻을 수 있습니다.
6. 보안 구성하기
스프링 시큐리티를 설정하여 OAuth2 로그인과 로그아웃을 처리하는 방법을 다루겠습니다. SecurityConfig 클래스를 작성하고, HTTP 보안 관련 설정을 추가합니다.
package com.example.oauth2demo.config;
import org.springframework.context.annotation.Bean;
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", "/oauth2/**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.defaultSuccessUrl("/home", true)
.and()
.logout()
.logoutSuccessUrl("/");
}
}
이 설정을 통해 루트와 로그인 페이지, 그리고 OAuth2 관련 URL은 누구나 접근할 수 있으며, 인증된 사용자만 다른 페이지에 접근할 수 있도록 구성합니다.
7. 컨트롤러 작성하기
사용자가 OAuth2 로그인을 하고 나서 적절한 페이지로 리다이렉트되도록 컨트롤러를 작성해야 합니다. 아래는 기본적인 컨트롤러의 예입니다.
package com.example.oauth2demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/")
public String index() {
return "index"; // index.html 페이지 반환
}
@GetMapping("/home")
public String home() {
return "home"; // home.html 페이지 반환
}
}
이 컨트롤러는 기본 루트 경로와 home 경로를 위해 각각 index.html과 home.html 페이지를 반환합니다.
8. 뷰 템플릿 설정하기
Thymeleaf를 사용하여 View 템플릿을 설정합니다. resources/templates 폴더에 index.html과 home.html을 생성합니다. 아래는 각 파일의 샘플 코드입니다.
<!-- index.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>OAuth2 로그인 예제</title>
</head>
<body>
<h1>환영합니다!</h1>
<a th:href="@{/oauth2/authorization/google}">구글 로그인</a>
</body>
</html>
<!-- home.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>홈 화면</title>
</head>
<body>
<h1>홈에 오신 것을 환영합니다!</h1>
<a href="/logout">로그아웃</a>
</body>
</html>
9. 애플리케이션 실행하기
모든 설정이 완료되었다면 애플리케이션을 실행해보세요. IDE에서 메인 클래스를 실행하거나, 터미널에서 다음 명령어를 통해 실행할 수 있습니다.
mvn spring-boot:run
애플리케이션이 정상적으로 실행되면 웹 브라우저에서 http://localhost:8080에 접속하여 로그인 화면을 확인할 수 있습니다.
10. 결론
본 강좌에서는 스프링 부트를 이용한 OAuth2 로그인/로그아웃 기능의 구현 과정을 살펴보았습니다. 이 예제는 기본적인 설정에 대한 소개이며, 실제 프로젝트에서는 추가적인 보안 설정이나 사용자 데이터의 저장 및 관리를 고려해야 합니다. 여러분의 프로젝트에 맞는 방식으로 OAuth2를 확장하고 사용자 인증 기능을 구현해 보시길 바랍니다.