[java] JHipster와 JWT

소개

JHipster는 Java 개발자를 위한 자바 웹 애플리케이션 개발 플랫폼입니다. JHipster를 사용하면 Spring Boot와 Angular/React/Vue.js를 기반으로 한 멋진 애플리케이션을 손쉽게 만들 수 있습니다.

JWT(토큰 기반 인증)는 애플리케이션 인증에 많이 사용되는 방법 중 하나입니다. JWT는 클라이언트와 서버 간의 통신을 안전하게 유지하며 세션 상태를 관리하는 데 사용됩니다.

이 블로그 포스트에서는 JHipster에서 JWT를 사용하는 방법에 대해 알아보겠습니다.

JHipster에서 JWT 사용하기

  1. JHipster 생성하기

먼저 JHipster를 설치하고 기본 애플리케이션 구조를 생성해야 합니다. 다음 명령어를 사용하여 JHipster 애플리케이션을 생성합니다.

jhipster
  1. JWT 종속성 추가하기

생성된 프로젝트 폴더에서 pom.xml 파일을 열고 다음 종속성을 추가합니다.

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.2</version>
</dependency>
  1. JWT 구성하기

이제 JWT를 구성해야 합니다. SecurityConfiguration.java 파일을 열고 다음 구성을 추가합니다.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.Authentication;

...

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
    private static final String SECRET_KEY = "your-secret-key";
    
    protected void configure(HttpSecurity http) throws Exception {
        // JWT 필터 추가
        http.addFilterBefore(new JWTFilter(), UsernamePasswordAuthenticationFilter.class);
        
        ...
    }
    
    // JWT 생성
    private static String generateToken(Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + 86400000);
        
        return Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }
}

위 코드에서 your-secret-key 부분은 사용자 정의 비밀 키로 대체해야 합니다.

  1. 인증 컨트롤러 구성하기

JWT 인증을 처리하기 위해 컨트롤러를 구성해야 합니다.

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

    @PostMapping("/login")
    public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {
        Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())
        );

        SecurityContextHolder.getContext().setAuthentication(authentication);

        String token = SecurityConfiguration.generateToken(authentication);
        return ResponseEntity.ok(new JwtAuthenticationResponse(token));
    }
}
  1. JWT 필터 생성하기

마지막으로 JWT 필터를 생성하여 애플리케이션의 모든 요청에 대해 JWT를 검증할 수 있습니다.

public class JWTFilter extends OncePerRequestFilter {
    
    private static final String HEADER_STRING = "Authorization";
    private static final String TOKEN_PREFIX = "Bearer ";

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        String header = request.getHeader(HEADER_STRING);
        
        if (header != null && header.startsWith(TOKEN_PREFIX)) {
            String token = header.replace(TOKEN_PREFIX, "");
            
            // JWT 검증 로직 추가
        }
        
        chain.doFilter(request, response);
    }
}

위 코드에서는 // JWT 검증 로직 추가 부분에 실제 JWT 검증 로직을 작성해야 합니다.

결론

이 블로그 포스트에서는 JHipster와 JWT를 사용하여 애플리케이션 인증을 구현하는 방법을 살펴보았습니다. JHipster와 JWT를 함께 사용하면 빠르고 안전한 애플리케이션을 개발할 수 있습니다.

더 많은 정보를 원한다면 JHipster 공식 웹사이트를 참조하세요.