CSRF(Cross-Site Request Forgery)
·
Spring/Spring Security
1. 서론 – 사용자 브라우저를 이용한 요청 위조웹 애플리케이션은 일반적으로 사용자의 로그인 상태를 유지하기 위해 세션을 사용하며,이 세션 정보는 브라우저에 저장된 쿠키를 통해 서버에 전달된다.이러한 구조에서 발생할 수 있는 위협 중 하나가 바로 CSRF(Cross-Site Request Forgery)이다.CSRF는 공격자가 직접 요청을 보내지 않고, 피해자의 브라우저를 조종해 요청을 보내게 만드는 공격이다.이 장에서는 CSRF의 구조적 본질과 그것이 왜 위험한지,그리고 이를 방어하기 위한 브라우저 보안 정책 및 서버 측 대응 방법을 체계적으로 서술한다.2. 공격 시나리오CSRF의 기본 시나리오는 다음과 같다.사용자가 example.com에 로그인하여 세션이 유지된다.브라우저는 세션 ID가 담긴 쿠키(..
@EnableWebSecurity 란?
·
Spring/Spring Security
Spring Security를 사용하다 보면 가장 먼저 마주치는 어노테이션 중 하나가 바로 @EnableWebSecurity입니다.처음에는 "이거 안 붙이면 왜 작동 안 하지?", "왜 꼭 붙여야 하지?" 같은 의문이 들 수 있습니다.이번 글에서는 이 어노테이션의 역할, 동작 원리, 필요한 이유를 깊이 있게 정리해보겠습니다. @EnableWebSecurity란?@EnableWebSecurity는 Spring Security의 웹 보안 기능을 활성화해주는 어노테이션입니다.Spring Boot 프로젝트에서 이 어노테이션을 사용하면, 우리가 정의한 보안 설정 클래스(SecurityConfig)가 Security 필터 체인에 등록되어 실제 요청에 적용됩니다.@Configuration@EnableWebSecuri..
Spring Security 설정 중 정적 리소스 관련 문제
·
Spring/Spring Security
문제 상황http://localhost:8080 접속 시, 다음과 같은 현상이 나타났습니다.브라우저에는 Whitelabel Error Page 또는 단순한 "HTTP 500 Internal Server Error" 페이지가 출력됨개발자 도구의 Network 탭에선 index.js, index.css, favicon.ico 등 정적 리소스 요청들이 전부 500 에러로 실패Spring Boot 콘솔에는 다음과 같은 예외 로그:org.springframework.web.util.pattern.PatternParseException: No more pattern data allowed after {*...} or ** pattern element 해결 방법private static final Set exclu..
Mockito 인자 매처와 내부 동작
·
Spring/Mockito
Mockito의 인자 매처와 내부 동작 정리1. Mockito에서의 인자 비교 방식Mockito에서 mock 객체의 메서드 호출을 스텁(stub)하거나 검증할 때는메서드 인자를 기준으로 어떤 동작을 할지를 결정합니다.이때 인자를 비교하는 방식에는 2가지가 있습니다:실제 값 비교인자 값을 equals()로 비교given(repo.findByEmail("abc")).willReturn(...)matcher 기반 비교ArgumentMatcher.matches()로 비교given(repo.findByEmail(eq("abc"))).willReturn(...) 2. eq()의 내부 동작동작 과정given(repo.findByEmail(eq("abc"))).willReturn(true);package org.moc..
ACID Isolation(격리성)
·
Spring
트랜잭션의 ACID 속성 중 격리성(Isolation)이란?트랜잭션의 격리성(Isolation)은 동시에 여러 트랜잭션이 수행될 때, 서로의 연산에 영향을 받지 않도록 보장하는 성질을 의미합니다.즉, 하나의 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 해당 데이터에 접근하거나 변경할 수 없습니다.격리성이 보장되지 않을 때 발생할 수 있는 문제점들Dirty Read (더티 리드)다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 현상트랜잭션 A가 수정 중인 데이터를 트랜잭션 B가 읽었는데, 이후 A가 롤백하면 B가 잘못된 데이터를 읽게 됨Non-Repeatable Read (반복 불가능한 읽기)동일한 쿼리를 두 번 실행했을 때, 결과가 다른 현상트랜잭션 A가 특정 데이터를 두 번 읽는 동안, 트랜잭션 B가 ..
N + 1 문제
·
Spring/JPA
JPA에서 N+1 문제란?N+1 문제는 JPA에서 연관된 엔티티를 조회할 때 불필요한 추가 쿼리가 발생하여 성능이 저하되는 현상입니다.N+1: 1개의 조회 쿼리(Parent)와 연관된 N개의 추가 조회 쿼리(Child)가 발생하는 구조를 의미합니다.예를 들어, 부모 엔티티를 조회할 때 연관된 자식 엔티티를 개별적으로 조회하게 되면, 부모 1개 조회 시 자식 N개만큼 추가 쿼리가 발생합니다.발생 예시// Parent 엔티티@Entitypublic class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "..