React2Shell (CVE-2025-55182): RSC 프로토콜 역직렬화 RCE 분석
·
Engineering Notes/Security
분석 대상: React 19.x (Server Components), Next.js 15.x취약점 유형: Deserialization of Untrusted Data / Prototype PollutionCVSS: 10.0 (Critical)1. 개요React 19의 코어 기능인 React Server Components(RSC)가 사용하는 'Flight Protocol' 처리 과정에서 치명적인 원격 코드 실행(RCE) 취약점이 발견되었다. 이 취약점은 단순한 입력값 검증 부재가 아니라, RSC의 'Deep Reference(심층 참조)' 메커니즘과 Javascript의 'Thenable' 처리 루틴이 결합되어 발생하는 구조적 결함이다. 공격자는 인증 없이 특수하게 조작된 JSON 페이로드를 전송함으로써..
제네릭의 핵심 개념과 설계 철학
·
Engineering Notes/Java & Spring
들어가며지난 28일, 자바 정규 수업을 들었다. 제네릭과 관련한 내용이었는데, 제네릭 사용 시 Type Argument를 정확히 일치시켜야 한다고 하더라. 2주라는 짧은 시간 안에 자바를 가르치다 보니 어쩔 수 없는 부분이었겠지만, 아쉽게도 '왜?'는 빠져있었다. 제네릭의 탄생제네릭이 도입되기 이전 시대에서, List와 Map 같은 자바 컬렉션은 모든 종류의 객체를 담을 수 있는 Object 타입으로 설계되었다. Object 클래스는 최상위 클래스로서, 언뜻 보면 유연하지만 그만큼 치명적인 단점을 안고 있었다. 예를 들어 아래와 같은 원시 타입 리스트가 있다고 하자.List items = new ArrayList();items.add("ssafy");items.add(14); 현재 리스트에는 문자열도, ..
동적 배열의 재할당과 힙 오버플로우
·
Engineering Notes/Java & Spring
동적 배열과 재할당자바에서 ArrayList는 대표적인 동적 배열이다. 내부적으로는 일반 배열을 사용하지만, 요소가 추가되거나 제거될 때 필요에 따라 배열의 크기를 자동으로 조절한다. 이러한 특징으로 개발자가 배열의 크기를 정할 필요 없이 유연하게 사용 가능하다는 장점이 있다.내부적으로는 용량 부족을 감지하고 현재 용량보다 더 큰 (일반적으로 1.5배) 배열을 생성해 모든 요소를 복사한다. 이후 새로운 배열을 참조하도록 변경하는 과정을 거친다. ArrayList의 경우, 배열의 인덱스는 int 타입으로 관리된다. int 타입의 최댓값은 2^31 - 1이니, 이론적으로는 약 21억 개의 요소를 가질 수 있다고 판단하기 마땅하다. 그러니 실제로 21억 개의 요소를 담아보자.import java.util.*;..
현대 소프트웨어 아키텍처에 대한 고찰
·
Engineering Notes/Java & Spring
싱글톤 패턴의 출현설계를 하다 보면, 애플리케이션 전반에 걸쳐 유일하게 존재해야 하는 객체가 있다. 싱글톤 패턴은 불필요한 리소스 낭비를 방지할 뿐 아니라, 관리를 용이하게 한다는 점에서 한때 각광받던 디자인 패턴 중 하나다. 어디서든 쉽게 접근해서 쓸 수 있다는 점도 개발자들에게 충분히 매력적으로 느껴졌을 것이다. 마치 전역 변수처럼 편의성을 제공하면서도 최소한의 객체 지향 원칙을 지키는 듯 보였으니 말이다. 하지만 싱글톤 패턴의 가장 고질적인 문제는 강한 결합에 있었다. 싱글톤에 의존하는 클래스들은 싱글톤의 존재를 직접적으로 알게 되고, 이는 곧 테스트를 매우 어렵게 만든다는 말과 같다. 싱글톤의 상태가 전역적으로 공유되기 때문에, 예측 불가능한 사이드 이펙트가 발생하기 쉬웠으며, 병렬 처리 환경에서..
Spring Initializr & Dependencies
·
Engineering Notes/Java & Spring
Spring Initializr는 스프링 프로젝트를 생성할 때 유용한 웹페이지다. 간단한 게시판 기능을 만들기 위해 의존성을 몇 가지 추가하였는데, 어떤 의존성들을 추가했으며 왜 추가했는지 알아보자.Spring WebSpring Web은 RESTful 애플리케이션을 구축하고 Spring MVC를 사용하여 웹 애플리케이션을 개발하는 데 필요한 핵심 기능을 제공한다. 기본적으로 내장된 Tomcat 서버를 포함하고 있어 별도의 웹 서버 설정 없이 바로 실행 가능하다. 가장 먼저 개발할 Comment API는 사용자의 요청(댓글 등록, 댓글 조회 등)을 처리하고 응답(JSON 데이터)을 반환하는 웹 애플리케이션이다. Spring Web은 이러한 웹 요청을 처리하고, 컨트롤러를 통해 비즈니스 로직을 연결하며, 뷰..
이미지, 도커 파일, 도커 컴포즈란 무엇인가
·
Engineering Notes/DevOps & Infra
일반적으로 개발이나 DevOps 맥락에서 '이미지'라고 함은 거의 대부분 '도커 이미지'를 의미한다. (가상 머신 이미지, 디스크 이미지 같은 다른 종류의 이미지도 있긴 함). 아무튼 이미지라는 표현은 도커가 제공하는 환경의 일관성, 재현성, 경량성이라는 핵심 가치를 직관적으로 전달하기 위해 쓴다고 보면 되는데, 무슨 말인지 이해하기 어려우니 풀어서 이야기해 보자. 이미지라는 단어는 시각적인 스냅샷을 연상시킨다. 특정 시점의 파일 시스템과 설정 상태를 그대로 찍어낸 사진이라고 생각하자. 예를 들어 MySQL 도커 이미지라고 할 때, 특정 MySQL 버전과 그 실행에 필요한 모든 파일 및 설정이 고정된 상태로 패키징 된 스냅샷인 것이다. 특정 프로그램을 실행하는 데 필요한 모든 것을 담고 있는 읽기 전용 ..
개인 프로젝트인데 도커 왜 써?
·
Engineering Notes/DevOps & Infra
일단 MySQL은 가장 보편적인 데이터베이스다. 그리고 운영체제에 맞춰 직접 설치해 사용하면 된다. 그럼에도 불구하고 도커를 사용하는 이유는, 그만큼 시스템 환경에 종속되어 다른 개발자와 동일한 환경을 맞추기 어렵기 때문이다. ..라고 지금까지는 얘기해 왔다. 그런데 한 가지 따져볼 게 있다. 그저 평범한 개인 프로젝트에 불과한데, 타 개발자와 공유할 일이 있을까? 있긴 한가? 없다면 왜 쓰지? 사실 도커를 사용하는 이유는 단순히 다른 개발자가 나와 환경을 맞추기 위해서가 아니다. 도커는 오직 나 혼자 개발하더라도, 내가 편하기 위해서 채택하는 것이다. 그리고 그 이유는 환경 관리에 있다. 만약 A 프로젝트는 MySQL 8.0이 필요한데, B 프로젝트는 MySQL 5.7이 필요하다면?만약 C 프로젝트도 ..
Variable Hiding / Shadowing
·
Engineering Notes/Java & Spring
자바 상속과 관련하여과거, 김영한님의 자바 강의를 통해 상속의 개념과 다형성, 메서드 오버라이딩에 대해 학습했다. 비슷한 내용으로 글도 올렸었는데, 이번에 정보처리기사 실기를 벼락치기 하는 과정에서 무언가 착각을해도 단단히 착각했다는 것을 깨달았다. 자바에서는 상속 관계에 있는 클래스들 간에 이름이 같은 멤버가 있을 때, 변수 숨김 또는 메서드 오버라이딩이 동작하게 된다. 내가 착각하고 있던 부분은 변수 또한 메서드 오버라이딩처럼 동작할 거란 막연한 생각이었다. 아래 예시를 보자.public class Main { public static void main(String[] args) { Base a = new Derivate(); Derivate b = new Derivate(); ..