새소식

TIL

[TIL] 230605 <Spring> @EnableJpaAuditing, @EnableScheduling, @Scheduled, Refresh Token 자동 관리 및 Spring Security

  • -

 

 

@EnableJpaAuditing 어노테이션 역할 및 사용법

@EnableJpaAuditing 어노테이션은 Spring Data JPA에서 엔티티의 생성 및 수정 날짜를 자동으로 관리하는 기능을 활성화하는 데 사용됩니다.

 

주요 기능

  • 생성 날짜 및 수정 날짜 자동 저장: 엔티티가 생성되거나 업데이트될 때마다 자동으로 created_at 및 updated_at 필드에 현재 날짜와 시간을 저장합니다.
  • 감사 정보 추가: 엔티티 생성자 및 수정자 정보를 추가적으로 저장할 수 있도록 CreatedBy 및 LastModifiedBy 어노테이션을 제공합니다.
  • 커스터마이징 가능: AuditorAware 인터페이스를 구현하여 생성자 및 수정자 정보 추출 방식을 자유롭게 정의할 수 있습니다.

 

사용 방법

1. Spring Data JPA 설정

: @EnableJpaAuditing 어노테이션을 @Configuration 클래스에 추가합니다. 보통 Application 클래스에 추가하는 것이 일반적입니다.

@Configuration
@EnableJpaAuditing
public class JpaConfig {
    // ...
}

 

 

2. 엔티티 클래스 정의:

  • created_at 및 updated_at 필드를 추가합니다. 타입은 LocalDateTime 또는 Instant를 사용하는 것이 좋습니다.
  • @CreatedDate 및 @LastModifiedDate 어노테이션을 각 필드에 추가합니다.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;

    // ...
}
 
  • (선택 사항) CreatedBy 및 LastModifiedBy 어노테이션을 사용하여 생성자 및 수정자 정보를 추가합니다.
  • AuditorAware 인터페이스를 구현하여 생성자 및 수정자 정보 추출 방식을 자유롭게 정의할 수도 있습니다.

 

 

작동 방식

  1. 엔티티가 저장되거나 업데이트될 때 @CreatedDate 및 @LastModifiedDate 어노테이션이 AuditorAware 인터페이스를 통해 현재 날짜와 시간을 가져와 created_at 및 updated_at 필드에 자동으로 저장합니다.
  2. CreatedBy 및 LastModifiedBy 어노테이션이 사용된 경우, AuditorAware 인터페이스를 통해 생성자 및 수정자 정보를 추출하여 해당 필드에 저장합니다.

 

주의할 점

  • @EnableJpaAuditing은 JPA 엔티티만 대상으로 작동합니다.
  • created_at 및 updated_at 필드는 엔티티 클래스에서 직접 선언해야 합니다.
  • AuditorAware 인터페이스를 사용하여 생성자 및 수정자 정보 추출 방식을 자율적으로 정의하려면 별도의 구현이 필요합니다.

 

장점

  • 엔티티 생성 및 수정 날짜를 직접 관리할 필요가 없어 코드 간결성이 향상됩니다.
  • 감사 정보를 쉽게 기록하고 추적할 수 있습니다.
  • 데이터 무결성을 유지하는 데 도움이 됩니다.

단점

  • @EnableJpaAuditing을 사용하면 엔티티 클래스에 created_at 및 updated_at 필드를 추가해야 하며, 이는 데이터베이스 스키마 변경을 필요로 할 수 있습니다.
  • 복잡한 엔티티 계층 구조에서는 AuditorAware 인터페이스를 사용하여 생성자 및 수정자 정보 추출 방식을 정의하는 것이 어려울 수 있습니다.

 

결론

@EnableJpaAuditing 어노테이션은 엔티티의 생성 및 수정 날짜를 자동으로 관리하는 데 유용한 기능을 제공하지만, 사용하기 전에 장점과 단점을 신중하게 고려해야 합니다. 특히, 복잡한 엔티티 모델을 다루는 경우 @EnableJpaAuditing 사용에 따른 추가적인 작업이 필요할 수 있다는 점을 명심해야 합니다.

 

 


 

@EnableScheduling 어노테이션은 토큰 생성 및 사용과 직접적인 관련이 없습니다.

만약 토큰 생성 또는 사용 과정에서 스케줄링 기능을 사용하고 싶다면 @EnableScheduling 어노테이션이 필요할 수 있습니다.

예를 들어:

  • 정기적으로 토큰 만료를 확인하고 새 토큰을 발급하는 작업을 스케줄링하고 싶다면 @EnableScheduling 어노테이션과 @Scheduled 어노테이션을 함께 사용할 수 있습니다.
  • 사용자 로그인 기록을 일정 기간 후에 자동으로 삭제하는 작업을 스케줄링하고 싶다면 @EnableScheduling 어노테이션과 @Scheduled 어노테이션을 함께 사용할 수 있습니다.

결론적으로, 토큰 생성 및 사용은 @EnableScheduling 어노테이션과 독립적인 기능이지만, 특정 상황에서는 함께 사용될 수 있습니다.

 

 


 

Refresh token을 관리하는 데 @Scheduled 어노테이션을 사용하는 것은 필수적인 것은 아닙니다.

하지만 @Scheduled 어노테이션을 사용하면 토큰 만료를 자동으로 확인하고 새 토큰을 발급하는 작업을 스케줄링하는 데 유용합니다.

