본문 바로가기

SpringBoot from Laravel

Spring Boot에서 인증 적용: Laravel Auth → Spring Security & JWT

반응형

1. 서론

 

Laravel에서 인증(Authentication) 및 권한 관리(Authorization)를 구현할 때는 Laravel Auth(세션 기반 인증) 또는 **JWT(JSON Web Token)**을 주로 사용합니다.

 

Spring Boot에서는 Spring Security + JWT를 조합하여 강력한 인증 시스템을 구축할 수 있습니다.

 

이번 글에서는 Laravel의 인증 시스템을 Spring Boot의 Spring Security + JWT 기반으로 변환하는 과정을 다룹니다.

 

Laravel의 인증 방식 (Auth, Middleware) vs Spring Boot의 인증 방식 (Spring Security, JWT)

Spring Boot에서 JWT 기반 인증 시스템 구축

사용자 로그인 & 토큰 발급, 검증 구현

사용자 권한(Role) 관리 적용

2. Laravel과 Spring Boot의 인증 방식 비교

비교 항목Laravel (PHP)Spring Boot (Java)

인증 방식 세션 기반 Auth 또는 JWT Spring Security + JWT
미들웨어 사용 auth 미들웨어 @PreAuthorize, SecurityFilterChain
비밀번호 해싱 Hash::make() BCryptPasswordEncoder
JWT 지원 tymon/jwt-auth 패키지 사용 jjwt 라이브러리 사용

변환 전략

Laravel의 auth 미들웨어를 Spring Boot의 @PreAuthorize로 변환

Laravel의 JWTAuth를 Spring Boot의 JJWT 라이브러리로 대체

Laravel의 Hash::make()를 Spring Boot의 BCryptPasswordEncoder로 변경

3. 사용자 엔티티 변환 (Eloquent User 모델 → JPA Entity)

 

🔹 Laravel의 User 모델

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable {
    protected $fillable = ['name', 'email', 'password'];
}

🔹 Spring Boot의 User 엔티티 변환

import jakarta.persistence.*;
import lombok.*;

@Entity
@Table(name = "users")
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    private String password;
}

변환 전략

protected $fillable = [...] → JPA 필드 정의

extends Authenticatable 제거 (Spring Security가 관리)

4. 비밀번호 해싱 (Laravel Hash::make() → Spring Boot BCrypt)

 

Laravel에서는 비밀번호를 Hash::make()로 암호화합니다.

 

🔹 Laravel의 비밀번호 암호화 방식

use Illuminate\Support\Facades\Hash;

$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => Hash::make('password')
]);

Spring Boot에서는 BCryptPasswordEncoder를 사용합니다.

 

🔹 Spring Boot의 비밀번호 암호화 방식

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode("password");

변환 전략

Laravel의 Hash::make()를 Spring Boot의 BCryptPasswordEncoder로 변환

5. JWT 기반 로그인 & 토큰 발급 구현

 

Laravel에서는 tymon/jwt-auth 패키지를 활용하여 JWT를 발급합니다.

 

🔹 Laravel의 JWT 로그인 API

use Tymon\JWTAuth\Facades\JWTAuth;
use Illuminate\Http\Request;

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]);
}

Spring Boot에서는 JJWT 라이브러리를 사용하여 JWT 토큰을 생성합니다.

 

🔹 Spring Boot의 JWT 로그인 API 구현

 

(1) 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();
    }
}

(2) 로그인 API (토큰 발급)

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        String token = jwtUtil.generateToken(user.getEmail());
        return ResponseEntity.ok(new AuthResponse(token));
    }
}

변환 전략

Laravel의 JWTAuth::attempt()를 Spring Boot의 JwtUtil.generateToken()으로 변환

Laravel의 응답 방식(response()->json())을 Spring Boot의 ResponseEntity.ok()로 변환

6. Spring Security 적용 (미들웨어 대체)

 

Laravel에서는 auth 미들웨어를 사용하여 인증이 필요한 API를 보호합니다.

 

🔹 Laravel의 미들웨어 적용 방식

Route::middleware(['auth'])->get('/users', [UserController::class, 'index']);

Spring Boot에서는 @PreAuthorize 어노테이션을 사용하여 보안을 설정합니다.

 

🔹 Spring Boot의 인증 적용 (@PreAuthorize)

@PreAuthorize("hasRole('USER')")
@GetMapping("/users")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}

변환 전략

Laravel의 auth 미들웨어 → Spring Boot의 @PreAuthorize 적용

7. JWT 토큰 검증 (Spring Security 필터 적용)

 

JWT를 통한 인증을 Spring Boot의 Security Filter로 구현할 수 있습니다.

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class JwtFilter extends OncePerRequestFilter {
    
    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            String email = jwtUtil.extractEmail(token.substring(7));
            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(email, null, null);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        chain.doFilter(request, response);
    }
}

변환 전략

Laravel의 JWTAuth::parseToken()을 Spring Boot의 JwtFilter로 변환

8. 결론

✅ Laravel의 인증(Auth, JWT)을 Spring Security + JWT로 변환하는 방법 설명

✅ 사용자 로그인, 토큰 발급, 토큰 검증, 미들웨어 변환 적용

다음 글에서는 “Spring Boot에서 사용자 권한(Role) 관리”를 다룰 예정!

반응형