• 개발
  • 24th October 2026
PHP2Shell(CVE-2026-109618·109619) 대응으로 CentOS 7·록키 리눅스·윈도우의 PHP 를 수정판으로 올리기

2026년 10월 21일 PHP가 인증 없이 원격 코드 실행이 되는 취약점 두 건을 고친 긴급 보안 릴리스를 냈다. 공격 체인은 'PHP2Shell'이라는 이름으로 불린다. 웹 요청을 처리하는 PHP는 PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed까지 모두 대상이다. 이 글은 수정판 번호, 그리고 CentOS 7·록키 리눅스·윈도우에서 수정판을 받는 방법을 정리한다. 각 저장소에 수정판 패키지가 실제로 올라와 있는지는 2026년 10월...

Read More
  • 개발
  • 19th October 2026
멱등성 키를 UUID v4 대신 MariaDB UUID_v7() 로 만들기

결제·주문 API에서 같은 요청이 두 번 처리되지 않게 하려고 멱등성 키를 UNIQUE 칼럼에 넣는 경우가 많다. 이 키를 UUID v4로 만들면 값이 완전히 무작위라서, 새 키가 인덱스 끝이 아니라 B-트리 곳곳에 끼어든다. MariaDB 11.7부터는 앞부분에 시각이 들어간 UUID v7을 UUID_v7() 함수 하나로 만들 수 있다. 11.8 LTS에도 들어 있다. 도커로 띄운 MariaDB에서 v4와 v7을 500만 건씩 넣어 비교했다. 쓰는 법 SELECT UUID_v7(); -...

Read More
  • 개발
  • 16th October 2026
검색 폼의 role="search" 를 요소로 바꾸기 — 크롬·사파리 접근성 트리는 같고, 안에 넣으면 문단이 끊긴다

검색창을 감싸는 div role="search"나 form role="search"는 이제 search 요소 하나로 바꿀 수 있다. 2023년 가을에 크롬·파이어폭스·사파리가 모두 지원했고, webstatus.dev 기준으로 2026년 4월 13일에 Baseline Widely available이 됐다. 크롬과 사파리에서 바꾸기 전후의 접근성 트리를 직접 비교했다. 결과는 똑같았고, 바꿀 때 걸리는 함정이 두 가지 있었다. 바꾸는 법 !-- 전 -- form role="search" action="/search" labe...

Read More
  • 개발
  • 14th October 2026
line-height 때문에 생기는 글자 위아래 여백을 text-box: trim-both cap alphabetic 으로 잘라내기 — 한글은 위로 0.1em 넘친다

디자인 시안에서는 버튼 글자 위아래 여백이 12px인데, 화면에 올리면 그보다 훨씬 넓게 뜬다. 카드 맨 위 제목도 카드 테두리에서 시안보다 한참 떨어져 있다. 원인은 line-height다. line-height: 1.6이면 글자 크기의 0.6배만큼이 줄 간격으로 붙는데, 그 절반씩이 글자 위와 아래에 붙는다(반쪽 줄 간격, half-leading). 시안 도구는 보통 글자 모양을 기준으로 간격을 재고, 브라우저는 이 줄 상자를 기준으로 재니 둘이 어긋...

Read More
  • 개발
  • 7th October 2026
PHP 8.5 에서 외부 API 호출의 TLS 연결을 요청 간에 재사용하기 — curl 영구 공유 핸들 실측 (93ms→14ms)

결제 승인, 지도 좌표 변환, 메신저 알림처럼 요청이 들어올 때마다 외부 HTTPS API를 한 번씩 부르는 웹앱이 많다. PHP에서는 이 호출이 매번 처음부터 시작된다. DNS를 찾고, TCP 연결을 맺고, TLS 핸드셰이크를 하고, 그다음에야 요청 한 줄을 보낸다. 응답을 받고 PHP 요청이 끝나면 그 연결은 버려지고, 다음 방문자의 요청은 같은 서버에 같은 과정을 또 거친다. PHP 8.5에 들어온 curl_share_init_persistent()는 이 연결을...

Read More
  • 개발
  • 7th October 2026
