분류 전체보기
[Spring Security] 인증 상태 영속성
[Spring Security] 인증 상태 영속성
2024.06.10사용자가 인증을 마친 이후 인증을 유지하기 위해 SecurityContextRepository 클래스를 사용한다.인증 정보와 권한은 SecurityContext에 저장되고, SecurityContext는 다시 HttpSession에 저장돼 요청 간 영속이 이루어진다. SpringContextRepository 인터페이스를 구현한 구현체로는 두 가지가 있는데, 그 중 하나가 HttpSession에 인증 상태를 저장하는 역할을 수행한다. 인증을 마친 후 요청할 때는 SecurityCOntextHolderFilter에서 컨텍스트를 로드해 인증 상태가 저장되어있는지 확인한다. public interface SecurityContextRepository { @Deprecated SecurityCon..
[Spring Security] 인증 아키텍처
[Spring Security] 인증 아키텍처
2024.06.08사용자가 요청하면 서블릿 필터인 DelegatingFilterProxy가 요청을 받아 스프링 필터 쪽으로 요청을 넘긴다. AuthenticationFilter는 Authentication 객체를 만들어 AuthenticationManager에게 넘겨준다. Manager는Provider에게 인증을 위임해 사용자의 ID / PASSWORD를 검증시키는데, 이 때 UserDetailsService 객체로 사용자 정보를 가져온다. 인증에 성공했다면 UserDetailService는UserDeatils 타입의 객체를 만들고, 이 객체는 다시 Provider로 올라간 후 Authentication 객체를 만든다. 만들어진 Authentication 객체는 SecurityContextHolder를 통해 Securi..
[SQL Server] 지원하지 않는 TLS 버전 설정
[SQL Server] 지원하지 않는 TLS 버전 설정
2024.06.05jdk17 버전을 사용하면서 SQL Server 2005 데이터베이스와 통신하려 할 때 오류가 발생했다. Caused by: cohttp://m.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" 속성이 "false"(으)로 설정되고 "trustServerCertificate" 속성이 "true"(으)로 설정되었지만 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Server에 대한 보안 연결을 설정할 수 없습니다. 오류: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]. ClientConnection..
[Spring Security] 인증 메커니즘
[Spring Security] 인증 메커니즘
2024.05.30기본적으로 HTTP 기반 form 로그인 인증을 사용한다. @Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .formLogin((form) -> form .loginPage("/login") .loginProcessingUrl("/loginProcess") .defaultSuccessUrl("/", true) .failureUrl("/failed") ..
[Spring Security] 초기화 과정
[Spring Security] 초기화 과정
2024.05.27스프링 시큐리티는 애플리케이션 시작 시 수행되는 초기화 과정에서 인증이나 인가에 관련된 여러 작업을 수행한다. 스프링 시큐리티 의존성을 추가한 후 애플리케이션을 실행하면 의존성으로 내려받은 SpringBootWebSecurityConfiguration 클래스를 통해 초기 설정을 진행한다. @Configuration(proxyBeanMethods = false)@ConditionalOnDefaultWebSecuritystatic class SecurityFilterChainConfiguration { @Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecu..
[Redis] 동시성 제어
[Redis] 동시성 제어
2024.05.25Redis는 캐시 저장소로 사용되지만.. 일단 "데이터베이스" 이니 일관성, 동시성, 신뢰성을 보장하기 위해 트랜잭션을 지원한다. await isolatedClient.watch(itemsKey(attrs.itemId));return isolatedClient .multi() .rPush(bidHistoryKey(attrs.itemId), serialized) .hSet(itemsKey(item.id), { bids:item.bids + 1, price: attrs.amount, highestBidUserId: attrs.userId }) .zAdd(itemsByPriceKey(), { value: item.id, ..
[Redis] 파이프라인과 자료구조
[Redis] 파이프라인과 자료구조
2024.05.15자바, 파이썬, 자바스크립트 등 백엔드를 구축할 때 사용되는 다양한 프로그래밍 언어와 프레임워크 수준에서 Redis를 사용할 수 있도록 지원하는 라이브러리를 제공한다. 자바는 Jedis 라이브러리로 Redis를 사용하는 직관적인 API를 제공하고, 스프링 프레임워크는 Spring Data Redis 라이브러리를 사용해 스프링에서 Redis를 더 쉽게 다룰 수 있다. 이 라이브러리들은 내부적으로 Redis 명령어를 사용해 Redis 서버와 상호작용하니.. Redis의 명령어 구성을 추상화하고 프로그래밍 언어와 프레임워크의 특성에 맞춘 직관적인 API를 제공한다고 생각하면 된다. const cacheRoutes = [ '/about', '/privacy', '/auth/signin', '/auth/..
[Redis] 캐시 서버와 명령어
[Redis] 캐시 서버와 명령어
2024.04.27Redis는 다른 데이터베이스들과 마찬가지로 데이터를 저장하고 쿼리를 통해 데이터를 가져올 수 있는 데이터베이스지만, Redis의 몇 가지 특징 덕분에 다른 데이터베이스들보다 속도가 빠르다. 기본적으로 많은 DBMS는 데이터를 HDD나 SSD에 저장해 데이터의 영속성을 보장한다.반면 Redis는 데이터를 RAM에 저장해 HDD나 SSD에 데이터를 저장할 때 보다 읽기 및 쓰기 작업을 훨씬 빠르게 수행할 수 있다. 이 외에도 다른 DBMS와는 다르게 Redis는 스키마 대신 key-value 쌍으로 데이터를 저장하고 각 key에 대해 여러 자료구조를 선택해서 사용할 수 있는 등 여러 차별화된 특징을 가지고, 이 특징 덕분에 높은 성능을 보장한다. Redis에서는 문자열인 키..
[Database] Database Engine
[Database] Database Engine
2024.04.17기본적으로 데이터를 컴퓨터의 디스크에 안전하게 저장하는 역할을 수행한다. 트랜잭션 관리 / 캐시 관리 / 동시성 제어 / 복구 관리 등.. 디스크 저장과 관련된 전략을 결정하고, B-Tree / B+Tree 등 데이터를 저장할 때 어떤 자료구조를 사용할 지도 결정한다. 디스크 저장과 관련된 모든 작업을 총괄한다고 생각하면 된다. DBMS의 주요한 차이점 중 하나는 DBMS가 사용하는 데이터베이스 엔진의 구현과 특성이다. PostgreSQL, MySQL, Oracle 등 여러 DBMS는 데이터베이스 엔진이 제공하는 데이터 처리 위에서 사용자와 애플리케이션의 요구사항에 맞춘 다양한 기능을 제공한다. (GUI, Session, 스키마, Query...) MyISAM MySQL 및 MySQL의 fork 버전인 ..
[Database] 동시성 처리
[Database] 동시성 처리
2024.04.13Exclusive Lock은 락을 소유한 트랜잭션만 해당 데이터 항목을 읽거나 쓸 수 있고, 다른 트랜잭션들은 그 데이터 항목에 대해 접근을 차단한다. Shared Lock은 여러 트랜잭션이 동시에 같은 데이터 항목을 읽을 수 있도록 허용하지만 해당 데이터 항목이 읽기 작업 중 변경됨을 방지한다. 보통 트랜잭션의 격리 수준으로 간접적으로 락의 동작 방식을 제어할 수 있고, SELECT ... FOR UPDATE / LOCK IN SHARE MODE 구문을 사용해 쿼리 수준에서 명시적으로 락을 요청할 수도 있다. 예약 사이트를 개발하는 경우 이중 예약이 불가능해야 하니.. SELECT ... FOR UPDATE 구문으로 조회 쿼리에서도 명시적으로 Exclusive Lock을 사용하자. 데이터베이스의 동시성..
[Database] Sharding
[Database] Sharding
2024.04.08파티셔닝은 하나의 데이터베이스 서버에서 논리적이나 물리적으로 데이터를 분할해 데이터를 관리하는 방식이다. 반면 샤딩은 데이터를 여러 데이터베이스 서버에 걸쳐 분산시켜 저장하는 방식으로, 각 샤드는 전체 데이터의 부분집합을 가지고 있어 데이터베이스를 수평적으로 확장할 때 유용하다. 샤딩으로 같은 스키마를 가지는 데이터베이스를 여러 서버에 분산시킨 후 각 데이터베이스 서버에 값이 균등하게 저장되도록 하기 위해 Consistent Hashing 기법을 함께 사용한다. 데이터를 분산시키는 기준을 해시 함수가 정하고 해시 값으로 데이터가 저장될 샤드를 결정한다. const HashRing = require("hashring"); const hr = new HashRing(); app.get("/:urlId", a..
[Database] Partitioning
[Database] Partitioning
2024.04.04파티셔닝은 데이터베이스의 데이터를 논리적 또는 물리적으로 분할해서 관리하는 작업을 의미한다. 대량의 데이터가 저장되어있는 테이블에서 조회 쿼리를 실행시켰을 때 파티셔널으로 검색 성능을 향상시킬 수 있다. 1,000,000 개의 데이터가 들어있는 테이블에서 id가 700,001 인 데이터를 조회한다고 생각해보자. 세부적인 내용은 DBMS 설정에 따라 다르겠지만.. id 컬럼에 인덱스가 있으면 인덱스를 사용해서 데이터를 조회하겠고.. 인덱스가 없으면 Full Table Scan을 수행한다. 인덱스가 있든 없든 파티셔닝을 사용하면 성능 향상에 도움이 된다. 1,000,000 개의 데이터를 저장하고 있는 테이블을 파티셔닝을 통해 5의 파티션으로 분할한다. 각 파티션은 데이터의 특정 범위를 담당하게 되고, 이런 ..