Security
-
홈서버 원본 IP 노출 방어와 Nginx Cloudflare 허용 대역 구성
홈서버에서 LLM 스트리밍 API의 버퍼링 문제를 해결하거나 특정 전송 계층의 성능을 확보하기 위해 Cloudflare 프록시를 끄고 DNS Only(회색 구름)로 전환하면, 홈서버의 공인 IP가 외부에 직접 노출된다. 이때 동일한 공인 IP를 공유하는 다른 웹서비스들까지 공격자의 IP 직접 접근에 의해 Cloudflare WAF와 DDoS 보호를 우회당할 수 있는 구조적 취약점이 발생한다. 본 글에서는 원본 IP 노출에 따른 위험성과… Continue reading
-
vLLM API Key 인증 시 기본 노출 경로와 Nginx 접근 제어 설정
vLLM 서빙 엔진을 외부 네트워크에 노출할 때 접근 통제를 위해 –api-key 옵션을 사용하는 것이 기본 보안 설정이다. 그러나 이 옵션을 적용하더라도 모든 HTTP 엔드포인트가 인증으로 보호되는 것은 아니다. 기본적으로 인증 없이 응답을 반환하는 경로가 존재하며, 이를 파악하지 않고 외부에 공개할 경우 시스템 정보가 노출될 수 있다. 본 글에서는 vLLM의 엔드포인트별 인증 적용 현황과 Nginx를 통한… Continue reading
-
JWT vs Opaque 토큰 완전 정리 — 서명, 해시, 세션, Google 인증 구조까지
멀티유저 인증 서버를 설계하다가 “액세스 토큰을 JWT로 할지 opaque(세션형)로 할지” 결정하는 과정에서, 서명·암호화·해시·Google의 실제 토큰 구조까지 파고든 내용을 정리한다. 나중에 다시 헷갈릴 때 이 글부터 다시 읽는다. 1. Opaque 토큰 = 클래식 세션 방식 opaque 토큰은 토큰 문자열 자체엔 아무 정보도 없는 랜덤 문자열이다. 실제 “누구인지, 유효한지, 권한이 뭔지”는 전부 서버 저장소(DB, 세션 스토어)에 있고,… Continue reading
-
Nginx Reverse Proxy 완벽 가이드
Nginx를 사용하면 특정 도메인 경로를 로컬 포트로 연결할 수 있습니다. 예를 들어 http://yourdomain.com/api를 http://localhost:3000으로 연결하는 것이 가능합니다. Nginx 설치 기본 설정 /etc/nginx/sites-available/myapp 파일을 생성합니다: 설정을 활성화합니다: 타임아웃 설정 이해하기 Nginx는 세 가지 주요 타임아웃을 제공합니다: proxy_connect_timeout 백엔드 서버와 연결을 맺는 시간입니다. 이 시간 안에 연결이 안 되면 502 에러가 발생합니다. proxy_send_timeout 백엔드로 요청 데이터를 전송하는… Continue reading
-
브라우저가 자동으로 반응하는 HTTP 상태 코드와 헤더들
웹 개발을 하다 보면 HTTP 상태 코드를 자주 다루게 됩니다. 하지만 이 중 일부는 단순히 정보를 전달하는 것을 넘어서, 브라우저가 특정 동작을 자동으로 실행하도록 만듭니다. 예를 들어 301 Moved Permanently를 받으면 브라우저는 자동으로 새 주소로 이동하고, 401 Unauthorized를 받으면 로그인 팝업을 띄웁니다. 이런 “브라우저의 자동 동작”을 이해하면 더 효율적인 웹 애플리케이션을 만들 수 있습니다. 이… Continue reading
-
프론트엔드-백엔드 분리 환경에서 OAuth 로그인 구현하기
프론트엔드와 백엔드가 분리된 환경에서 구글 OAuth 로그인을 구현하는 방법 전체 아키텍처 구현 단계 1. NextAuth 설정 프론트엔드에서 NextAuth를 사용해 OAuth를 처리하고, 로그인 성공 시 백엔드에 사용자 정보를 전송 2. 백엔드 API 구현 백엔드에서는 OAuth 처리 없이 단순히 사용자 정보를 받아 DB에 저장하고 JWT 토큰을 발급 3. 데이터베이스 스키마 사용자 정보와 OAuth 정보를 저장할 스키마 4.… Continue reading
-
Double CSRF Protection
토큰 + 쿠키 사용하는 방법 특정 웹페이지 접근 토큰 발행 요청 이 경우 토큰이 유효한지 서버에서 정보를 갖고 있어야 함 토큰하고 차이 크게 없음 저장하는 위치가 쿠키일 뿐 토큰은 페이지 떠나면 사라지지만 쿠키는 안 사라짐 CORS 활성 상태면 뚫림 서버에서 토큰이 유효한지 정보 갖고 있을 필요 없음 CORS 활성 상태여도 특정 페이지에 접속해 토큰발행해야 사용… Continue reading
-
JWT와 Refresh Token 운영 방법 상세 정리
토큰 만료 및 갱신 흐름 토큰 저장 위치 저장 위치 장점 단점 Access Token: 메모리 (React State, Zustand, Redux 등) XSS 공격 시 영구 탈취 불가 새로고침 시 초기화 (Refresh로 복구 필요) Refresh Token: httpOnly Cookie JS에서 접근 불가 (XSS 방어) CSRF 방어 필요 (SameSite 설정 필수) Axios 인터셉터를 활용한 Silent Refresh 예시 Continue reading
-
모든 설정 정상인데 fail2ban 동작이 제대로 되지 않는 경우
fail2ban backend 및 systemd journal 연동 정리 1. fail2ban backend 동작 방식 backend=systemd: systemd의 journal에서 로그를 읽음 backend=auto: 환경에 따라 자동으로 backend 선택 (예: pyinotify, gamin, polling, systemd 등) 2. 실제 적용된 backend 확인 방법 명령어 예시 각 jail별로 어떤 backend가 적용됐는지 확인 가능 로그 파일에서 확인 3. systemd journal에 로그 등록 방법 journald 설정… Continue reading
