OAuth2로 로그인/로그아웃 구현
스프링 부트(Spring Boot)는 Java 기반의 웹 애플리케이션 개발 프레임워크로, 강력하고 유연한 기능을 제공합니다.
이번 강좌에서는 OAuth2를 사용하여 안전한 로그인 및 로그아웃 기능을 구현하는 방법에 대해 알아보겠습니다.
OAuth2는 클라이언트 애플리케이션이 리소스 서버의 데이터를 안전하게 접근할 수 있도록 해주는 프로토콜입니다.
이를 통해 사용자 인증을 완벽하게 처리할 수 있습니다.
1. 프로젝트 설정
Spring Initializr(https://start.spring.io/)를 사용하여 새로운 프로젝트를 생성합니다.
필요한 종속성은 다음과 같습니다:
- Spring Web
- Spring Security
- OAuth2 Client
- Spring Data JPA
- H2 Database (테스트 용)
Maven 또는 Gradle을 사용하여 생성한 프로젝트의 build.gradle 또는 pom.xml 파일을 확인하여 올바르게 설정되었는지 확인합니다.
2. OAuth2 설정
application.yml 파일에 OAuth2 클라이언트 설정을 추가합니다.
예를 들어, Google OAuth2를 사용할 경우 다음과 같이 설정할 수 있습니다:
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
user-name-attribute: sub
3. Security Configurations
WebSecurityConfigurerAdapter 클래스를 상속받아 보안을 설정합니다.
로그인 페이지와 결과를 처리하는 방식을 설정할 수 있습니다.
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("/", "/oauth2/**", "/login**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage("/login")
.defaultSuccessUrl("/", true);
// 로그아웃 설정
http.logout()
.logoutSuccessUrl("/")
.permitAll();
}
}
4. 로그인 및 로그아웃 처리 Controller
다음으로 로그인 및 로그아웃 요청을 처리하기 위한 Controller를 구현합니다.
아래는 기본적인 Controller의 예입니다:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login"; // login.html로 리턴
}
}
5. 로그인 & 로그아웃 페이지 구현
Thymeleaf 또는 JSP를 사용하여 로그인 페이지를 구현합니다.
아래는 Thymeleaf를 사용하는 예입니다:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>로그인</title>
</head>
<body>
<h1>로그인 페이지</h1>
<a href="@{/oauth2/authorization/google}">구글로 로그인</a>
</body>
</html>
테스트 코드 실패 해결 및 코드 수정하기
OAuth2 로그인 처리 후, 정상적으로 기능이 동작하는지 확인하기 위해 테스트 코드를 작성해야 합니다.
그러나 처음에 작성한 테스트가 실패할 수 있습니다. 이때 실패 원인을 파악하고 수정하는 방법에 대해 설명합니다.
1. 테스트 코드 작성
Spring Test를 사용하여 OAuth2 로그인을 테스트하는 코드를 작성합니다. 다음은 기본적인 테스트 코드의 예입니다:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
@AutoConfigureMockMvc
public class LoginControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser
public void testLoginPage() throws Exception {
mockMvc.perform(get("/login"))
.andExpect(status().isOk());
}
}
2. 실패 원인 분석
테스트가 실패하는 경우 다양한 원인이 있을 수 있습니다.
가장 흔한 원인은 인증 또는 경로 설정 문제입니다. 예를 들어, 로그인 페이지의 URL이 잘못 지정되었거나,
인증되지 않은 사용자가 접근할 수 없도록 설정되어 발생할 수 있습니다.
3. 코드 수정 예시
테스트에서 로그인 페이지를 기대하고 있는데, 해당 페이지가 존재하지 않는 경우 로그인 페이지 경로를 수정해야 합니다.
다음과 같이 Controller 수정이 필요할 수 있습니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login"; // login.html로 리턴
}
}
4. 다시 테스트 실행
코드를 수정한 후, 테스트를 다시 실행하여 성공하는지 확인합니다.
결론
이번 강좌에서는 스프링 부트를 사용하여 OAuth2로 로그인/로그아웃 기능을 구현하는 방법과 테스트 코드를 작성하고 수정하는 방법을 알아보았습니다.
OAuth2는 현대 웹 애플리케이션에서 매우 중요한 요소이며, 이를 통해 보안을 더욱 강화할 수 있습니다.
또한, 테스트 코드를 작성하여 기능이 올바르게 동작하는지 확인하는 과정은 소프트웨어 개발에서 매우 중요한 절차입니다.
이를 통해 안정적이고 안전한 애플리케이션을 개발할 수 있습니다.