OAuth2 인증 절차
OAuth2 클라이언트를 Spring Boot 만 사용하여 구현해보겠습니다.
Spring Security 없이, 순수 HTTP 통신과 세션 기반으로 인증 흐름을 직접 설계함으로써
OAuth2의 내부 동작을 보다 깊이 있게 이해해보는 것이 목적입니다. 매우 간단합니다.
깃허브에서 전체 코드 확인하기:
https://github.com/youseonghyeon/oauth2-client
GitHub - youseonghyeon/oauth2-client: oauth2-client 구현을 위한 리포지토리
oauth2-client 구현을 위한 리포지토리. Contribute to youseonghyeon/oauth2-client development by creating an account on GitHub.
github.com
전체 흐름 요약 (사용자 관점)
- 사용자가 로그인 버튼 클릭
- 프론트엔드가 /login/oauth2 API 호출 → 클라이언트는 인증 정보를 응답
- 프론트는 응답 받은 정보를 바탕으로 Google 로그인 페이지로 redirect
- Google 로그인 성공 시, 사용자는 redirect_uri로 다시 돌아옴 (code + state 전달됨)
- 클라이언트 서버는 이 code로 access_token 요청
- access_token으로 사용자 정보 조회
- 세션에 사용자 정보를 저장 → 로그인 완료
구성 파일
1. LoginController
OAuth2 로그인 시작 정보를 응답합니다.
프론트는 이 API로부터 client_id, redirect_uri, state 등의 정보를 받아 로그인 URL을 구성합니다.
@GetMapping("/login/oauth2")
public ResponseEntity<Map<String, Object>> getResource() {
Map<String, Object> response = new HashMap<>();
response.put("authorization", new AuthResponse());
return ResponseEntity.ok(response);
}
@Data
public static class AuthResponse {
private String clientId = "my-service-id";
private String redirectUrl = "https://accounts.google.com/o/oauth2/v2/auth";
private String responseType = "code";
private String scope = "read write";
private String state = UUID.randomUUID().toString();
}
2. AuthCallbackController
Google로부터 전달받은 code를 처리하는 콜백 엔드포인트입니다.
이곳에서 access_token 요청 → userInfo 요청 → 세션 저장을 한 번에 처리합니다.
인가 코드는 사용자 브라우저를 통해 전달되므로,
보안상 반드시 1회만 사용되도록 제한됩니다.
@PostMapping("/auth/callback")
public String handleAuthCallback(@RequestBody AuthCallbackRequest authCallbackRequest, HttpSession session) {
String authenticationCode = authCallbackRequest.code;
// 인가 코드를 이용하여 access token 요청
String accessToken = oAuth2TokenClient.getAccessToken(authenticationCode);
// access token 을 이용하여 user정보 요청
Object userInfo = oAuth2TokenClient.fetchUserInfo(accessToken);
// session 등록
session.setAttribute(jsessionid, new SessionValue(accessToken, userInfo));
// 로그인 성공
return "login success";
}
3. OAuth2TokenClient
인증 서버(Google)와 통신하는 역할을 담당합니다.
- getAccessToken(String code) : 액세스 토큰을 요청합니다. (@Param 인가 코드)
- fetchUserInfo(String token) : 사용자 정보를 요청합니다. (@Param 액세스 토큰)
이 부분은 RestTemplate 또는 WebClient를 이용해 구현할 수 있습니다.
Spring Security는 매우 강력한 프레임워크이지만,
내부 동작이 복잡하게 추상화되어 있어 실제 인증 흐름을 이해하기 어려운 경우가 많습니다.
이에 직접 OAuth2 인증 과정을 구현해보며, 인가 코드 처리부터 토큰 발급, 사용자 정보 조회 및 세션 등록까지의 전반적인 흐름을 경험해보았습니다.
다음 단계에서는 인증 서버(Auth Server)를 직접 구현하여, OAuth2 내부 처리 방식과 각 구성 요소의 역할을 더욱 깊이 있게 살펴보겠습니다.
'Architecture' 카테고리의 다른 글
CDN 이란? 글로벌 서비스 캐싱 전략 (0) | 2025.04.19 |
---|---|
OAuth2 인증 Flow (0) | 2025.04.12 |
소프트웨어 복잡성 (0) | 2025.03.29 |
코어 수에 따른 프로세스와 쓰레드 개수의 관계와 성능 영향 (1) | 2024.11.04 |
대규모 트래픽에 대비한 아키텍처 확장 전략 (1) | 2024.11.02 |