본문 바로가기

엔지니어링

Spring Boot를 이용한 OAuth 2.0 인증 구현

지난 시간에는 OAuth 인증의 개념과 그 동작 방식에 대해 알아보았습니다. 이번 포스트에서는 인기 있는 백엔드 프레임워크인 Spring Boot를 사용하여 OAuth 2.0 인증을 어떻게 구현하는지 알아보도록 하겠습니다.

1. 의존성 추가하기

먼저, 프로젝트에 필요한 의존성을 추가해야 합니다. `pom.xml` 파일에 아래의 내용을 추가합니다.

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

2. Google에 앱 등록

Google에 앱을 등록하고, 사용자가 구글을 통해 로그인을 하면 우리는 그 토큰을 받아 인증하도록 하겠습니다. 우선 구글Google API Console에서 클라이언트 ID와 클라이언트 시크릿을 생성합니다.

1. [Google Cloud Platform Console](https://console.cloud.google.com/)에 접속

2. 프로젝트 드롭다운 메뉴를 클릭하고, 새 프로젝트를 생성하거나 기존 프로젝트를 선택

3. 좌측 네비게이션 메뉴에서 "APIs & Services > Credentials"를 선택

4. "Create Credentials" 버튼을 클릭하고 "OAuth client ID"를 선택

5. "Application type"에서 애플리케이션 유형(웹 애플리케이션, 안드로이드, 크롬 앱, iOS, TV 및 게임 콘솔 등)을 선택

6. "Authorized JavaScript origins"에는 애플리케이션이 실행 중인 서버의 도메인을, "Authorized redirect URIs"에는 OAuth 인증 후에 사용자가 리다이렉션될 URI를 입력

7. "Create" 버튼을 클릭하여 클라이언트 ID와 클라이언트 시크릿을 생성하세요.

**생성된 클라이언트 ID와 클라이언트 시크릿은 안전한 장소에 보관해야합니다.

3. application.properties 설정하기

다음으로, `application.properties` 파일에 OAuth 인증 설정을 추가해야 합니다. 이 설정은 인증을 위한 클라이언트 ID와 시크릿, 리다이렉트 URI 등을 포함합니다.

spring.security.oauth2.client.registration.google.client-id=your-google-client-id
spring.security.oauth2.client.registration.google.client-secret=your-google-client-secret
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/google

`your-google-client-id`와 `your-google-client-secret`에 2에서 생성한 클라이언트 ID와 시크릿을 넣어줍니다.

 

4. SecurityConfig 설정하기

Spring Security를 설정하기 위해 `SecurityConfig` 클래스를 생성하고, 이를 설정해야 합니다.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }
}

이 설정을 통해 우리는 모든 요청에 대해 인증을 요구하고, OAuth 2 로그인을 사용하도록 설정합니다.

5. Principal 정보 가져오기

이제 사용자가 로그인하면 인증 정보를 가져올 수 있습니다. 아래는 인증 정보를 가져와 사용자의 이름을 반환하는 컨트롤러 예제입니다.

@RestController
public class UserController {
@GetMapping("/user")
    public String getUser(@AuthenticationPrincipal OAuth2User principal) {
        return "Hello, " + principal.getAttribute("name");
    }
}

이 코드에서 getUser 메서드는 인증된 사용자의 이름을 가져와 "Hello, {사용자 이름}" 형식의 메시지를 반환합니다. 이 때 `@AuthenticationPrincipal` 어노테이션은 Spring Security에서 현재 인증된 사용자를 나타내는 `OAuth2User` 객체를 `principal` 변수로 주입하게 합니다.

이렇게 함으로써 기본적인 OAuth 2.0 인증 구현이 완료되었습니다. 다만, 이 코드는 간단한 예시로, 실제 애플리케이션에서는 보안을 강화하거나 사용자 경험을 개선하기 위한 추가적인 구현이 필요할 수 있습니다.

다음 포스팅에서는 API 게이트웨이의 Rate Limit에 대해 알아보겠습니다.

'엔지니어링' 카테고리의 다른 글

서비스 디스커버리 패턴  (0) 2023.07.15
API 게이트웨이 - Rate limit  (0) 2023.07.15
API 게이트웨이 - 인증  (0) 2023.07.15
API 게이트웨이 구현  (0) 2023.07.15
API 게이트웨이 패턴  (0) 2023.07.15