이미지 업로드만으로 끝나지 않는다! PHP로 다양한 이미지 처리 기능을 구현해보세요.
안녕하세요! 웹 개발을 하다 보면 사용자로부터 이미지를 업로드받고, 그 이미지를 원하는 사이즈로 줄이거나 워터마크를 삽입해야 할 일이 정말 자주 생깁니다. 저도 처음엔 단순히 파일을 서버에 저장만 했는데, 실제 서비스에서는 썸네일 생성, 이미지 최적화, 보안 필터링까지 고려해야 하더라고요. PHP는 기본 GD 라이브러리나 ImageMagick 같은 툴을 이용해 이미지 처리를 간단하게 할 수 있어요. 이번 글에서는 파일 업로드에서부터 이미지 리사이징, 텍스트/로고 워터마크 삽입까지 이미지 처리의 모든 과정을 실습 중심으로 알려드릴게요.
목차
1. 이미지 업로드 기본 처리
PHP에서 이미지를 업로드하려면 HTML의 <form>
과 enctype="multipart/form-data"
속성, 그리고 서버 측에서는 $_FILES
배열을 사용합니다.
<form method="post" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit">업로드</button>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
move_uploaded_file($_FILES["image"]["tmp_name"], $target_file);
echo "업로드 성공: " . htmlspecialchars($target_file);
}
?>
이 코드는 기본적인 파일 업로드 기능만 수행하므로, 실제 서비스에서는 확장자 검사, 용량 제한 등 보안 요소를 꼭 추가해야 합니다.
2. 확장자 및 용량 유효성 검사
이미지 외의 악성 파일 업로드를 방지하기 위해 확장자와 MIME 타입 체크는 필수입니다. 또한 서버 자원을 보호하기 위해 업로드 용량 제한도 설정해주어야 해요.
검사 항목 | 설명 |
---|---|
파일 확장자 | jpg, png, gif 외 거부 |
MIME 타입 | image/jpeg 등 실제 콘텐츠 유형 확인 |
파일 크기 제한 | 예: 2MB 이하 |
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
$fileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
$mimeType = mime_content_type($_FILES["image"]["tmp_name"]);
if (!in_array(strtolower($fileType), $allowed) || !str_starts_with($mimeType, 'image/')) {
die("이미지 파일만 업로드할 수 있습니다.");
}
if ($_FILES["image"]["size"] > 2 * 1024 * 1024) {
die("파일 용량은 2MB 이하로 제한됩니다.");
}
3. GD를 활용한 썸네일 생성
PHP의 GD 라이브러리를 활용하면 업로드된 이미지를 다양한 크기로 리사이징하여 썸네일을 만들 수 있어요. 게시판 리스트, 갤러리 등에서 유용하게 사용됩니다.
- 원본 이미지 불러오기 (
imagecreatefromjpeg
등) imagecopyresampled()
로 크기 축소imagejpeg()
또는imagepng()
로 저장
$src = imagecreatefromjpeg('uploads/sample.jpg');
$thumb = imagecreatetruecolor(150, 150);
imagecopyresampled($thumb, $src, 0, 0, 0, 0, 150, 150, imagesx($src), imagesy($src));
imagejpeg($thumb, 'uploads/thumb_sample.jpg');
4. 워터마크(텍스트/로고) 삽입
무단 복제를 방지하거나 저작권을 표시하기 위해 이미지에 워터마크를 삽입하는 경우가 많습니다. PHP GD로는 텍스트 워터마크와 이미지 워터마크 모두 가능합니다.
// 텍스트 워터마크
$img = imagecreatefromjpeg('uploads/sample.jpg');
$color = imagecolorallocate($img, 255, 255, 255);
imagettftext($img, 14, 0, 10, 30, $color, './NanumGothic.ttf', '© mysite.com');
imagejpeg($img, 'uploads/watermarked.jpg');
폰트 파일(.ttf)이 필요하며, 서버에 설치되어 있어야 합니다. 또는 이미지 워터마크는 아래처럼 로고 파일을 오버레이 방식으로 삽입할 수 있어요.
// 이미지 워터마크
$base = imagecreatefromjpeg('uploads/sample.jpg');
$wm = imagecreatefrompng('logo/watermark.png');
$wm_width = imagesx($wm);
$wm_height = imagesy($wm);
imagecopy($base, $wm, imagesx($base) - $wm_width - 10, imagesy($base) - $wm_height - 10, 0, 0, $wm_width, $wm_height);
imagejpeg($base, 'uploads/watermarked_logo.jpg');
5. 이미지 업로드 보안 팁
이미지 업로드 기능은 해커의 주요 공격 대상입니다. 아래 보안 수칙들을 반드시 지켜야 안전하게 서비스를 운영할 수 있어요.
보안 항목 | 설명 |
---|---|
파일 확장자 제한 | php, exe 등의 실행 파일 업로드 차단 |
파일 이름 무작위화 | 사용자 업로드 파일명은 hash 등으로 변경 |
실행 권한 제거 | 저장 디렉토리에 .htaccess로 실행 차단 |
MIME 타입 검사 | 이미지 외 파일을 막기 위해 필수 |
6. 추천 라이브러리 및 실전 활용
복잡한 GD 함수 대신 썸네일, 리사이징, 필터 효과 등을 손쉽게 구현할 수 있는 이미지 처리 라이브러리들이 존재합니다. 아래는 PHP에서 널리 쓰이는 도구들입니다.
- Intervention Image – Laravel에서도 자주 쓰이며 문법이 직관적
- ImageMagick – CLI 또는 PHP 확장으로 다양한 고급 효과 가능
- WideImage – GD 기반의 유틸리티성 이미지 처리 라이브러리
- Spatie Image – 최적화 및 자동 크롭 등 지원
이 도구들은 GD보다 강력한 기능을 제공하며, 파일 포맷 변환, 자동 압축, 필터링 등을 쉽게 할 수 있어요. 실전 프로젝트에선 반드시 검토해보시길 추천합니다!
네, 대부분의 PHP 배포판에는 GD가 기본으로 설치되어 있습니다. 단, 일부 서버 환경에서는 별도로 활성화가 필요할 수 있어요.
덮어쓰기 위험이 있습니다. 이를 방지하려면 파일명에 time()
또는 uniqid()
같은 함수를 활용해 고유한 이름을 생성해야 해요.
가능합니다! imagesx()
와 imagesy()
함수로 이미지 크기를 구한 뒤, 중앙 좌표를 계산해 imagecopy()
또는 imagettftext()
에 적용하면 돼요.
imagejpeg()
함수의 두 번째 인수에 0~100 사이의 품질 값을 넣어 조절할 수 있어요. 일반적으로 75~85 정도가 균형 좋습니다.
보안을 위해 업로드 디렉토리는 웹 루트 외부나 별도 폴더에 두고, .htaccess로 실행 차단을 설정하세요. 업로드 위치는 PHP에서 상대경로 또는 절대경로로 지정할 수 있습니다.
이미지 업로드 기능을 처음 만들었을 때, 저도 단순히 move_uploaded_file()
하나만으로 끝났다고 생각했어요. 하지만 운영 환경에선 생각보다 훨씬 더 많은 처리가 필요하더라고요. 썸네일 생성, 워터마크 삽입, 해커가 심어둔 php파일 탐지, 이미지 품질 최적화까지… 정말 작은 기능 하나가 꽤나 많은 책임을 지고 있더라고요. 특히 GD를 다뤄보면서 이미지 크기 줄이는 로직을 처음 만들었을 때는 마치 그래픽 프로그래머가 된 기분이었어요. 😂 지금 이 글을 보고 계신다면, 직접 작은 프로젝트라도 하나 만들어보세요. 게시판에 프로필 이미지 넣는 것부터 시작해도 좋습니다. 경험은 최고의 선생님이니까요!
'💻 쇼핑몰 자동화 & 웹 개발 가이드' 카테고리의 다른 글
[PHP 입문] PDF 생성 및 다운로드 완전 정리 (11) | 2025.04.22 |
---|---|
[PHP 입문] 엑셀 파일 처리: 읽기, 쓰기, 업로드까지 (9) | 2025.04.21 |
[PHP 입문] PHP 이메일 발송 마스터 가이드 (14) | 2025.04.17 |
[PHP 입문] CRUD 게시판 만들기 입문 가이드 (26) | 2025.04.16 |
[PHP 입문] MySQL 연동 기초: 데이터베이스 첫걸음 (36) | 2025.04.15 |