본문 바로가기

Architecture

Spring Security 없이 OAuth2 클라이언트 직접 구현

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

 


 

Oauth2 인증 절차

전체 흐름 요약 (사용자 관점)

  1. 사용자가 로그인 버튼 클릭
  2. 프론트엔드가 /login/oauth2 API 호출 → 클라이언트는 인증 정보를 응답
  3. 프론트는 응답 받은 정보를 바탕으로 Google 로그인 페이지로 redirect
  4. Google 로그인 성공 시, 사용자는 redirect_uri로 다시 돌아옴 (code + state 전달됨)
  5. 클라이언트 서버는 이 code로 access_token 요청
  6. access_token으로 사용자 정보 조회
  7. 세션에 사용자 정보를 저장 → 로그인 완료

 


 

구성 파일

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 내부 처리 방식과 각 구성 요소의 역할을 더욱 깊이 있게 살펴보겠습니다.