🚀 Spring Boot에서 API 보안 강화: Laravel과 비교한 JWT + OAuth2 적용
API 보안은 사용자 인증(Authentication)과 권한 관리(Authorization) 를 효과적으로 처리하는 것이 핵심입니다.
Laravel과 Spring Boot는 JWT(Json Web Token) 및 OAuth2 를 사용하여 보안을 강화할 수 있습니다.
이번 글에서는 Laravel과 Spring Boot에서 API 보안을 구현하는 방법을 비교하면서 설명하겠습니다.
✅ 1. JWT (JSON Web Token) 비교 → 무상태 인증 방식
✅ 2. Spring Security + JWT vs Laravel Passport
✅ 3. OAuth2 적용 → Google, Facebook, Kakao 로그인 비교
1️⃣ JWT (JSON Web Token) 비교: Laravel vs Spring Boot
📌 JWT란?
• JWT는 세션(Session)을 사용하지 않고도 사용자의 인증 상태를 유지할 수 있는 토큰 기반 인증 방식입니다.
• 사용자가 로그인하면 Access Token(토큰)이 발급되고, 이후 API 호출 시 이 토큰을 이용해 인증을 수행합니다.
비교 항목Laravel (PHP)Spring Boot (Java)
JWT 패키지 | tymon/jwt-auth | jjwt (spring-boot-starter-security + jjwt) |
인증 미들웨어 | auth:api | OncePerRequestFilter |
토큰 저장 방식 | 로컬 스토리지 / 쿠키 | 헤더 (Authorization: Bearer) |
갱신 방식 | Refresh Token 필요 | Refresh Token 필요 |
✅ Laravel에서는 tymon/jwt-auth 패키지를 사용하고, Spring Boot에서는 jjwt 라이브러리를 사용하여 JWT를 적용합니다.
🔹 1. Laravel에서 JWT 적용 (tymon/jwt-auth 사용)
(1) JWT 패키지 설치
composer require tymon/jwt-auth
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret
(2) config/auth.php에서 JWT 설정
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
(3) 로그인 API (JWT 발급)
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
public function login(Request $request) {
$credentials = $request->only('email', 'password');
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return response()->json(['token' => $token]);
}
✅ Laravel에서는 JWTAuth::attempt($credentials) 를 사용하여 JWT 토큰을 발급
🔹 2. Spring Boot에서 JWT 적용 (jjwt 사용)
(1) JWT 의존성 추가 (pom.xml)
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.11.5</version>
</dependency>
(2) JWT 유틸 클래스 생성
import io.jsonwebtoken.*;
import java.util.Date;
public class JwtUtil {
private final String SECRET_KEY = "my_secret_key";
public String generateToken(String email) {
return Jwts.builder()
.setSubject(email)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1시간 유효
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public String extractEmail(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
(3) 로그인 API (JWT 발급)
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
String token = jwtUtil.generateToken(request.getEmail());
return ResponseEntity.ok(new AuthResponse(token));
}
✅ Spring Boot에서는 jwtUtil.generateToken()을 사용하여 JWT 토큰을 발급
📌 Laravel vs Spring Boot 로그인 API 비교
비교 항목 | Laravel (PHP) | Spring Boot (Java) |
로그인 함수 | JWTAuth::attempt($credentials) | jwtUtil.generateToken(email) |
토큰 응답 방식 | JSON { "token": "xxx" } | JSON { "token": "xxx" } |
세션 사용 여부 | ❌ 없음 (Stateless) | ❌ 없음 (Stateless) |
✅ Laravel과 Spring Boot 모두 JWT 방식으로 세션 없이 인증 가능!
2️⃣ API 보안 적용: Laravel Passport vs Spring Security
📌 Laravel과 Spring Boot의 API 보안 방식 비교
보안 기능 | Laravel (PHP) | Spring Boot (Java) |
API 인증 | Laravel Passport | Spring Security |
토큰 발급 방식 | oauth/token 엔드포인트 제공 | @PreAuthorize, JWT 적용 |
리프레시 토큰 지원 | ✅ 가능 | ✅ 가능 |
API 보호 | auth:api 미들웨어 | OncePerRequestFilter 사용 |
✅ Laravel Passport는 OAuth2 기반 인증을 제공하며, Spring Boot는 Spring Security를 활용하여 API를 보호할 수 있음
🔹 Laravel Passport 적용 (OAuth2 지원)
(1) Passport 패키지 설치
composer require laravel/passport
php artisan passport:install
(2) config/auth.php에서 Passport 설정
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
(3) 로그인 API (OAuth 토큰 발급)
public function login(Request $request) {
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('MyApp')->accessToken;
return response()->json(['token' => $token]);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
✅ Laravel Passport는 createToken()을 사용하여 OAuth2 토큰을 발급
🔹 Spring Security 적용 (@PreAuthorize + JWT 적용)
(1) Security 설정 클래스 추가
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.antMatchers("/api/private/**").authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
(2) @PreAuthorize를 사용한 API 보호
@PreAuthorize("hasRole('USER')")
@GetMapping("/api/private/data")
public ResponseEntity<String> getSecureData() {
return ResponseEntity.ok("This is secure data");
}
✅ Spring Boot에서는 @PreAuthorize를 사용하여 API 보안을 강화
📌 결론: Laravel vs Spring Boot API 보안 비교 정리
✅ JWT 인증 비교
• Laravel: tymon/jwt-auth 패키지 활용
• Spring Boot: jjwt 라이브러리 활용
✅ OAuth2 인증 비교
• Laravel: Passport 사용
• Spring Boot: Spring Security + OAuth2 사용
✅ API 보안 적용
• Laravel: auth:api 미들웨어 적용
• Spring Boot: @PreAuthorize, OncePerRequestFilter 적용
📌 결론: Laravel과 Spring Boot 모두 강력한 보안 기능을 제공하지만,
Spring Boot는 더 유연한 방식으로 API 보안을 설정할 수 있음.
'SpringBoot from Laravel' 카테고리의 다른 글
Spring Boot vs Laravel: CI/CD (자동 배포) 구축 비교 (0) | 2025.02.13 |
---|---|
Spring Boot vs Laravel: 웹소켓(WebSocket) 실시간 데이터 처리 비교 (0) | 2025.02.13 |
Spring Boot vs Laravel: API Rate Limiting (요청 제한) 구현 (0) | 2025.02.13 |
Spring Boot vs Laravel: OAuth2 소셜 로그인 (Google, Facebook, Kakao) 구현 (0) | 2025.02.13 |
Spring Boot 성능 최적화: Laravel 대비 성능 향상 방법 (0) | 2025.02.13 |
Spring Boot에서 API 개발 최적화: Laravel API → Spring Boot REST API (0) | 2025.02.12 |
Spring Boot에서 사용자 권한(Role) 관리: Laravel의 Gates & Policies vs Spring Security (0) | 2025.02.08 |
Spring Boot에서 인증 적용: Laravel Auth → Spring Security & JWT (0) | 2025.02.07 |