이 글에서는 JWT(Json Web Token) 기반 인증 시스템에서 발생할 수 있는 리프레시 토큰 탈취 문제를 해결하기 위한 실질적인 방법을 제시합니다.탈취된 토큰이 악용되는 상황을 방지하고, 리프레시 토큰 로테이션과 플랫폼별 고유 토큰 관리를 통해 보안을 강화합니다. 프로젝트 환경 요약Spring Boot 3.3.4Java 21JJWT 라이브러리 버전 0.12.3Redis를 활용한 리프레시 토큰 관리Spring Security 의존성 설정JWT와 Redis를 사용하기 위해 다음과 같은 의존성을 추가합니다.dependencies { // JWT implementation("io.jsonwebtoken:jjwt-api:0.12.3") implementation("io.jsonwebto..
백엔드/Spring
Spring Batch에서 PostgreSQL Upsert 처리하기기존 프로젝트에서는 Spring Batch의 Chunk 방식을 사용하여 데이터를 처리해왔으나, 새로운 요구사항에 따라 데이터가 이미 존재할 때는 업데이트하고, 존재하지 않을 때는 삽입하는 Upsert 작업이 필요해졌습니다. Chunk 방식은 주로 대용량 데이터를 처리하고 데이터 변환이 필요한 경우에 적합하지만, 특정 로직(Upsert)에 맞춰 단일 작업을 수행하는 데는 Tasklet 방식이 더 유리하기 때문에 Tasklet 방식으로 전환하여 Upsert를 구현하게 되었습니다. Upsert 란?데이터베이스에 존재하지 않는 경우 삽입하고, 존재하는 경우 업데이트하는 방식입니다. 기존 Chunk 방식 @JobScope @Bean ..
스프링 부트 테스트 실행 시 업로드 된 파일도 롤백 시점 사라질까?? 스프링 부트 테스트는 @Transactional 을 테스트 케이스에 선언 시 테스트 완료 후 항상 롤백을 하여, 다음 테스트에 영향을 주지 않는다. (물론 rollback false 지정하는 설정이 있음) 하지만 테스트 실행시 생성된 파일은 데이터 롤백 이후에도 그대로 남아있다. 파일 업로드 후 업로드된 파일을 삭제하는 테스트 코드를 작성해보자 먼저 아래를 보면 파일 업로드 테스트를 위한 파일 정보를 저장하는 엔티티가 있다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "attach_file") public class AttachFile..
파일 업로드 기능을 통해 전달받은 파일 객체를 다루기 위해서는 VO 클래스 내에 MultipartFile 타입 변수와 Getter/Setter 정의 필수 태그의 ‘name’ 속성과 동일한 변수명을 사용해야함 가상 업로드 경로에 대한 실제 업로드 경로 알아내기 @PostMapping(value = "/BoardWritePro.bo") public String writePro(@ModelAttribute BoardVO board, Model model, HttpSession session) { // 주의! 파일 업로드 기능을 통해 전달받은 파일 객체를 다루기 위해서는 // BoardVO 클래스 내에 MultipartFile 타입 변수와 Getter/Setter 정의 필수! // => input type="f..
스프링 프레임워크란? 자바 플랫폼을 구현하기 위한 오픈 소스 프레임워크 프레임워크(Framework)? 프로그램을 구현하는데 필요한 라이브러리(클래스) 및 개발 방식의 모음 다양한 어플리케이션을 개발하기 위해 필요한 코드들의 자동화가 많이 이루어짐 동적 웹사이트 개발을 위한 서비스 제공(JSP 가 없어도 동적 서비스 구현 가능) 스프링 프레임워크에서 동적 웹 구현 시에도 MVC(Spring MVC) 사용 기존 동적 웹 어플리케이션을 스프링으로 구현 시 훨씬 압축된 코드를 사용하여 간편하게 구현 가능 단, 압축된 코드 사용을 위한 준비 작업(설정)이 많음 대한민국 정보 관련 프로젝트를 진행하는 기업 등에서 주로 사용하는 ‘전자정부 표준 프레임워크’ 의 기반이 되는 프레임워크 스프링 프레임워크 사용방법 이클..
Spring의 파라미터 처리방식과 포워딩 방식을 공부하며 요약 정리 @Controller public class TestController {} "main" 이라는 서블릿 주소 요청 시 자동으로 호출되는 requestMain() 메서드 정의 @RequestMapping 어노테이션을 사용하여 GET 방식의 "main" 서블릿 주소 요청 받아 처리 @RequestMapping(value = "main", method = RequestMethod.GET) public String requestMain() { return "main"; // "/WEB-INF/views/main.jsp" 페이지로 이동하도록 요청 } "push" 서블릿 주소 요청 시 자동으로 호출되는 push() 메서드 정의 => 파라미터 : 없..