본문 바로가기

SpringBoot from Laravel

Spring Boot에서 API 보안 강화: Laravel과 비교한 JWT + OAuth2 적용

반응형

🚀 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 보안을 설정할 수 있음. 

반응형