Backend/SpringBoot 60

[Spring Security] SessionID 관련 주요 필터, 이벤트처리 및 설정

SessionManagementFilter동시 세션 제어 : 동일 계정의 최대 허용 세션 수 초과여부 확인 및 처리세션 보호 : 로그인시 새로운 세션 생성하여 기존 세션 사용 못하도록 함세션 생정시 이벤트 발생 ConcurrentSessionFilter매 요청마다 세션의 만료 여부를 실시간으로 체크하여 중복로그인 등으로 만료된 세션 접근 차단 HttpSessionEventPublisher서블릿 컨테이너(예 : 톰캣) 에서 발생하는 HttpSession 이벤트 감지하여 Spring 이벤트로 변환 하고 발행함Spring 에서는 서블릿 컨테이너 동작을 알 수 없기 때문에 중간에 다리를 놓아주는 게 필요하다.동시세션 제어 기능을 정확하게 동작시키기 위해 반드시 필요.SessionCreationEventSessi..

Backend/SpringBoot 2025.12.17

[Spring Security] CORS 설정

예전에는 프론트엔드 렌더링도 백앤드에서 처리해서 출처가 같았으나, 이제는 프론트, 백앤드가 서로 분리되어 있기 때문에 허용 설정을 해주어야 한다. 브라우저에서 출처가 다르면 block을 하는데, 브라우저에서 프론트엔드 페이지를 띄우는 서버가 다르고, 해당 프론트엔드에서 백엔드로 API 통신을 하여 데이터를 가져오면, 두개의 출처가 다르기 때문에 block을 하는것이다. 때문에 이를 방지하기 위해 서버에서 설정을 통해 프론트엔드와 동일한 출처임을 인식 시키도록 해야 한다.나도 그랬고, CORS 설정이 서버인줄 알았는데 브라우저에서 한다. 즉 모바일 앱 같은 경우에는 따로 설정이 필요 없다는 소리이고, 브라우저를 이용하는 프론트엔드에만 필요한 설정이라는 것이다. 아래는 CORS 설정 예 이다. @Conf..

Backend/SpringBoot 2025.12.16

[Spring Security] CSRF 토큰 사용

