PHP 5.5+의 미래 보장형 공식 bcrypt 비밀번호 해싱/솔팅 구현을 사용하여 기본적으로 작동하고 자동 설치 프로그램과 함께 제공되는 매우 간단한 프레임워크 뼈대 내의 간단한 사용자 인증 솔루션입니다. 아이디어부터 첫 번째 프로토타입 적용까지의 시간을 획기적으로 단축해 주는 몇 가지 멋진 기능입니다. 더 이상은 없습니다. 이 프로젝트는 하드코어 단순성에 중점을 두고 있습니다. 모든 것이 가능한 한 간단하며 소규모 프로젝트, 일반적인 대행사 작업 및 빠른 초안을 위해 만들어졌습니다. 최신 프레임워크의 모든 기능을 갖춘 대규모 기업 애플리케이션을 구축하려면 Laravel, Symfony 또는 Yii를 살펴보세요. 하지만 제대로 작동하는 무언가를 빠르게 만들고 싶다면 이 스크립트가 흥미로울 수 있습니다.
HUGE의 가능한 단순한 아키텍처는 놀랍게도 의도적으로 프로그래밍의 기본으로 돌아가 절차적 프로그래밍, 정적 클래스, 매우 간단한 구성, 완전히 DRY가 아닌 구조를 사용하는 대규모 애플리케이션에 대한 여러 컨퍼런스 강연, 슬라이드 및 기사에서 영감을 받았습니다. 코드 등을 매우 쉽게 읽을 수 있도록 유지하면서 (StackOverflow, Wikipedia, SoundCloud).
이 맥락에서 흥미로운 전문 용어로는 KISS, YAGNI, Feature Creep, 최소 실행 가능 제품이 있습니다.
이 프로젝트를 안정적이고 안전하며 깨끗하고 최소한으로 유지하기 위해 HUGE의 개발을 최소한으로 줄이기로 결정했습니다. 걱정하지 마십시오. 이것은 실제로 좋은 것입니다. 새로운 기능은 일반적으로 새로운 버그, 많은 테스트, 수정, 비호환성을 의미하며 일부 사람들에게는 하드코어 업데이트 스트레스를 의미합니다. HUGE는 보안에 중요한 스크립트이므로 새로운 기능은 안정적이고 안전한 코어만큼 중요하지 않으므로 사람들이 이를 사용합니다. 이는 다음을 의미합니다.
그리고 솔직히 말해서, 흔치 않은 여가 시간에 무료로 프레임워크를 유지하는 것도 제가 영구적으로 하고 싶은 일이 아닙니다. :)
마지막으로 약간의 참고 사항: PHP 세계는 극적으로 발전했습니다. 우리는 훌륭한 기능을 갖춘 뛰어난 프레임워크와 대규모 전문 팀, 잘 작성된 문서 및 대규모 커뮤니티를 보유하고 있으므로 다른 프레임워크에 많은 작업을 투입할 이유가 없습니다. 대신, 널리 사용되는 프레임워크에 전념하세요. 그러면 귀하의 작업이 훨씬 더 많은 영향을 미치고 훨씬 더 많은 사람들이 사용할 것입니다!
이 프로젝트 주변의 모든 분들께 감사드립니다. 즐거운 시간 보내세요! XOXO, 크리스
2010/2011년에는 PHP 세계에는 적어도 비전문가에게는 유용한 로그인 솔루션이 없었습니다. 그래서 저는 모든 젊은 개발자가 저지르는 최악의 실수를 저질렀습니다. 보안 기본 사항에 대해 전혀 모르고 혼자서 뭔가를 만들려고 하는 것입니다. 더 나쁜 점은 웹이 사용자 인증 시스템 구축에 대한 완전히 망가진 튜토리얼로 가득 차 있다는 것입니다. 심지어 세계 최대 기업들도 이것을 완전히 잘못했습니다(여기서는 SONY, LinkedIn 및 Adobe에 대해 이야기하고 있습니다). 또한 모든 대형 프로그래밍 언어(!)의 많은 주요 프레임워크는 완전히 오래되고 안전하지 않은 비밀번호 저장 기술을 사용했습니다.
그러나 2012년에 보안 전문가 Anthony Ferrara는 PHP 5.3 및 5.4에서 매우 안전하고 현대적이며 정확한 비밀번호 해싱을 허용하는 작은 PHP 라이브러리를 게시했습니다. 모든 개발자는 보안 내부에 대한 지식 없이 스트레스 없이 사용할 수 있습니다. 이 스크립트는 너무 훌륭해서 PHP 5.5의 핵심으로 작성되었으며 요즘 사실상의 표준이 되었습니다.
이것이 나왔을 때 나는 이 네이키드 라이브러리를 사용하여 여러 개인 및 상업용 프로젝트에 대해 완전히 작동하는 즉시 사용 가능한 로그인 시스템을 구축하고 코드를 GitHub에 넣으려고 했습니다. 많은 사람들이 이것이 유용하다고 생각하고 프로젝트에 기여하고 버그를 수정했으며 포크를 더 작고 더 큰 버전으로 만들었습니다. 그 결과가 바로 이 프로젝트입니다.
참고: 2015년 현재 대부분의 주요 프레임워크에는 기본적으로 뛰어난 사용자 인증 논리가 내장되어 있습니다. 몇 년 전에는 그렇지 않았습니다. 따라서 오늘날의 관점에서 보면 심각한 프로젝트에는 Laravel, Yii 또는 Symfony를 선택하는 것이 더 현명할 수 있습니다. 하지만 자유롭게 HUGE를 사용해 보세요. 자동 설치 프로그램이 아무런 구성 없이 몇 분 안에 완벽하게 작동하는 설치를 시작합니다.
그리고 왜 이름이 "HUGE"입니까? 나의 다른 오래된 프로젝트 중 일부인 TINY, MINI 및 MINI2, MINI3과의 멋진 조합입니다. 간단한 웹사이트를 매우 빠르고 간단하게 개발하기 위한 초소형 마이크로 프레임워크입니다.
여기에서 이전 3.0 버전의 라이브 데모를 확인하고 여기에서 서버의 phpinfo()를 확인하세요.
이 프로젝트 뒤에는 많은 작업이 있습니다. 수백, 어쩌면 수천 시간의 작업 시간을 절약할 수 있습니다(개발자 비용으로 계산). 따라서 HUGE를 사용하여 돈을 벌고 있다면 공정하게 오픈 소스에 무언가를 돌려주십시오. HUGE는 개인 및 상업적 용도로 완전히 무료입니다.
DigitalOcean에서 서버를 임대하거나 BuyMeACoffee.com에서 커피를 팁으로 제공하여 프로젝트를 지원하세요. 감사해요! :)
또한 이 프로젝트에 자유롭게 기여해 주세요.
MIT 라이센스를 받았습니다. 개인 또는 상업 프로젝트의 경우 완전히 무료입니다.
객체 지향 프로그래밍과 MVC의 기본 사항을 알고 있는지, 명령줄을 사용할 수 있는지, 이전에 Composer를 사용해 본 적이 있는지 확인하세요. 이 스크립트는 초보자용이 아닙니다.
요, 완전 자동이군요. 왜 ? 나는 물건을 설치하는 방법을 찾으려고 며칠을 보내는 것을 항상 싫어했기 때문입니다. 이렇게 하면 많은 시간과 노력을 절약할 수 있습니다. 마음에 들면 커피를 기부하세요.
개발을 위해 Vagrant를 사용하고 있다면 간단히
vagrant box add ubuntu/trusty64
vagrant up
수행하십시오.5분 후에는 Ubuntu 14.04 LTS 내에 완전히 설치된 거대한 버전을 갖게 될 것입니다. 전체 코드는 현재 폴더와 자동으로 동기화됩니다. MySQL 루트 비밀번호와 PHPMyAdmin 루트 비밀번호는 12345678 로 설정됩니다. 기본적으로 192.168.33.111은 새 상자의 IP입니다.
신선하고 일반적인 Ubuntu 14.04 LTS 서버에 매우 간단하게 설치:
설치 프로그램 스크립트 다운로드
wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.sh
실행 가능하게 만드세요
chmod +x bootstrap.sh
실행하세요! 모든 작업을 수행하는 데 몇 분 정도 시간을 주세요. 네, 나중에 감사 인사를 전하셔도 됩니다 :)
sudo ./bootstrap.sh
Composer install
실행하여 종속 항목을 설치합니다."이메일이 작동하지 않습니다" ? 아래 문제 해결을 참조하세요. TODO
이것은 개발 환경을 쉽게 설정하기 위한 빠른 지침일 뿐입니다!
Apache, PHP 5.5+ 및 MySQL이 설치되어 있는지 확인하십시오. 여기에 튜토리얼이 있습니다. Nginx도 확실히 작동하지만 아직 설치 지침이 없습니다.
vhost를 편집하여 깨끗한 URL을 만들고 모든 트래픽을 프로젝트의 /public 폴더로 라우팅합니다.
sudo nano /etc/apache2/sites-available/000-default.conf
파일을 다음과 같이 만드십시오.
<VirtualHost *:80>
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
mod_rewrite를 활성화하고 아파치를 다시 시작하십시오.
sudo a2enmod rewrite
service apache2 restart
컬(git을 사용하는 데 필요), openssl(github은 https 전용이므로 GitHub에서 복제해야 함), PHP GD, 그래픽 lib(보안 문자 및 아바타 생성) 및 git을 설치합니다.
sudo apt-get -y install curl
sudo apt-get -y install php5-curl
sudo apt-get -y install openssl
sudo apt-get -y install php5-gd
sudo apt-get -y install git
git clone 거대
sudo git clone https://github.com/panique/huge " /var/www/html "
작곡가 설치
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
프로젝트 폴더로 이동하여 Composer 패키지를 로드합니다(--dev는 선택 사항입니다. 거래 내용을 알고 계실 것입니다)
cd /var/www/html
composer install --dev
SQL 문을 실행합니다. 예를 들어 phpmyadmin 또는 명령줄을 통해. 12345678은 예시 비밀번호입니다. 띄어쓰기 없이 작성되었으니 참고하세요.
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/01-create-database.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/02-create-table-users.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/03-create-table-notes.sql "
아바타 폴더를 쓰기 가능하게 만듭니다(경로가 올바른지 확인하세요!)
sudo chown -R www-data " /var/www/html/public/avatars "
이것이 효과가 없다면 대안을 설정하여 어려운 방법을 시도해 볼 수도 있습니다.
sudo chmod 0777 -R " /var/www/html/public/avatars "
Apache의 기본 데모 파일 제거
sudo rm " /var/www/html/index.html "
application/config/config.development.php에서 애플리케이션 구성을 편집하고 데이터베이스 자격 증명을 입력하세요.
마지막 부분(첫 번째 테스트에는 필요하지 않음): 동일한 파일에 SMTP 자격 증명을 설정하고 EMAIL_USE_SMTP를 true로 설정하면 적절한 이메일을 보낼 수 있습니다. 메일 전송에는 SMTP를 사용하는 것이 좋습니다! PHP의 mail()을 통한 기본 전송은 거의 모든 경우에 작동하지 않습니다(스팸 차단). 저는 SMTP2GO를 사용합니다.
그런 다음 서버의 IP/도메인을 확인하세요. 모든 것이 잘 작동할 것입니다.
이것은 테스트되지 않은 NGINX 설정입니다. 문제가 있는 경우 티켓에 의견을 남겨주세요.
server {
# your listening port
listen 80;
# your server name
server_name example.com;
# your path to access log files
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
# your root
root /srv/www/example.com/public_html;
# huge
index index.php;
# huge
location / {
try_files $uri /index.php?url=$uri&$args;
}
# your PHP config
location ~ .php$ {
try_files $uri = 401;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
이 훌륭한 설정을 위해 razuro에게 큰 감사를 드립니다. 이것을 루트 폴더에 넣되 공용 폴더에는 web.config를 넣지 마십시오.
<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="public/index.php?url={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
여기에서 원본 티켓을 찾으세요.
기본적으로 일반 사용자와 관리자라는 두 명의 데모 사용자가 있습니다. 이에 대한 자세한 내용은 이 추가 정보에 있는 작은 문서 블록의 사용자 역할 부분을 참조하세요.
일반 사용자: 사용자 이름은 demo2
, 비밀번호는 12345678
입니다. 사용자가 이미 활성화되었습니다. 관리자(다른 사용자를 삭제하고 정지할 수 있음): 사용자 이름은 demo
, 비밀번호는 12345678
입니다. 사용자가 이미 활성화되었습니다.
프로젝트의 루트 폴더에는 짜증스러울 수 있는 여러 파일이 있습니다.
README 와 CHANGELOG는 스스로 설명합니다.
실제 문서가 제작 중입니다. 그때까지 코드를 살펴보고 IDE의 코드 완성 기능을 사용하여 작동 방식에 대한 아이디어를 얻으십시오. 컨트롤러 파일, 모델 파일 및 뷰 파일에 데이터가 표시되는 방식을 살펴보면 매우 분명합니다. 아직 문서가 없다는 점은 유감입니다. 하지만 시간이 거의 없고 우리는 자유 시간에 이 작업을 무료로 수행하고 있습니다. :)
현재 사용자에는 일반 사용자와 관리자의 두 가지 유형이 있습니다. 똑같은 것도 있지만...
관리자는 다른 사용자를 삭제하고 일시 중지할 수 있으며 탐색에 "관리자" 버튼이 추가로 표시됩니다. 관리자는 데이터베이스 테이블 필드 user_account_type
내에서 값 7
갖습니다. 그들은 자신의 계정을 업그레이드하거나 다운그레이드할 수 없습니다(이것은 말이 되지 않습니다).
일반 사용자에게는 관리자 기능이 없습니다. 하지만 계정을 업그레이드하거나 다운그레이드할 수 있습니다(/user/changeUserRole을 통해 사용해 보세요). 이는 기본적으로 기본 사용자/프리미엄 사용자 개념을 매우 간단하게 구현한 것입니다. 일반 사용자는 데이터베이스 테이블 필드 user_account_type
내에 1
또는 2
의 값을 갖습니다. 기본적으로 새로 등록된 모든 사용자는 확실히 사용자 역할 1을 가진 일반 사용자입니다.
자세한 내용은 이 추가 정보의 "데모 사용자를 사용한 테스트" 섹션을 참조하세요.
사용자 역할과 사용자 권한을 추가하는 매우 흥미로운 끌어오기 요청도 있는데, 이는 너무 고급이고 복잡하기 때문에 프로젝트에 통합되지 않습니다. 그러나 이것이 바로 당신에게 필요한 것일 수도 있습니다. 자유롭게 시도해 보십시오.
CSRF 공격을 방지하기 위해 HUGE는 사용자가 중요한 양식을 제출할 때 보안 토큰을 사용하는 가장 일반적인 방식으로 이를 수행합니다. 즉, PHP가 사용자를 위한 양식을 렌더링할 때 응용 프로그램은 Csrf::makeToken()(application/core/Csrf.php)을 통해 생성된 "임의의 문자열"을 양식 내부에 숨겨진 입력 필드로 넣습니다. 또한 이 토큰을 세션에 저장합니다. 양식이 제출되면 애플리케이션은 POST 요청에 세션 내부에 있는 양식 토큰이 정확히 포함되어 있는지 확인합니다.
이 CSRF 방지 기능은 현재 로그인 양식 프로세스( application/view/login/index.php 참조) 및 사용자 이름 변경 양식 프로세스( application/view/user/editUsername.php 참조)에 구현되어 있으며 대부분의 다른 양식은 보안이 아닙니다. 중요하며 가능한 한 단순하게 유지되어야 합니다.
따라서 일반 양식으로 이 작업을 수행하려면 다음과 같이 하면 됩니다. 양식에서 제출 버튼 앞에 다음을 입력하세요. <input type="hidden" name="csrf_token" value="<?= Csrf::makeToken(); ?>" />
그런 다음 컨트롤러 작업에서 다음을 수행하여 양식과 함께 제출된 CSRF 토큰을 검증합니다.
// check if csrf token is valid
if (!Csrf::isTokenValid()) {
LoginModel::logout();
Redirect::home();
exit();
}
이를 구현해 준 OmarElGabry에게 큰 감사를 드립니다!
이론적으로는 그렇습니다. 하지만 이 기능은 테스트에서 작동하지 않았습니다. 외부 기능이므로 자세한 내용은 해당 티켓을 살펴보시기 바랍니다.
멋진 사람들이 만든 몇 가지 멋진 기능이나 기능 아이디어가 있지만 이러한 기능은 너무 특별해서 HUGE의 기본 버전에 들어갈 수 없습니다. 관심이 있다면 다음 티켓을 살펴보세요.
이 프로젝트의 아이디어는 완벽하고 안정적으로 작동하는 전체 사용자 인증 시스템을 갖춘 매우 간단한 베어본 애플리케이션을 제공하는 것이었습니다. 이 스크립트의 보안 관련 특성이 높기 때문에 모든 변경 사항은 많은 작업, 많은 테스트, 엣지 케이스 포착 등을 의미하며 결국에는 새로운 기능을 테스트하고 수정하거나 기존 기능이 중단되는 새로운 기능을 수정하는 데 90%의 시간을 보냈습니다. 그리고 이 일을 하는 것은 정말 누구도 드문 자유시간에 무료로 하고 싶어하는 일이 아닙니다 :)
프로젝트를 안정적이고 깨끗하며 유지 관리 가능하게 유지하기 위해 이 프로젝트의 "소프트 엔드 오브 라이프(soft-End of Life)"를 친절하게 발표합니다. 이는 다음을 의미합니다.
A. HUGE는 앞으로 새로운 기능을 추가하지 않을 것이지만 ... B. 버그 수정 및 수정은 아마도 수년 동안 이루어질 것입니다.
HUGE가 개발되는 동안 나(그리고 아마도 다른 사람들)가 최소한의, 깨끗하고 작동하는 코드를 작성하는 데 도움이 되는 3가지 주요 규칙이 있었습니다. 당신에게도 유용할 수 있습니다:
이 README의 서문에서 언급했듯이 멋진 것을 개발할 때 도움이 될 수 있는 몇 가지 강력한 개념(KISS, YAGNI, 기능 크리프, 최소 실행 가능 제품)도 있습니다.
우리 모두의 불필요한 작업을 피하기 위해 이미 존재하는 기능만 필요한 간단한 프로젝트에는 HUGE를 사용하는 것이 좋습니다. RESTful 아키텍처, 마이그레이션, 라우팅, 2FA 등이 정말로 필요한 경우에는 더 쉽고 깨끗하며 단순히 Laravel, Symfony 또는 Zend를 사용하는 것이 더 빠릅니다.
그러나 많은 티켓에서 가져온 커뮤니티에서 제안하는 가능한 기능은 다음과 같습니다. 프로젝트의 포크에 자유롭게 구현해 보세요.
이 프로젝트에는 v1과 v2에 대한 두 개의(!) 지원 포럼이 있었고(HUGE는 v3입니다), 둘 다 Readme 및/또는 설치 지침도 읽지 않은 사람들에 의해 파손되었습니다. 가장 많이 묻는 질문은 유용한 정보(코드나 서버 설정, 사용된 버전 등)를 제공하지 않은 채 "스크립트가 작동하지 않습니다. 도움을 주세요."였습니다. 내가 이 글을 쓰고 있는 동안 누군가 트위터를 통해 "Composer 없이 설치하는 방법"에 대해 질문했습니다. 무슨 말인지 알잖아요 :) - 사람들이 지침을 읽었거나, 스스로 최소한의 조사를 했거나, 일을 불필요하게 복잡하게 만들지 않았다면 질문의 99%는 필요하지 않았습니다. 그리고 자세한 답변을 작성할 때에도 대부분의 사람들은 여전히 답변을 엉망으로 만들어 폭언과 불만을 불러일으켰습니다(무료 소프트웨어에 대한 무료 지원!). 매일 이 문제를 처리하는 것은 정말 실망스러운 일이었습니다. 특히 사람들이 모든 "도움말" 요청에 대해 상세하고 무료이며 개인적인 지원을 제공하는 것이 오픈 소스 개발자의 의무 라는 것을 완전히 당연하게 여길 때 더욱 그렇습니다.
그래서 저는 무료 지원을 완전히 중단하기로 결정했습니다. 스크립트 내부의 실제 문제에 대한 심각한 질문이 있는 경우 GitHub 문제 기능을 사용하세요.
가혹한 말이지만, 기본적으로 모든 공개 인터넷 프로젝트는 요즘 매우 이상한 사람들에 의해 괴롭힘, 파손 및 트롤링을 받기 때문에 다음과 같은 간단한 규칙이 필요합니다.
이것은 무급 자원봉사자들이 자유 시간에 작성한 단순한 스크립트라는 점을 존중하십시오. 이것은 $10,000에 구입한 비즈니스 소프트웨어가 아닙니다. 무료 오픈 소스 소프트웨어에 대해 불평(!)할 이유가 없습니다. 요즘 무료 소프트웨어에 대한 태도는 정말 실망스럽습니다. 사람들은 그 뒤에 있는 작업을 깨닫지 못한 채 모든 것을 당연한 것으로 여기며, 심각한 소프트웨어를 완전히 무료로 얻어서 수천 달러를 절약한다는 사실도 있습니다. 마음에 들지 않으면 사용하지 마십시오. 기능을 원한다면 프로세스에 참여해 보세요. 어쩌면 직접 빌드하여 프로젝트에 추가할 수도 있습니다! 친절하고 존중하십시오. 건설적인 비판은 언제나 환영입니다!
때리지 말고, 미워하지 말고, 스팸을 보내지 말고, 파손하지 마십시오. 개인적인 무료 지원을 요청하지 마십시오. 누군가가 귀하를 위해 일해 줄 수 있는지 묻지 마십시오. 질문하기 전에 README를 읽고, 모든 튜토리얼을 따르고, 코드를 다시 확인하고, 스스로 문제를 해결해 보시기 바랍니다.
트롤과 매우 성가신 사람들은 영구적인 금지/차단을 받게 됩니다. GitHub에는 매우 강력한 남용 방지 팀이 있습니다.
개발 브랜치에서만 커밋하세요. 마스터 브랜치에는 항상 안정적인 버전이 포함됩니다.
Scrutinizer(마스터 브랜치), Scrutinizer(개발 브랜치), Code Climate, Codacy, SensioLabs Insight.
공개 오픈 소스 프로젝트에 버그를 게시할 때 발생할 수 있는 결과 때문에 여기에 게시하지 말고 정말 큰 버그를 내 이메일 주소로 보내주시기 바랍니다. 버그가 공격자에게 흥미롭지 않은 경우: 일반적인 GitHub 문제를 자유롭게 생성해 보세요.
여기에서 활성 문제를 확인하세요: https://github.com/panique/huge/issues?state=open
흥미로운 문제: 사용자가 웹사이트를 방문하면 사용자의 브라우저도 하나 이상의(!) 파비콘(다양한 크기)을 요청합니다. 이러한 정적 파일이 없으면 애플리케이션은 각 파일에 대해 404 응답과 404 페이지를 생성하기 시작합니다. 이는 많은 서버 전력을 낭비하고 쓸모가 없으므로 항상 파비콘을 가지고 있는지 확인하거나 Apache/nginx 수준에서 이를 처리하십시오.
HUGE는 view/_templates/header.php 헤드에 빈 이미지를 전송하여 이를 처리하려고 합니다!
티켓 내 추가 정보: 누락된 favicon.ico, 누락된 이미지 등에 대해 적절한 404를 반환합니다.
Stackflow에 대한 추가 정보: favicon.ico 요청을 방지하는 방법은 무엇입니까? 작은 파비콘에 또 다른 HTTP 요청이 필요하다는 것은 어리석은 일이 아닌가요? 파비콘을 스프라이트로 만드는 방법은 무엇입니까?.
저는 Dev Metal 에서도 블로그 활동을 하고 있습니다.