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) 관리”를 다룰 예정!
'SpringBoot from Laravel' 카테고리의 다른 글
Spring Boot에서 API 보안 강화: Laravel과 비교한 JWT + OAuth2 적용 (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 |
라우팅 & 컨트롤러 변환: Laravel → Spring Boot (0) | 2025.02.07 |
데이터베이스 변환: Laravel Eloquent → Spring Boot JPA (Hibernate) (0) | 2025.02.07 |
Laravel > Spring Boot 전환 전체 프로세스 (0) | 2025.02.07 |
왜 Laravel에서 Spring Boot로 전환하는가? (0) | 2025.02.07 |