견적서 인쇄에 CSS @page 여백 상자로 머리글·쪽 번호 넣기 — 크롬 131 이상에서만 되는 범위와 position: fixed 비교

견적서나 주문서, 증명서처럼 종이로 뽑히는 화면을 만들면 결국 같은 요청이 온다. 페이지마다 위에 회사 이름을 넣어 달라, 아래에 "2 / 5" 같은 쪽 번호를 넣어 달라. 웹 페이지는 원래 쪽이라는 개념이 없어서, 이걸 처리하는 방법은 오랫동안 둘 중 하나였다. 머리글을 position: fixed로 띄워서 인쇄할 때 매 쪽에 반복되게 하거나, 아예 서버에서 PDF 라이브러리로 문서를 만들어 내려주거나. 앞쪽은 쪽 번호를 못 넣고, 뒤...

Read More
  • 개발
  • 7th October 2026
키 순서가 다른 JSON 을 MariaDB 에서 같은 값으로 비교하고 중복 막기 — JSON_EQUALS 와 JSON_NORMALIZE 실측

상품 옵션을 JSON 컬럼에 저장하는 테이블이 있다. 한 상품에 같은 옵션 조합이 두 번 들어가면 안 되니, 저장하기 전에 같은 값이 이미 있는지 찾는다. $attrs = json_encode(['size' = 'M', 'color' = 'red']); $stmt = $pdo-prepare('SELECT id FROM product_option WHERE product_id = ? AND attrs = ?'); $stmt-execute([$productId, $attrs]); 한동안은 잘 돈다. 그러다 관리자 화면에서 옵션 순서를 바꿔 저장하는 기능이 ...

Read More
  • 개발
  • 4th October 2026
페이지마다 레이아웃이 좌우로 밀릴 때 html 에 scrollbar-gutter: stable 로 스크롤바 자리 미리 잡기

본문이 짧은 페이지에서 긴 페이지로 넘어가면 가운데 정렬된 레이아웃 전체가 왼쪽으로 몇 픽셀 밀린다. 다시 짧은 페이지로 가면 오른쪽으로 돌아온다. 메뉴를 오갈 때마다 로고와 본문이 좌우로 흔들린다. 모달을 열 때도 같은 일이 생긴다. 배경 스크롤을 막으려고 overflow: hidden을 걸면 스크롤바가 사라지고, 그만큼 페이지가 오른쪽으로 튄다. 원인은 같다. 세로 스크롤바가 화면 폭을 차지했다가 내놓기 때문이다. scrol...

Read More
  • 개발
  • 4th October 2026
#:~:text= 링크로 페이지 속 문장까지 이동·강조하기 — 한글은 조사까지 맞춰야 하고, 강조색은 ::target-text 로 바꾼다

긴 안내 페이지나 약관, 문서 링크를 보내면서 "세 번째 단락 중간쯤 보세요"라고 덧붙인 적이 있을 것이다. 받는 사람은 페이지를 열고 스크롤을 내리면서 그 문장을 찾아야 한다. 단락마다 id가 달려 있으면 #id로 보낼 수 있지만, 남이 만든 페이지에는 그런 게 없는 경우가 대부분이다. 주소 끝에 #:~:text=찾을말을 붙이면 이 문제가 풀린다. 브라우저가 페이지를 연 뒤 그 문장을 찾아 화면 가운데로 스크롤하고 강조 표시까...

Read More
  • 개발
  • 4th October 2026
문자열 상태값을 PHP backed enum 으로 바꾸기 — 오타·잘못된 DB 값·== 비교에서 달라지는 동작 실측

주문 상태를 문자열로 들고 다니는 코드는 흔하다. DB 컬럼에는 pending, paid, shipped, cancelled가 들어 있고, 코드에서는 상수로 묶어 비교한다. final class Status { const PENDING = 'pending'; const PAID = 'paid'; const SHIPPED = 'shipped'; const CANCELLED = 'cancelled'; } function canShip(string $status): bool { return $status === Status::PAID; } 상수를 만들어 두어도 함수가 받는 것은 그냥 string이다. ...

Read More