next/image, hostname, remotePatterns | 외부 사진만 깨지면?
next/image가 외부 사진만 깨지는 건 경로 오타가 아니라 그 호스트가 images.remotePatterns에 없어 넥스트가 막은 줄입니다. 카카오 CDN 프로필, protocol과 hostname, 프리뷰 재빌드, unoptimized 남용 금지. Next.js, 카카오 로그인, 버셀, 1인 개발자 기준. 2026년 9월 Next.js Image 공식 문서.
설정 파일이 빌드에 안 들어갔거나, 프리뷰만 다른 이미지 호스트를 씁니다. 로컬에선 public 폴더 샘플을 보고, 프리뷰에선 카카오 실프로필 URL을 넣는 식이죠.
버셀 배포 후 설정 변경은 재배포가 필요합니다. next.config.js를 고치고 저장만 한 채 예전 빌드가 서빙되면 같은 차단이 남습니다. 프리뷰 URL을 하드 리프레시해도 서버 설정은 안 바뀝니다.
trailing slash와 OG 이미지 경로가 꼬이면 사진이 아니라 리다이렉트만 받을 수 있습니다. 넥스트가 정적 PNG에 슬래시를 붙이면 일부 크롤러는 이미지를 못 가져갑니다. 화면의 next/image 차단과는 다른 칸이니, 콘솔 메시지에 hostname이 있는지부터 가릅니다.
[ ] 콘솔의 hostname 문자열을 그대로 복사했다
[ ] remotePatterns에 protocol과 hostname을 넣었다
[ ] 설정을 커밋한 뒤 프리뷰를 다시 빌드했다
[ ] 카카오 CDN 서브도메인을 www와 섞지 않았다
[ ] img 태그 우회 전에 허용 목록을 먼저 고쳤다
에러에 찍힌 호스트를 그대로 protocol, hostname, pathname으로 나눈다
unoptimized와 로더를 언제 쓰나
허용 목록으로 안 되는 예외만 우회합니다. unoptimized는 넥스트 최적화 프록시를 건너뛰고 브라우저가 원본 URL을 직접 받습니다. 호스트 검사는 피하지만, 리사이즈와 포맷 변환도 빠집니다.
사용자마다 호스트가 다른 프로필 URL, 또는 토스 가맹 이미지가 도메인 여러 개로 흩어질 때는 로더를 직접 쓰기도 합니다. 다만 로더가 다시 외부 URL을 부르면 CSP와 CORS가 붙습니다. 헤더가 막히면 CORS와 보안 헤더를 같이 보세요.
모듈 경로를 못 찾아 이미지 컴포넌트 자체가 안 뜨는 줄은 이 글이 아닙니다. next/image를 못 찾으면 Cannot find module입니다. hostname 메시지가 있을 때만 설정을 고치세요.
img로 전부 바꾸지 말 것 | 잠깐 확인용은 됩니다. 레이아웃 시프트와 큰 원본 전송이 남으니, 호스트를 알면 remotePatterns로 되돌리세요.
카카오 로그인 프로필이 빈 칸일 때
카카오 사용자 객체의 프로필 URL은 앱 검수와 동의 항목에 따라 비어 있을 수 있습니다. 호스트 설정과 빈 문자열은 다른 칸입니다. URL이 빈 채 Image에 들어가면 호스트 에러가 아니라 잘못된 src 경고가 납니다.
URL이 있는데도 깨지면, 그 문자열이 http://인지 https://인지, 호스트가 k.kakaocdn.net인지 img1.kakaocdn.net인지 그대로 적습니다. 로컬 더미 아바타는 public에 두고, 실프로필만 외부 패턴을 타게 분기하세요.