Spring Boot는 강력한 보안 기능을 제공하며, OAuth2와 JWT(JSON Web Token)를 활용하면 현대적인 웹 애플리케이션에서 강력한 인증 및 권한 관리를 구현할 수 있습니다. 이 글에서는 OAuth2와 JWT의 기본 개념을 설명하고, 이를 활용해 Spring Boot 애플리케이션에서 보안을 강화하는 방법을 간단한 예시 프로젝트를 통해 설명하겠습니다.
OAuth2와 JWT의 기본 개념
- OAuth2: OAuth2는 리소스 소유자가 제3자 애플리케이션에 자신의 리소스에 대한 접근 권한을 부여하는 인증 프레임워크입니다. OAuth2는 주로 액세스 토큰을 통해 권한을 부여하고, 이러한 토큰을 사용하여 클라이언트는 서버의 보호된 리소스에 접근할 수 있습니다. OAuth2의 주요 흐름에는 Authorization Code Grant, Implicit Grant, Client Credentials Grant, Resource Owner Password Credentials Grant 등이 있습니다.
- JWT (JSON Web Token): JWT는 JSON 형식의 데이터를 간결하게 표현한 토큰으로, 주로 인증 및 정보 교환에 사용됩니다. JWT는 세 부분으로 구성되며, 헤더(Header), 페이로드(Payload), 서명(Signature)로 이루어져 있습니다. JWT는 일반적으로 서버와 클라이언트 간의 인증 정보를 안전하게 전달하는 데 사용되며, 디지털 서명을 포함하여 데이터의 무결성을 보장할 수 있습니다.
예시 프로젝트: OAuth2와 JWT를 활용한 Spring Boot 인증 및 권한 관리
이제 OAuth2와 JWT를 활용하여 Spring Boot 애플리케이션에서 인증 및 권한 관리를 구현하는 간단한 예제를 만들어보겠습니다.
1. 프로젝트 설정
먼저 Spring Initializr를 사용하여 새로운 Spring Boot 프로젝트를 생성합니다. 필요한 의존성은 다음과 같습니다:
- Spring Web
- Spring Security
- OAuth2 Resource Server
- Spring Boot DevTools (Optional)
- Lombok (Optional)
build.gradle 또는 pom.xml 파일에 다음과 같이 의존성을 추가합니다
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-jwt'
// Optional dependencies
implementation 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
2. JWT 기반 보안 설정
이제 JWT를 사용한 인증을 위해 Spring Security와 OAuth2를 설정합니다. SecurityConfig 클래스를 만들어 보겠습니다
import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 ->
oauth2.jwt(jwt ->
jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())
)
);
}
@Bean
public JwtAuthenticationConverter jwtAuthenticationConverter() {
JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
return jwtAuthenticationConverter;
}
}
위의 설정에서는 /public/** 경로에 대해 모든 접근을 허용하고, 그 외의 모든 요청에 대해 인증을 요구하도록 설정했습니다. JWT 토큰에서 권한을 추출하여 Spring Security의 권한 관리에 사용할 수 있도록 JwtAuthenticationConverter를 설정하였습니다.
3. JWT 발급 및 테스트
OAuth2 Authorization Server나 외부 인증 서버를 통해 JWT 토큰을 발급받는 방법은 여러 가지가 있습니다. 이 예제에서는 간단하게 외부 서버에서 JWT를 발급받아 사용하는 것을 가정하고, JWT를 발급받아 애플리케이션에 요청을 보내는 방식으로 테스트하겠습니다.
JWT 발급 예제는 다음과 같습니다. 예를 들어, jwt.io에서 토큰을 생성할 수 있습니다.
토큰을 발급받은 후, 다음과 같이 HTTP 요청을 보내보세요
curl -H "Authorization: Bearer {your_jwt_token}" http://localhost:8080/secure-endpoint
4. 간단한 REST 컨트롤러 작성
이제 간단한 REST 컨트롤러를 작성해보겠습니다
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/public")
public String publicEndpoint() {
return "This is a public endpoint.";
}
@GetMapping("/secure")
public String secureEndpoint() {
return "This is a secure endpoint.";
}
}
여기서 /api/public 엔드포인트는 누구나 접근할 수 있지만, /api/secure 엔드포인트는 인증된 사용자만 접근할 수 있습니다.
이 예제에서는 Spring Boot 애플리케이션에서 OAuth2와 JWT를 활용하여 인증 및 권한 관리를 구현하는 방법을 알아보았습니다. 이 방법은 확장 가능하고 안전한 인증 메커니즘을 제공하며, 특히 마이크로서비스 아키텍처에서 유용하게 사용될 수 있습니다.
OAuth2와 JWT는 강력한 도구이지만, 이를 제대로 이해하고 사용하는 것이 중요합니다. 특히 JWT 토큰의 보안 설정, 만료 시간 관리, 토큰 갱신 등의 추가적인 고려 사항도 존재하므로, 실제 애플리케이션에 적용할 때는 충분한 검토가 필요합니다.
'Spring' 카테고리의 다른 글
Spring Boot에서 CORS 설정하기: 크로스 도메인 요청 허용을 위한 필수 가이드 (0) | 2024.09.02 |
---|---|
Spring Boot Actuator를 활용한 애플리케이션 모니터링 (0) | 2024.09.02 |
"프로메테우스와 스프링의 만남: 실시간 모니터링으로 애플리케이션의 상태를 한눈에 파악하기" (0) | 2024.08.30 |
Spring Boot에서 다중 DataSource 설정하기: 비즈니스 확장성과 성능 최적화를 위한 필수 전략 (0) | 2024.08.29 |
AOP 완벽 가이드: 스프링에서 횡단 관심사를 마스터하는 방법 (0) | 2024.08.29 |