UsernamePasswordAuthenticationFilter를 이용한 JWT구현(1)
·
Spring
개발자 유미님의  JWT 코드를 인용하여 작성한 글입니다.필터를 이용하여 JWT를 구현하는 이유JWT 인증 로직을 단순히 LoginService에 구현하는 것은 보안을 고려하면 적절하지 않다. 그 이유는 이러한 구현 방식에서는 로그인되지 않은 사용자의 요청이 스프링 컨테이너 내부까지 들어오게 되기 때문이다. 인증되지 않은 사용자의 요청은 잠재적으로 악의적인 의도를 가지고 있을 수 있다. 따라서 이러한 요청들이 비즈니스 로직이 처리되는 스프링 컨테이너까지 도달하기 전에 검증하고 필요한 경우 차단하는 것이 보안상 바람직하다. 이러한 보안 요구사항을 충족하기 위해서는 스프링 컨테이너 진입 전에 요청을 처리할 수 있는 필터를 도입하는 것이 필요하다. 이에 Spring Security의 인증 방식을 커스텀 하여 ..
Statement와 PreparedStatement
·
Databases
StatementStatement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE id = 1"); Statement는 JDBC에서 제공하는 가장 기본적인 쿼리 실행 방식이다. 이는 데이터베이스에 SQL 문을 전달하고 실행하는 단순한 인터페이스를 제공한다. Statement를 사용할 때마다 데이터베이스는 SQL 문을 파싱하고, 컴파일하여 실행 계획을 생성한다. 이러한 과정은 매 실행마다 반복되며, 불필요한 작업이다. Statement의 실행 과정은 크게 네 단계로 나눌 수 있다.SQL 문장이 데이터베이스 서버로 전송데이터베이스 서버는 받은 SQL 문장을 파싱하여 문법적 오류를 검사실..
Clustered Index, Non Clustered Index
·
Databases
데이터베이스에서 인덱스는 데이터를 빠르게 찾기 위한 핵심 기능이다. 책의 목차나 색인과 같은 역할을 하며, 원하는 데이터를 빠르게 찾을 수 있게 도와준다. 인덱스는 크게 클러스터드 인덱스와 넌클러스터드 인덱스로 나뉜다. 클러스터드 인덱스CREATE TABLE users ( id INT PRIMARY KEY, -- 자동으로 클러스터드 인덱스 name VARCHAR(50)); 클러스터드 인덱스는 데이터를 물리적으로 정렬하여 저장하는 방식이다. 여기서 '클러스터드(Clustered)'란 '군집화된', '모여있는'이라는 의미로, 실제 데이터가 인덱스 순서대로 물리적으로 함께 모여있다는 것을 뜻한다. 이는 마치 도서관의 책들이 도서번호 순서대로 실제로 정렬되어 있는 것과 같은 개념이다. 실제 디스크에..
트랜잭션 격리수준
·
Databases
데이터베이스에서 트랜잭션 격리 수준은 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 중요한 설정이다. 격리 수준에는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE가 있다.  READ UNCOMMITTED 가장 낮은 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있다. 이로 인해 Dirty Read가 발생할 수 있으며, 데이터 정합성에 심각한 문제가 생길 수 있다. 하지만 동시처리 성능은 가장 좋다. set transaction isolation level READ COMMITTED;create table read_uncommit(a..
데이터베이스 동시성 제어: MVCC
·
Databases
MVCCMVCC는 데이터베이스에서 동시성을 제어하는 주요 방식 중 하나로, 데이터의 여러 버전을 유지하면서 읽기 작업과 쓰기 작업이 서로를 차단하지 않도록 하는 기법이다. 전통적인 잠금 기반의 동시성 제어와 달리, MVCC는 각 트랜잭션이 데이터의 특정 시점 스냅샷을 보게 함으로써 더 높은 동시성을 제공한다. 즉, MVCC의 핵심 원리는 데이터를 수정할 때 새로운 버전을 생성하는 것이다.   Redo데이터베이스에서 발생하는 변경 작업을 기록하는데 사용변경 작업이 수행될 때마다 Redo 로그 버퍼에 기록되고, 일정 크기나 시간에 도달하면 디스크에 영구 저장데이터 복구시에 사용Undo트랜잭션의 롤백을 지원하고, 일관성 및 격리 수준을 유지하기 위해 사용된다.트랜잭션 실행 도중 변경된 데이터는 Undo 세그먼..
데이터베이스 동시성 제어: 2PL
·
Databases
Two-Phase Locking (2PL)  2PL은 트랜잭션의 Lock 연산을 두 단계로 나누어 관리하는 프로토콜이다. 첫 번째 단계인 Growing Phase(확장)에서는 Lock을 획득만 할 수 있고 해제는 불가능하며, 두 번째 단계인 Shrinking Phase(수축)에서는 Lock을 해제만 할 수 있고 획득은 불가능하다.  이러한 2PL은 직렬성(Serializability)을 보장하는 대표적인 동시성 제어 기법이다.  A 계좌에서 B 계좌로 100만원을 이체하는 상황을 가정 스키마CREATE TABLE accounts ( account_id VARCHAR(10) PRIMARY KEY, account_holder VARCHAR(50) NOT NULL, balance DECIMAL..
수직적 탐색 수평적 탐색
·
Databases
데이터베이스 시스템에서 인덱스 탐색은 수직적(Vertical) 탐색과 수평적(Horizontal) 탐색이라는 두 가지 핵심 메커니즘을 기반으로 동작한다. 이 두 방식은 주로 B+tree 구조에서 상호 보완적으로 작용하여 효율적인 데이터 접근을 가능하게 한다.  수직적 탐색 수직적 탐색은 루트 노드에서 시작하여 브랜치 노드를 거쳐 리프 노드까지 하향식으로 진행되며, 각 계층에서의 키 값 비교를 통해 탐색 범위를 점진적으로 축소시킨다. 이때 상위 노드들의 키 값은 순수한 라우팅 용도로만 사용되며, 실제 데이터와의 직접적인 연관성은 없다. 수평적 탐색 수평적 탐색은 B+tree의 리프 레벨에서 발생하는 선형적 탐색 방식이다. 리프 노드들은 양방향 연결 리스트 형태로 구성되어 있어, 순차적인 데이터 접근이 가능..
스프링 시큐리티 필터 동작 원리
·
Spring
스프링 시큐리티 필터 동작 원리  서블릿 컨테이너(예: Tomcat)는 클라이언트로부터 HTTP 요청을 받으면 가장 먼저 해당 요청의 URI를 분석한다. 이 URI를 기반으로 서블릿 컨테이너는 해당 요청에 적용해야 할 필터들을 결정하고 FilterChain 객체를 생성한다. 필터 체인이 실행되면, 첫 번째 필터부터 순차적으로 실행된다. 각 필터는 chain.doFilter() 메서드를 호출하여 다음 필터로 요청을 전달하며, 모든 필터의 처리가 완료되면 최종적으로 서블릿에게 요청이 전달된다. 서블릿 서블릿은 Java를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램이다. 클라이언트의 요청을 처리하고 그 결과를 반환하는 자바 웹 프로그래밍 기술이다. 서블릿 컨테이너 서블릿 컨테이너는 서블릿의 생명..