JPA(Java Persistence API)와 JWT(Json Web Token)를 활용한 인증 및 인가 방식은 세션 기반 인증(Session-Based Authentication) 대신 토큰 기반 인증(Token-Based Authentication)을 활용하는 방식임.
이를 통해 무상태(Stateless) 서버 아키텍처를 구현할 수 있으며, REST API 및 마이크로서비스 환경에서 많이 사용됨.
JWT는 사용자 인증 정보를 포함한 JSON 데이터를 암호화한 토큰으로, HTTP 요청의 Authorization
헤더에 포함하여 사용됨.
JWT는 Header, Payload, Signature의 세 부분으로 구성됨.
{
"alg": "HS256",
"typ": "JWT"
}.
{
"sub": "user123",
"iat": 1712345678,
"exp": 1712349278,
"roles": ["USER"]
}.
SIGNATURE
sub
), 발급 시간(iat
), 만료 시간(exp
), 권한(roles
) 등의 정보 포함. Authorization: Bearer <JWT>
헤더를 사용하여 API에 접근함. JWT
를 포함하여 서버로 전송함. @Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
@ElementCollection(fetch = FetchType.EAGER)
private List<String> roles;
}
@Component
public class JwtUtil {
private final String SECRET_KEY = "mySecretKey";
public String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.claim("roles", userDetails.getAuthorities())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public Claims validateToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
}
}
public class JwtFilter extends OncePerRequestFilter {
private final JwtUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
String token = authorizationHeader.substring(7);
Claims claims = jwtUtil.validateToken(token);
if (claims != null) {
String username = claims.getSubject();
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, List.of());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
filterChain.doFilter(request, response);
}
}
개념 | 설명 |
---|---|
JPA 인증/인가 | JPA와 Spring Security를 활용한 사용자 인증 및 권한 관리 |
JWT 기반 인증 | Stateless 인증 방식으로 API 요청 시 토큰을 이용한 인증 수행 |
JWT 구조 | Header, Payload, Signature로 구성되어 있으며 사용자 정보와 권한을 포함 |
Access Token & Refresh Token | Access Token 만료 시 Refresh Token을 활용해 인증 연장 |
무상태(Stateless) 서버 | 서버가 사용자 세션을 저장하지 않고, 각 요청이 독립적으로 처리되는 방식 |