JPA 인증/인가

이규정·2025년 3월 11일
0

1. JPA를 이용한 인증/인가 개요


JPA(Java Persistence API)와 JWT(Json Web Token)를 활용한 인증 및 인가 방식은 세션 기반 인증(Session-Based Authentication) 대신 토큰 기반 인증(Token-Based Authentication)을 활용하는 방식임.
이를 통해 무상태(Stateless) 서버 아키텍처를 구현할 수 있으며, REST API 및 마이크로서비스 환경에서 많이 사용됨.

무상태(Stateless)란?

  • 서버가 클라이언트의 세션 상태를 저장하지 않는 구조를 의미함.
  • 각 요청(Request)은 독립적이며, 이전 요청의 정보를 기억하지 않음.
  • JWT와 같은 토큰 기반 인증(Token-Based Authentication)이 사용되며, 사용자의 인증 정보는 요청마다 포함됨.
  • 확장성이 뛰어나며, 다중 서버(로드 밸런싱) 환경에서 효율적임.

2. JWT(Json Web Token) 개념


JWT는 사용자 인증 정보를 포함한 JSON 데이터를 암호화한 토큰으로, HTTP 요청의 Authorization 헤더에 포함하여 사용됨.

JWT 구조

JWT는 Header, Payload, Signature의 세 부분으로 구성됨.

{
  "alg": "HS256",
  "typ": "JWT"
}.
{
  "sub": "user123",
  "iat": 1712345678,
  "exp": 1712349278,
  "roles": ["USER"]
}.
SIGNATURE
  • Header: 토큰 타입(JWT)과 서명 알고리즘(예: HS256, RS256 등)이 포함됨.
  • Payload: 사용자 정보 (sub), 발급 시간(iat), 만료 시간(exp), 권한(roles) 등의 정보 포함.
  • Signature: 서버에서 비밀 키를 사용하여 생성한 서명으로 토큰의 무결성을 보장함.

3. JPA 기반 인증(Authorization) 과정


1. 사용자 인증 (Login) 과정

  1. 클라이언트가 ID/PW를 입력하여 로그인 요청을 보냄.
  2. 서버는 JPA를 사용하여 데이터베이스에서 사용자를 조회하고 인증 검증을 수행함.
  3. 인증이 성공하면 JWT Access Token을 생성하여 클라이언트에게 반환함.
  4. 클라이언트는 이후 요청에서 Authorization: Bearer <JWT> 헤더를 사용하여 API에 접근함.

2. Access Token 검증 및 인가(Authorization) 과정

  1. 사용자가 API 요청 시 JWT를 포함하여 서버로 전송함.
  2. 서버는 JWT의 서명을 검증하고 만료 시간을 확인함.
  3. 검증이 완료되면 사용자의 권한(Role)을 확인하고 요청을 처리함.

4. JPA와 JWT 인증 구현


1. 사용자 엔티티(User Entity) 정의

@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;
}

2. JWT 토큰 생성 및 검증

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

3. JWT 필터 적용 (Spring Security 연동)

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

5. 결론


개념설명
JPA 인증/인가JPA와 Spring Security를 활용한 사용자 인증 및 권한 관리
JWT 기반 인증Stateless 인증 방식으로 API 요청 시 토큰을 이용한 인증 수행
JWT 구조Header, Payload, Signature로 구성되어 있으며 사용자 정보와 권한을 포함
Access Token & Refresh TokenAccess Token 만료 시 Refresh Token을 활용해 인증 연장
무상태(Stateless) 서버서버가 사용자 세션을 저장하지 않고, 각 요청이 독립적으로 처리되는 방식
profile
반갑습니다. 백엔드 개발자가 되기 위해 노력중입니다.

0개의 댓글

관련 채용 정보