MySQL을 처음 다루거나 새로운 서버에 접속할 때 가장 자주 마주치는 에러가 "MySQL ERROR 1045: Access denied for user" 이다. 에러 메시지는 간단하지만, 정확히 어디서 문제가 발생했는지 파악하기가 쉽지 않아서 많은 사람들이 헷갈려한다. 특히 처음 데이터베이스를 설정할 때나, 권한 설정이 필요한 상황에서 더욱 그렇다. 이번···
PHP 웹사이트를 운영하다 보면 갑자기 서버에서 "PHP Fatal error: Allowed memory size of X bytes exhausted" 라는 에러가 발생하는 경험을 하게 된다. 특히 대용량 파일을 처리하거나 많은 데이터를 조회할 때 더 자주 발생한다. 이 에러가 발생하면 해당 페이지는 완전히 작동 불능 상태가 되기 때문에 사용자 경험도 ···
웹사이트를 운영하다 보면 시간이 지나면서 데이터가 쌓이고, 어느 순간부터 갑자기 페이지 로딩이 느려지는 경험을 하게 된다. 특히 PHP에서 MySQL 쿼리를 실행할 때 어떤 쿼리가 느린지, 왜 느린지 파악하기가 쉽지 않다. 직접 쿼리를 날려보거나 전체 쿼리를 로깅하는 것도 방법이지만 효율적이지 못하다. 이럴 땐 MySQL의 느린 쿼리 로그(Slow Quer···
요즘들어 회사에서 REST API 를 통한 다양한 연동 작업들이 많이 진행되고 있다. 물론 전문화된 API 서버가 있는건 아니고 POST 메서드로 JSON 데이터를 전송하는 수준의 연동 작업을 진행중이다. 솔직히 REST API 작업은 난이도로 보면 쉬운 작업에 속하긴 하는데 API 규격서를 제공해야하는 입장이라면 정말 귀찮은 작업이 될 수 있다. 또한 데···
PHP의 취약점을 검색하면 상당히 많은 검색결과를 볼 수 있다. 하지만 PHP 뿐만 아니라 모든 언어는 취약점이 발생하기 마련이다. 이런걸 보안하여 패치하는게 개발자의 일이기도 하다. 그럼 PHP의 취약점 보완을 위해 버전 업그레이드를 받는다고 해서 취약점이 해결될까? 절대 그럴일이 없다.. 이미 엉망인 소스에다가 PHP 버전을 업그레이드 받는다고 취약점이···
개인 사이트 또는 블로그 운영시 접속로그를 살펴보는건 중요한 부분중 하나다. 사이트 접속 로그를 수시로 살펴보고 어떤 곳에 유입이 많이 되었는지 확인하여 컨텐츠를 구성하는데 도움이 될 수 있다. 하지만 언제나 그렇듯 접속로그를 보다보면 수상한 접속 기록등이 확인될 때가 있다. 보통 개인이 서버로 운영하지 않고 네이버 또는 티스토리와 같은 서비스에서 블로그를···
푸시 서비스중 하나인 FCM HTTP API 방식이 24년 6월에 최종적으로 지원이 종료됨에 따라 회사 앱도 HTTP V1 방식으로 마이그레이션을 해야만 했다. 소식은 지금으로 부터 1년전부터 알고 있었지만 귀찮아서 계속 미루고 있다가 어느덧 6월이 다가와 더이상 미룰 수가 없었다. 하지만 조금이나마 더 미룰 수 있을까하여 살펴보니 기존 HTTP API 방···
요즘들어 사이트 로그를 살펴보면 로봇의 비율이 80%를 넘기는데 이와 더불어 별 이상한 그지 같은 악성 크롤러도 판을 치고 있어서 걱정이 많다. 크롤러라면 최소한 유저에이전트에 정보라도 남겨놓는게 예의 인데 악성 크롤러는 신원같은건 무시한체 긁어가는것에 집중을 하고 있다. 간혹 이런 악성크롤러의 아이피 출처에 대한 상세 정보를 알고싶을때가 있다. 이때 조회···
최근들어 큰 프로젝트들이 많이 겹쳐 블로그 운영을 많이 못했던것같다. 현재 UI도 리뉴얼 구성중에 있긴하나 당분간은 엄두가 나지 않을듯 싶다. 이번에 소개할 내용은 보안토큰을 적용한 간단한 FORM 전송 예제이며 이 방법을 주로 사용하는 목적은 스팸(악성)글을 막기위한 용도로 많이 사용된다. 자세한 방법은 아래 예제 소스를 통해 알아보자. EX) 폼 파일 ···
이번편은 지난번 생년월일 입력 이벤트를 활용하여 카드번호 입력 후 4자리마다 하이픈 또는 공백등의 구분자를 붙여는 스크립트 예제에 대해서 알아보자. 참고로 기본적인 기능들은 앞서 생년월일 입력 이벤트와 유사하며 이를 조금만 활용하면되고 다만 카드 입력의 경우 보안이 중요한 만큼 마스크처리를 추가하였다. 카드번호 입력 후 유효성 체크하여 자동 구분자 넣어주는···
생년월일은 과거 달력에서 선택하는 방식을 많이 채택하였지만 나이가 있으신분들은 한참을 뒤로 가야하는 불편함이 발생되어 요즘은 입력방식을 사용하는편이다. 이번편에서는 간단하게나마 생년월일 입력 후 슬래시(/) 또는 하이픈(-)을 붙여주는 스크립트이다. 본래 이번편에 소개하는 예제는 JS 라이브러리로 제공할 목적이였으나 시간상 여유가 없어 간단하게 입력 후 처···
아파치 웹서버에서 발생되는 Service Unavailable Error 에러는 서비스는 시작되었지만 접근할 수 없는 서버 내부 오류로 검색을 통해서 해결이 안되는 경우가 있다. 주로 검색을 하면 포트를 열어서 해결하라는 식으로 소개가되는데 이러한 방법으로도 끝까지 해결이 안되는 경우가 있다. 물론 포트를 사용가능하게 여는것도 필요하지만 가장 중요한건 서버···
Ratchet 웹 소켓 서버를 실행하면 소켓의 정보만 있다면 로컬에서만 접속가능한 환경이 아닐 경우 TCP URI 정보만 있다면 누구든 클라이언트에서 웹 소켓을 연결하여 접속을 할 수 있게된다. 우리는 이를 사전에 막아 보안강화를 할 필요가 있다. 기본적으로 포트를 막는 방법엔 아래와 같이 두가지 방법이 있다. 1. iptables 를이용하는 방법이 가장 ···
웹 소켓은 ws 와 wss 프로토콜 방식을 제공하는데 이는 일반적인 URI의 HTTP 와 HTTPS와 같이 일반전송과 암호화전송 정도로 이해하면 된다. ws 프로토콜을 이용할경우 일반적인 원문으로 전송이 되기 때문에 중요 데이터를 공격자는 그대로 볼 수 있다. 이는 DB로 본다면 비밀번호 칼럼을 그대로 원문으로 처리한것과 동일하다. 이럴경우 DB가 노출되면···
자바스크립트에서 공식적으로 제공되는 Websocket 객체는 클라이언트 와 서버 간 데이터를 주고 받을 수 있도록 연결 스트림을 만들어 주는 기술로 일반 소켓통신은 서버간 통신였다면 웹 소켓은 클라이언트 to 서버간 통신으로 볼 수 있다. 그렇다고 해서 클라이언트만 이용가능한건 아니며 서버간 통신도 가능하지만 서버간 통신이라면 굳이 복잡한 웹 소켓을 보단 ···
PHP를 통해 웹 소켓을 하기 위해선 소켓 서버가 있어야한다. 당연하게도 우리는 웹 소켓 프로그램을 만들기엔 오랜시간이 걸리고 어쩌면 영영 못만들 수 있다. 그래서 제공되는 라이브러리를 사용해야 하며 라이브러리는 Composer를 통해 쉽게 관리할 수 있다. 우선 들어가기 앞서 Composer 설치가 안되어 있을 경우 진행할 수 없으니 사전에 Compose···
순수 javascript 에서 ajax 통신을 할때 주로 XMLHttpRequest 또는 fetch 를 이용했을 것이다. XMLHttpRequest의 경우 현재도 많이 사용되는 방식이긴 하나 현재까지 와서는 이보다 더 강력한 fetch 함수를 많이 사용하고 있는 편이다. 이번편은 fetch 함수를 이용한 커스텀 비동기 ajax 함수에 대해 알아보도록 하자 ···
JQuery를 이용한 ajax 처리 시 보통 비동기로 처리하지만 동기 처리를 통해 결과값을 받아야하는 경우가 있다. 이때 ajax 옵션에 async:false 를 넣어주면 동기방식으로 처리를 할 수 있기에 자주 사용을 했었는데 특정 기기 환경에서 결과값을 받지 못하는 경우가 발생했다. 처음엔 AJAX 처리시 오류가 발생했나 하여 디버깅을 여러번 해보았지만 ···