OAuth2는 인증 및 권한 부여를 위한 업계 표준 프로토콜로, 제3자가 사용자 데이터를 접근할 수 있도록 안전한 메커니즘을 제공합니다. 이를 통해 사용자는 자신의 자격 증명을 공유하지 않고도 애플리케이션에 권한을 부여할 수 있습니다. Spring Security는 OAuth2를 간단하게 구현할 수 있는 강력한 기능을 제공합니다.
OAuth2는 사용자가 자신의 인증 정보를 노출하지 않고, 제3자 애플리케이션이 사용자 리소스에 안전하게 접근할 수 있도록 설계된 프로토콜입니다.
OAuth2는 다양한 인증 흐름을 제공합니다. 가장 일반적으로 사용되는 두 가지는 다음과 같습니다.
흐름
1. 클라이언트는 권한 서버에 인증 요청.
2. 사용자는 로그인 및 권한 부여.
3. 권한 서버가 Authorization Code를 클라이언트에게 전달.
4. 클라이언트는 Authorization Code로 Access Token 요청.
5. 권한 서버가 Access Token 발급.
흐름
1. 클라이언트는 권한 서버에 클라이언트 자격 증명(Client ID 와 Secret)으로 요청.
2. 권한 서버가 Access Token 발급.
Spring Boot와 Spring Security를 사용하면 OAuth2 인증을 손쉽게 구현할 수 있습니다.
Maven 프로젝트의 경우 pom.xml
에 다음을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring.boot-starter-oauth2-client</artifactId>
</dependency>
OAuth2 클라이언트의 설정을 application.yml
파일에 작성합니다.
예: Google OAuth2 설정
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_GOOGLE_CLIENT_ID
client-secret: YOUR_GOOGLE_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://openidconnect.googleapis.com/v1/userinfo
Spring Security는 자동으로 OAuth2 로그인 페이지를 생성하고 사용자를 인증합니다.
컨트롤러 예제
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
@RestController
public class OAuth2Controller {
@GetMapping("/user")
public String userInfo(OAuth2AuthenticationToken authentication) {
return "Authenticated user: " + authentication.getPrincipal().getAttributes();
}
}
리소스 서버에서 토큰을 검증하려면 다음 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
설정 예:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://your-authorization-server.com
리소스 서버는 JWT 토큰을 검증하고 보호된 리소스에 접근을 허용합니다.