Refresh token 관리 방법:

  1. 수동 관리:
    • 사용자가 로그인할 때 access token과 함께 refresh token을 발급합니다.
    • 사용자가 API를 사용할 때마다 access token을 헤더에 포함합니다.
    • access token의 유효기간이 지나면 사용자는 refresh token을 사용하여 새 access token을 요청합니다.
    • 서버는 refresh token의 유효성을 검증하고 새 access token을 발급합니다.
  2. 스케줄링을 사용한 자동 관리:
    • @Scheduled 어노테이션을 사용하여 토큰 만료를 정기적으로 확인하는 작업을 스케줄링합니다.
    • 토큰이 만료되면 자동으로 새 토큰을 발급하고 사용자에게 알립니다.

@Scheduled 어노테이션을 사용하는 장점:

  • 편리성: 사용자가 수동으로 토큰을 새로 고쳐야 하는 번거로움을 줄일 수 있습니다.
  • 보안성: 토큰 만료를 자동으로 감지하여 악용될 가능성을 줄일 수 있습니다.
  • 성능 향상: 사용자가 토큰 만료로 인해 API 요청에 실패하는 경우를 줄일 수 있습니다.

@Scheduled 어노테이션을 사용하지 않는 경우:

  • 사용자는 직접 토큰 만료를 확인하고 새로 고쳐야 합니다.
  • 토큰 만료로 인해 API 요청이 실패할 가능성이 높아집니다.
  • 개발자가 토큰 만료 처리 로직을 직접 구현해야 합니다.

따라서, 사용자 편의성, 보안성, 성능 향상을 위해 @Scheduled 어노테이션을 사용하는 것을 권장합니다.

하지만, 시스템의 복잡성이나 개발자의 선호에 따라 수동 관리 방식을 선택할 수도 있습니다.



 


Refresh Token 자동 관리 및 Spring Security

Refresh token 자동 관리Spring Security를 사용하는 것은 필수적인 것은 아닙니다.

하지만 Spring Security는 인증 및 권한 부여 기능을 제공하며, 토큰 관리와 관련된 다음과 같은 여러가지 유용한 기능을 제공합니다.

1. 토큰 저장 및 관리:

  • Spring Security는 OAuth2AuthorizedClientService 인터페이스를 제공하여 Access Token과 Refresh Token을 안전하게 저장하고 관리할 수 있도록 합니다.
  • DefaultOAuth2AuthorizedClientService 구현체는 데이터베이스, 메모리, 파일 시스템 등 다양한 저장소를 지원합니다.

2. 토큰 검증 및 유효성 검사:

  • Spring Security는 OAuth2ResourceServerFilter를 사용하여 요청 헤더 또는 쿼리 파라미터에 포함된 Access Token을 자동으로 검증합니다.
  • Refresh Token을 사용하여 Access Token을 새로 발급하는 기능도 제공합니다.

3. 사용자 세션 관리:

  • Spring Security는 사용자 세션을 관리하고 사용자 권한을 유지하는 데 도움이 됩니다.
  • Refresh Token을 사용하여 만료된 사용자 세션을 자동으로 새로 고칠 수 있습니다.

4. 이벤트 처리:

  • Spring Security는 Access Token 및 Refresh Token의 발급, 만료, 갱신과 같은 이벤트를 처리하는 이벤트 리스너를 제공합니다.
  • 이러한 이벤트를 사용하여 사용자에게 알림을 보내거나 다른 작업을 트리거할 수 있습니다.

5. 커스터마이징 가능:

  • Spring Security는 토큰 관리와 관련된 다양한 구성 옵션을 제공합니다.
  • 필요에 따라 사용자 정의 로직을 추가하거나 기존 동작을 변경할 수 있습니다.

 

따라서, Spring Security를 사용하면 Refresh Token 자동 관리를 보다 쉽고 안전하게 구현할 수 있습니다.

하지만, 이미 다른 인증 및 권한 부여 라이브러리를 사용하고 있거나, Spring Security의 복잡성을 피하고 싶다면 Spring Security를 사용하지 않고 Refresh Token 자동 관리를 직접 구현할 수도 있습니다.

다음은 Spring Security를 사용하지 않고 Refresh Token 자동 관리를 구현하는 방법의 예시입니다.

  1. 자체 토큰 저장소 구현: 데이터베이스, 메모리, 파일 시스템 등을 사용하여 Access Token과 Refresh Token을 저장합니다.
  2. 토큰 검증 및 유효성 검사 로직 구현: 요청 헤더 또는 쿼리 파라미터에 포함된 Access Token을 검증하고 Refresh Token을 사용하여 Access Token을 새로 발급합니다.
  3. 사용자 세션 관리 로직 구현: 사용자 세션을 관리하고 사용자 권한을 유지합니다.
  4. 이벤트 처리 로직 구현: Access Token 및 Refresh Token의 발급, 만료, 갱신과 같은 이벤트를 처리합니다.

Spring Security를 사용하지 않고 Refresh Token 자동 관리를 구현하는 것은 더 많은 작업이 필요하고, 보안 및 유지 관리 측면에서 어려움을 겪을 수 있습니다.

따라서, 가능하다면 Spring Security를 사용하여 Refresh Token 자동 관리를 구현하는 것을 권장합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.