만일 쿠키 기반 SessionID 를 이용하여 인증할 경우에는 CSRF 토큰 사용을 하여 보안을 강화해야 한다. 그러나 만일 JWT를 이용하여 header 에 클라이언트가 수동으로 추가 할 경우에는 CSRF 토큰을 사용하지 않아도 되므로 이 페이지는 무시해도 된다. 보안에 관련된 내용은 여기에 있다. (https://dean83.tistory.com/380)이 중 CSRF 토큰 발급을 통해 방어(?) 를 하는 내용에 대해 정리한다. 토큰 발급은 Springboot 에서 최초 요청시 토큰이 없다면 자동 발급 및 저장을 해 둔다. 단, 쿠키를 사용하지 않는 경우에는 별도의 url을 만들어 줘야 하고, 프론트에서 이를 요청해서 가져가야 한다.@GetMapping("/csrf")public CsrfToken..

Backend/SpringBoot 2025.12.16

[Spring Security] MethodSecurity 및 커스텀 핸들러

SecurityFilterChain을 통해 url 에 대한 권한을 설정할 수 있는데, url으로는 권한체크가 어려운경우, 메소드 실행에서도 보안체크가 가능하다. 사용에 있어 한가지 헷갈리는 경우는 보통 id와 연계되어 있는 경우는 인자값으로 받은 id 혹은 token에 있는 id를 이용하여 메소드에서 소유권 확인등이 가능한테 굳이 써야 하는가? 라는 의문이 들었다. 해당 처리 코드들이 중복되거나 누락될 수도 있기 때문에 "선택" 적으로 사용한다고 생각된다. 사용법은 다음과 같다. @EnableMethodSecurity 어노테이션을, SecurityConfig Configuration에 붙여준다.@EnableWebSecurity가 적용된곳에 같이 추가 하면 된다.@PreAuthorize을 필요한 메소드..

Backend/SpringBoot 2025.12.16

[Spring Security] JWT 사용시 Filter 구성 예

JWT를 이용할 경우, 다음의 필터 구성을 한다.JWT 검증 -> 로그인 + JWT 발급 -> 인가 -> 예외처리UsernamePasswordAuthenticationFilter 앞에 JwtAuthenticationFilter 삽입JWT 의 커스텀 필터 예@Componentpublic class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtTokenProvider jwtTokenProvider; public JwtAuthenticationFilter(JwtTokenProvider jwtTokenProvider) { this.jwtTokenProvider = jwtTokenProvider; }..

Backend/SpringBoot 2025.12.15

[Spring Security] 쿠키 및 세션

쿠키 및 세션은 편리하나, 보안위험이 매우 크다. 보안 관련해선 여기를 보면 된다. (https://dean83.tistory.com/380)기본적으로 한계가 있기 때문에 주로 JWT 같은 토큰 기반으로 인증을 한다. 쿠키서버가 사용자의 브라우저에 저장을 요청하는 작은 텍스트 데이터 조각.탈취 될 수 있으므로, 보안 속성 설정이 필수임.Secure 설정을 통해 Https 프로토콜 에서만 쿠키를 전송하도록 강제해야 한다.HttpOnly 설정을 통해 자바스크립트에서 쿠키 접근을 원천 차단 할 수 있다.CSRF 공격 방어를 위해 Strict 옵션을 이용하거나, x-csrf-token 값을 이용할 수 있다. 주 목적은 서버가 클라이언트를 실별 하기 위한 수단임HTTP 통신은 상태를 저장하지 않으므로 사용구조 :..

Backend/SpringBoot 2025.12.12

@SQLRestriction 및 논리 삭제

물리적으로 데이터를 삭제하는것이 아닌 논리적으로 데이터를 삭제 할 경우는 특정컬럼 (예 : deleted) 값을 변경하여 둔다. 비즈니스 로직을 수행하면서 데이터 조회등을 할 때에는 논리 삭제가 된 데이터가 조회되면 안된다. 따라서 Entity 클래스의 어노테이션으로 @SQLRestriction 을 이용하게 되면, 논리삭제된 데이터를 제외하고 처리할 수 있다. 사용예는 다음과 같다. 클래스 어노테이션으로 붙이고, 컬럼값 조건을 넣는다. @SQLRestriction("deleted = false") deleted 가 false 인 데이터들만 조회해 온다 논리 삭제는, @SoftDelete 어노테이션을 이용할 수 있으나, 이 경우 연관관계에 있는 엔티티에서 lazy 로딩을 할 수 없는 문제가 있고,..

Backend/SpringBoot 2025.12.11

Retryable, 낙관적 락 간편 적용하기

https://dean83.tistory.com/318 이곳에 비관적 락, 낙관적 락에 대한 설명이 되어 있다. 낙관적 락의 경우, 개발자가 직접 재시도 코드를 작성해 주어야 했는데, 이번에 Retryable 어노테이션을 알게 되었다. 반복 재시도를 어노테이션 하나로 끝날 수 있게 해준다. 비단 낙관적 락 뿐 아니라 외부 API 연동 등 에서도 사용 할 수 있다. 1. gradle 추가implementation 'org.springframework.retry:spring-retry'implementation 'org.springframework.boot:spring-boot-starter-aop' 2. 설정 활성화@EnableRetry@SpringBootApplicationpublic class Ap..

Backend/SpringBoot 2025.12.09

Flyway 사용하기

DB와 백앤드 서버는 아주 밀접한 연관이 되어 있다. 예전에는 DBA가 따로 있어 주로 DB를 관리해 주었는데.... 이제는 그 역할조차 백앤드에서 밀도있게 담당하는게 일반적인것 같다. 여튼, DB 테이블 생성, 관리 등에 있어서 flyway 는 여러 잇점을 가지고 있고, 많이 쓴다고 한다. 버전 관리도 되고, 히스토리 관리도 되고 등등.. Springboot 4.0.0 버전에서는 내장되어 공식적으로 라이브러리를 제공해주는것 같으나, 3.5.8 버전에서는 그렇지가 못하다. 이 페이지에서는 3.xx 버전에서 사용법을 다루려고 한다. Flyway의 간략한 특징은 다음과 같다. 버전 넘버링 된 sql 파일들을 순차적으로 실행한다.이미 실행한 이력이 있을경우 건너뛴다.이를 위해 테이블에 flyway_sche..

Backend/SpringBoot 2025.12.04

Spring batch + 스케줄링

Spring batch는 대용량의 데이터를 처리할때 사용하는 Spring의 공식 배치 처리 솔루션이다. 예를들어 100만건의 데이터를 읽어 오거나 값을 수정해야 하는 작업을 해야 할 때 매우 유용하게 이용할 수 있다. 또한, 특정 시간대에 주기적으로 스케줄링 하여 동작할때, @Scheduled 와 같이 사용한다. 이 글에서는 Spring boot 3.xx 버전, batch 5.x 버전 기준으로 작성한다. 일단, Gradle에 다음을 추가 한다. dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-batch' ...} Batch를 실행하기전, Batch 관련 DB 에 테이블들이 반드시 존재 해야 한다. ..

Backend/SpringBoot 2025.11.27