목록전체 글 (35)
Log4KJS
OAuth 2.0(RFC 6749)은 2012년에 발행됐다. OAuth 2.1은 그 이후 축적된 보안 모범 사례를 하나의 스펙으로 통합하고, 위험한 패턴을 제거한 버전이다. 새로운 기능은 없다. 2026년 3월 기준 IETF 드래프트(draft-ietf-oauth-v2-1-15) 상태이며, 핵심 요구사항은 안정화됐다. OAuth가 해결하는 문제OAuth는 제3자 애플리케이션이 사용자의 자격증명(아이디/비밀번호)을 직접 받지 않고도, 사용자의 보호된 리소스에 접근할 수 있게 하는 인가(Authorization) 프레임워크다.사용자가 Authorization Server에서 직접 인증하고, Authorization Server가 Client에게 제한된 권한의 Access Token을 발급한다. Client는..
마이크로서비스를 개발하다 보면 두 서비스가 함께 바뀌는 일이 잦을 때가 있다. 그럴 때 흔히 "응집도가 낮다", "결합도가 높다"는 말이 나온다. 맞는 말이다. 그런데 거기서 대화가 멈춘다. 어떤 종류의 결합인지, 어떤 방향으로 풀어야 하는지는 흐릿하다. 이 글에서는 리서치한 내용을 바탕으로 응집도와 결합도의 분류와, 평가하는 방법을 다루도록 한다. 1. Cohesion응집도는 한 모듈 안의 요소들이 얼마나 관련 있는가를 나타낸다. 1960년대 중반 Larry Constantine이 개발하고 1974년 IBM Systems Journal 논문(Stevens, Myers & Constantine)을 통해 널리 알려진 이 개념은 7단계 스펙트럼으로 나뉜다. 아래로 갈수록 좋다. 7단계 — Coinciden..
인증 로직은 어디에 있어야 하는가 마이크로서비스를 설계할 때, 인증은 의외로 애매한 위치에 놓인다. 각 서비스가 직접 JWT를 검증하는 게 자연스러워 보이지만, 서비스 수가 늘어날수록 이상한 일이 벌어진다. 어떤 서비스는 exp를 체크하고, 어떤 서비스는 안 한다. 라이브러리 버전이 제각각이라 한쪽에서 패치한 취약점이 다른 쪽에는 그대로 남아 있다. 새 서비스를 만들 때마다 인증 보일러플레이트를 복사-붙여넣기한다. 이건 인증이 본질적으로 횡단 관심사(cross-cutting concern)이기 때문에 생기는 문제다. 비즈니스 로직과는 무관하지만 모든 서비스에 필요하고, 구현이 조금이라도 다르면 보안 허점이 된다. 로깅이나 트레이싱처럼, 개별 서비스에 흩어져 있으면 관리가 안 되는 종류의 것이다. E..
이번 글에서는 Streaming Systems의 핵심 이론을 Flink DataStream API 코드로 어떻게 구현하는지, 이론과 실무를 연결하는 다리를 놓아보겠습니다.1. What: 무엇을 계산하는가? (Transformation)스트리밍 파이프라인의 가장 기초는 들어오는 데이터에 어떤 연산을 수행할지 정의하는 것입니다. 이는 무한한 데이터 흐름 속에서 개별 레코드를 변환하거나 필터링하는 요소별(Element-wise) 변환과, 여러 레코드를 묶어 의미 있는 값을 도출하는 집계(Aggregation)로 나뉩니다. 스트림 데이터 변환 파이프라인 Flink 구현 예제 (Java):Flink의 DataStream API는 map, filter와 같은 익숙한 함수형 연산자를 제공하여 이러한 변환을 직관적으로..
최근 IT 업계를 강타했던 쿠팡의 대규모 개인정보 유출 사태를 기억하시나요? 이 충격적인 사건의 근본 원인은 허술한 '인증키 관리'에 있었습니다. 퇴사자가 반납하지 않은(혹은 탈취한) HMAC 서명키가 아무런 제지 없이 사용되었고, 회사는 이 키를 장기간 교체(Rotation)하지 않고 방치했습니다. 이는 결국 수천만 명의 정보 유출이라는 참사로 이어졌습니다. 아무리 견고한 성벽을 쌓아도, 성문 열쇠 관리가 허술하면 모든 것이 무용지물인 것입니다. 즉, 보안에서 키 관리는 시스템의 근간입니다.오늘 글에서는 우리 팀이 과거의 레거시 인증 시스템이 가진 구조적 위험성을 인지하고, 어떻게 더 안전하고 유연한 중앙화된 인증 시스템으로 개편했는지 그 여정을 공유하고자 합니다.1. 기존 시스템의 시한폭탄: 분산된 ..
Questions - REPEATABLE READIsolation 이란? 트랜잭션들이 linear 하게 실행했을 때와 같은 결과를 보장하는 것.쉽게 예측하기 힘든 결과를 내거나 SERIALIZABLE 없이는 격리가 깨지는 쿼리 패턴을 소개하려고 함. Question 1. query-1)SELECT * FROM apps WHERE id = '1' --- (1) UPDATE apps SET title = "cuteTitle" WHERE app.id = '1' --- (4) query-2)SELECT * FROM apps WHERE id = '1' --- (2)UPDATE apps SET title = "fancyTitle" WHERE app.id = '1' --- (3)Answer락 경합 이후 한쪽은 co..
Bucket 은 auto-failover 와 master-slave 복제 기능을 갖춘 키-밸류 스토리지입니다. 상용 목적이 아닌 분산 시스템을 처음부터 끝까지 손수 작성해보려는 목적에 집중하여 개발해 보았습니다. 네트워크 구성과 리더 선출버킷의 각 노드는 클러스터의 다른 모든 노드와 TCP 커넥션을 맺습니다. 더 정확하게든, 노드는 다른 노드와 in/outbound 총 두개의 커넥션을 가지고 있을 수 있습니다. 버킷의 노드들은 이 커넥션을 통해 heartbeat / vote / requestVote 등 요청과 응답을 주고 받으며 Raft-like 알고리즘을 이용해 단일한 리더를 선출합니다. Raft 가 지원하는 규칙에 따라, bucket 클러스터 역시 과반 이하의 노드 장애를 감내할 수 있습니다. ..
우리가 domain event 를 발행하려고 하는 상황을 가정해봅시다.어떤 Command 가 입력되었을 때, 먼저 엔티티에 부수효과를 만들고 이벤트를 전파해야 하는데요. 가장 단순하게는 레포에 엔티티를 저장하고, Kafka, AMQP, SQS 와 같은 큐에 이벤트를 직접 저장하는 코드를 저장해 볼 수 있을 것입니다. func (i *InstallSvc) InstallApp(req *InstallAppCmd) { installation := &AppInstallation{...} i.repo.save(installation) event := &AppInstallationEvent{...} i.publisher.Pulish(event)} 이 코드의 문제는 부분 실패를 고려하지 않았다는..