입력 데이터 이스케이프, CSP, HTTPOnly 설정, 브라우저 내장 필터로 XSS 공격에 대응하자. 1. XSS 공격의 위험성 XSS(Cross-Site Scripting) 공격은 웹 애플리케이션의 보안 취약점을 이용하는 공격이다. 이 공격은 웹 애플리케이션의 사용자 인터페이스에 악의적인 스크립트를 주입하여, 다른 사용자들의 브라우저에서 실행되게 만든다. XSS 공격은 주로 웹 환경에서 발생하며, 기본적으로 클라이언트 측에서 발생하는 보안 문제이다. 다시 말해, XSS(Cross-Site Scripting) 공격은 사용자의 중요한 정보, 예를 들어 쿠키나 세션 토큰 같은 개인정보를 위험에 빠뜨릴 수 있는 심각한 보안 위협이다. 공격자들은 이런 방식으로 사용자의 계정에 무단으로 접근할 수 있다. 또한,..
Spring
SQL 인젝션 방어 방법: PreparedStatement 기본 사용부터 MyBatis, JPA 적용까지 SQL 인젝션은 애플리케이션에서 사용자로부터 입력받은 데이터를 적절히 처리하지 않을 때 발생하는 보안 취약점이다. 데이터베이스에 직접적으로 악의적인 SQL 쿼리를 주입하는 이 공격은 시스템의 보안을 심각하게 위협한다. 이를 방어하는 세 가지 방법을 알아보자 1. PreparedStatement 기본 방법 SQL 인젝션 공격의 예시 웹 애플리케이션에서 사용자의 로그인 정보를 확인하는 간단한 SQL 쿼리가 있다고 가정하자. SELECT * FROM users WHERE username = '사용자입력값' AND password = '사용자입력값'; 사용자가 정상적인 값을 입력하는 것이 기대되지만, 공격자..
헥사고날 아키텍처 - 클래스 의존성 주입 및 도메인, 엔티티의 객체 변환 과정 헥사고날 아키텍처를 도입할 때 주의해야 할 점에 대해서 알아보자 우리는 기존에 Spring에서 자주 사용되는 MVC 패턴을 사용하고 있었다. 그런데 팀원 중 한 분이 '헥사고날 아키텍처를 도입해 보는 것은 어떨까?'라는 아이디어를 제안하셨고, 그 아이디어를 함께 탐구하고자 한다. 이 글에서 다룰 내용은 해당 YouTube 영상에서 영감을 받았다. NHN FORWARD 22에서 김민중 개발자님의 '클린 아키텍처 애매한 부분 정해 드립니다' 발표 내용을 참고하여, 우리 프로젝트에 헥사고날 아키텍처를 도입했다. 아래 영상은 헥사고날 아키텍처를 적용하는 시점에 보면 굉장히 유용한 내용이니 꼭 봤으면 좋겠다. 유튜브 링크: https:..
스프링 부트 3 버전에서 p6spy를 적용하는 방법을 알아보자. build.gradle 아래 의존성을 build.gradle에 추가해 준다. // P6spy implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' 그리고 코끼리 모양의 'Load Gradle Changes'를 클릭해 주고 프로젝트를 실행한다. 그리고 쿼리가 실행되는 콘솔을 보면 이렇게 파라미터가 들어가 있다. 이렇게만 해도 사실 파라미터에 무슨 값이 들어가 있는지 확인은 가능하지면 여전히 한눈에 띄진 않는다. 콘솔 출력 형식을 바꾸려면 formatter를 커스텀해서 적용해 주면 된다. P6SpyFormatter 아래는 configure 설정 코드 내용이다. imp..
스프링 배치와 JPA를 활용해 누락된 SNS 이벤트 재발행 SNS 이벤트를 저장하는 이벤트 저장소에서 발행이 누락된 ('published = false') 이벤트를 재발행해주는 배치 작업을 생성해 보자 1. SNS 미발행 이벤트를 스프링 배치로 재발행하는 프로세스 설명 1-1. 이벤트 저장소와 SNS/SQS 메시지 처리 우리 프로젝트는 SNS 이벤트 발행 여부를 추적하는 이벤트 저장소를 갖추고 있다. 이벤트 저장소에 이벤트가 기록된다는 것은 해당 도메인 행위가 성공적으로 완료되었음을 의미한다. 이때, 이벤트의 'published' 속성은 기본적으로 'false'로 설정된다. 프로세스가 원활하게 진행되어 SNS 발행과 SQS 구독이 정상적으로 이루어진 경우, 해당 이벤트는 'published = true..
SNS MessageAttributes를 이용한 분산 시스템 추적용 Trace Id 전달 방법 프로젝트를 진행하면서 기존에 진행하던 방법에 많은 에러사항이 있다는 걸 느끼고 SNS, SQS를 사용하면서 Trace Id를 전달하는 새로운 방식인 MessageAttributes를 적용한 과정을 설명해 보겠다. 기존 로직과 코드에 대해서 상세한 설명은 아래 글에 작성되어 있다. [Spring Boot] 분산 시스템에서의 SNS/SQS 메시지 처리: 단일 책임 원칙과 Zipkin의 Trace ID 에러 핸들링을 중심으로 [Spring Boot] 분산 시스템에서의 SNS/SQS 메시지 처리: 단일 책임 원칙과 Zipkin의 Trace ID 에러 핸들링을 분산 시스템에서의 SNS/SQS 메시지 처리: 단일 책임 원..
스프링 배치에서 chunk와 JPA pageSize 설정의 관계성 배치 코드를 작성하면서 chunk와 JPA setPageSize 개념이 헷갈려 해당 내용을 자세히 정리해 봤다. 1. 스프링 배치의 setPageSize()와 chunk()의 차이점 스프링 배치에서 setPageSize()와 chunk() 설정은 종종 혼동될 수 있는데, 이 둘은 매우 다른 목적으로 사용된다. 1-1. setPageSize() 설정 (JpaPagingItemReader) setPageSize() 메서드는 JpaPagingItemReader를 사용할 때, 데이터베이스에서 한 번에 읽어올 레코드의 수를 설정한다. 이 설정은 데이터베이스와의 상호작용과 메모리 관리에 직접적인 영향을 미친다. 데이터베이스 효율성 측면에서 페이지 크..
스프링 부트 3에서 스프링 배치와 JPA를 사용하여 배치 테이블 자동 생성하기 스프링 부트 3 버전에서 적용되는 스프링 배치 적용 방법에 변경 사항이 있다. 더 자세한 내용은 아래 링크에 작성해 놨다. [Spring Boot] Spring Boot 3.X 버전에서 Spring Batch 적용하기 [Spring Boot] Spring Boot 3.X 버전에서 Spring Batch 적용하기 스프링 부트 3 및 스프링 배치 5의 새로운 기능과 변경사항을 알아보자 1. 공식에 따른 SpringBoot 3에서 스프링 배치의 변경된 점 스프링 부트 3과 함께 출시된 스프링 배치 5는 많은 중요한 인프라 yijoon009.tistory.com 1. 스프링 부트 3에서의 스프링 배치 변경 사항 스프링 부트 3에서는 ..