Blog

HTML meta refresh 리다이렉트 완벽 가이드: JavaScript 없이 페이지 이동

hanlee

HTML meta http-equiv refresh 태그를 사용한 페이지 리다이렉트 방법을 알아봅니다. 서버 설정 없이 정적 HTML만으로 페이지 자동 이동을 구현하는 방법과 주의사항을 상세히 설명합니다.

HTML meta refresh 리다이렉트 완벽 가이드

http-equiv="refresh" 메타 태그를 사용하면 JavaScript나 서버 설정 없이 HTML만으로 페이지를 자동 새로고침하거나 다른 URL로 리다이렉트할 수 있습니다.


목차

  1. http-equiv란?
  2. 기본 문법
  3. 리다이렉트 사용법
  4. 실무 예제
  5. SEO 고려사항
  6. 접근성 고려사항
  7. 대안 방법들
  8. 사용 권장 상황

http-equiv란?

http-equiv"HTTP equivalent"(HTTP 동등물)의 약자입니다. 원래 HTTP 응답 헤더는 서버에서 설정하지만, 서버 설정 권한이 없거나 정적 HTML 파일만 사용하는 경우 HTML 문서 내에서 HTTP 헤더와 동일한 효과를 낼 수 있게 해줍니다.

html
<!-- 서버에서 설정하는 HTTP 헤더 -->
Refresh: 5;url=https://example.com

<!-- HTML에서 동일한 효과 -->
<meta http-equiv="refresh" content="5;url=https://example.com">

http-equiv vs name 차이

구분http-equivname
용도HTTP 헤더 시뮬레이션문서 메타데이터
처리브라우저가 HTTP 헤더처럼 처리검색엔진/브라우저가 참고
예시refresh, content-type, CSPdescription, viewport, robots

기본 문법

페이지 새로고침

지정된 시간 후 현재 페이지를 새로고침합니다.

html
<!-- 5초 후 현재 페이지 새로고침 -->
<meta http-equiv="refresh" content="5">

<!-- 30초마다 새로고침 (실시간 대시보드 등) -->
<meta http-equiv="refresh" content="30">

다른 페이지로 리다이렉트

지정된 시간 후 다른 URL로 이동합니다.

html
<!-- 3초 후 다른 페이지로 이동 -->
<meta http-equiv="refresh" content="3;url=https://example.com">

<!-- 즉시 리다이렉트 (0초) -->
<meta http-equiv="refresh" content="0;url=https://example.com/new-page">

문법 구조

code-highlight
content="[초];url=[이동할 URL]"
설명
content="5"5초 후 현재 페이지 새로고침
content="0;url=..."즉시 해당 URL로 이동
content="3;url=..."3초 후 해당 URL로 이동

리다이렉트 사용법

기본 리다이렉트

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="0;url=https://example.com/new-location">
    <title>리다이렉트 중...</title>
</head>
<body>
    <p>페이지가 이동 중입니다...</p>
</body>
</html>

안내 메시지와 함께 리다이렉트

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="refresh" content="5;url=https://example.com/new-location">
    <title>페이지 이동 안내</title>
</head>
<body>
    <h1>페이지가 이동되었습니다</h1>
    <p>요청하신 페이지가 새로운 위치로 이동되었습니다.</p>
    <p><strong>5초</strong> 후 자동으로 이동합니다.</p>
    <p>자동으로 이동하지 않으면 <a href="https://example.com/new-location">여기를 클릭</a>하세요.</p>
</body>
</html>

카운트다운 표시 추가

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="refresh" content="5;url=https://example.com/new-location">
    <title>페이지 이동 안내</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
            max-width: 600px;
            margin: 100px auto;
            padding: 20px;
            text-align: center;
        }
        .countdown {
            font-size: 48px;
            font-weight: bold;
            color: #007bff;
            margin: 20px 0;
        }
        a {
            display: inline-block;
            margin-top: 20px;
            padding: 12px 24px;
            background: #007bff;
            color: white;
            text-decoration: none;
            border-radius: 6px;
        }
    </style>
</head>
<body>
    <h1>페이지가 이동되었습니다</h1>
    <p>요청하신 페이지가 새로운 위치로 이동되었습니다.</p>
    <div class="countdown" id="countdown">5</div>
    <p>초 후 자동으로 이동합니다.</p>
    <a href="https://example.com/new-location">지금 바로 이동하기</a>

    <script>
        // 카운트다운 표시 (선택적 - JavaScript 없이도 리다이렉트는 작동함)
        let count = 5;
        const countdown = document.getElementById('countdown');
        setInterval(() => {
            count--;
            if (count >= 0) countdown.textContent = count;
        }, 1000);
    </script>
</body>
</html>

실무 예제

1. 도메인 변경 안내

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="10;url=https://new-domain.com">
    <title>도메인 변경 안내</title>
</head>
<body>
    <h1>도메인이 변경되었습니다</h1>
    <p>저희 사이트의 도메인이 <strong>new-domain.com</strong>으로 변경되었습니다.</p>
    <p>10초 후 새 사이트로 이동합니다.</p>
    <p>북마크를 업데이트해 주세요!</p>
    <p><a href="https://new-domain.com">새 사이트로 바로 이동</a></p>
</body>
</html>

2. 점검 페이지

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <!-- 30초마다 새로고침하여 점검 종료 확인 -->
    <meta http-equiv="refresh" content="30">
    <title>서비스 점검 중</title>
</head>
<body>
    <h1>서비스 점검 중입니다</h1>
    <p>더 나은 서비스를 위해 점검을 진행하고 있습니다.</p>
    <p>예상 완료 시간: 오후 3시</p>
    <p><small>30초마다 자동으로 새로고침됩니다.</small></p>
</body>
</html>

3. 로그아웃 후 리다이렉트

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="3;url=/login">
    <title>로그아웃 완료</title>
</head>
<body>
    <h1>로그아웃되었습니다</h1>
    <p>안전하게 로그아웃되었습니다.</p>
    <p>3초 후 로그인 페이지로 이동합니다.</p>
</body>
</html>

4. 다국어 리다이렉트

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="0;url=/ko/">
    <title>리다이렉트 중...</title>
    <script>
        // 브라우저 언어 감지하여 리다이렉트 (JavaScript 사용 가능한 경우)
        const lang = navigator.language.substring(0, 2);
        const supportedLangs = ['ko', 'en', 'ja'];
        const targetLang = supportedLangs.includes(lang) ? lang : 'en';
        window.location.href = '/' + targetLang + '/';
    </script>
    <noscript>
        <!-- JavaScript 비활성화 시 한국어로 리다이렉트 -->
        <meta http-equiv="refresh" content="0;url=/ko/">
    </noscript>
</head>
<body>
    <p>리다이렉트 중...</p>
</body>
</html>

SEO 고려사항

검색엔진의 meta refresh 처리

리다이렉트 방법SEO 평가권장 상황
301 서버 리다이렉트최상영구 이전
302 서버 리다이렉트좋음임시 이전
JavaScript 리다이렉트보통SPA, 동적 처리
meta refresh낮음서버 설정 불가 시

Google의 공식 입장

Google은 meta refresh를 인식하지만, 301/302 서버 리다이렉트를 권장합니다. 특히 0초 즉시 리다이렉트보다 약간의 지연이 있는 리다이렉트를 더 신뢰합니다.

SEO를 위한 권장사항

  1. 가능하면 서버 리다이렉트 사용

    apache
    # Apache .htaccess
    Redirect 301 /old-page https://example.com/new-page
    
  2. meta refresh 사용 시 canonical 태그 추가

    html
    <link rel="canonical" href="https://example.com/new-page">
    <meta http-equiv="refresh" content="0;url=https://example.com/new-page">
    
  3. robots.txt에서 이전 페이지 색인 방지

    code-highlight
    Disallow: /old-page
    

접근성 고려사항

문제점

  1. 자동 이동은 스크린 리더 사용자에게 혼란을 줄 수 있음
  2. 읽기 어려움이 있는 사용자가 내용을 읽기 전에 이동할 수 있음
  3. 뒤로 가기 버튼이 제대로 작동하지 않을 수 있음

WCAG 가이드라인

WCAG 2.1에서는 자동 리다이렉트에 대해 다음을 권장합니다:

  • 최소 20초 이상의 대기 시간 제공
  • 사용자가 직접 이동을 선택할 수 있는 링크 제공
  • 자동 이동을 취소할 수 있는 옵션 제공

접근성 개선 예제

html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <!-- 충분한 대기 시간 (20초) -->
    <meta http-equiv="refresh" content="20;url=https://example.com/new-page">
    <title>페이지 이동 안내</title>
</head>
<body>
    <main role="main" aria-live="polite">
        <h1>페이지가 이동되었습니다</h1>
        <p>이 페이지는 새로운 위치로 이동되었습니다.</p>
        <p>20초 후 자동으로 이동합니다.</p>

        <!-- 명확한 수동 이동 옵션 -->
        <p>
            <a href="https://example.com/new-page"
               style="font-size: 1.2em; font-weight: bold;">
                지금 바로 새 페이지로 이동하기
            </a>
        </p>

        <!-- 현재 페이지에 머무르기 옵션 -->
        <p>
            <button onclick="window.stop()">이 페이지에 머무르기</button>
        </p>
    </main>
</body>
</html>

대안 방법들

1. 서버 리다이렉트 (권장)

apache
# Apache .htaccess
Redirect 301 /old-page.html /new-page.html
RedirectMatch 301 ^/blog/(.*)$ https://newsite.com/blog/$1
nginx
# Nginx
server {
    rewrite ^/old-page$ /new-page permanent;
    return 301 https://newsite.com$request_uri;
}

2. JavaScript 리다이렉트

html
<script>
    // 즉시 리다이렉트
    window.location.href = 'https://example.com/new-page';

    // 또는 replace (뒤로가기 히스토리에 남지 않음)
    window.location.replace('https://example.com/new-page');
</script>

3. HTTP 헤더 (서버 설정)

http
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page

방법별 비교

방법SEO접근성서버 필요복잡도
301/302 서버최상좋음필요중간
JavaScript보통보통불필요낮음
meta refresh낮음주의필요불필요낮음

사용 권장 상황

적합한 상황

  • 정적 호스팅 (GitHub Pages, S3 등)에서 서버 설정 불가 시
  • 임시 안내 페이지 (점검, 이벤트 종료 등)
  • 레거시 URL 이전 고지 (사용자에게 변경 사항 알림)
  • 자동 새로고침이 필요한 대시보드 (단, 더 나은 방법 권장)

피해야 할 상황

  • 영구적인 URL 변경 → 서버 301 리다이렉트 사용
  • SPA (Single Page Application) → JavaScript 라우팅 사용
  • 빈번한 리다이렉트 → 서버 설정으로 처리
  • SEO가 중요한 페이지 → 서버 리다이렉트 사용

요약

항목내용
문법<meta http-equiv="refresh" content="초;url=URL">
SEO 영향서버 리다이렉트보다 낮은 평가
접근성충분한 대기 시간과 수동 이동 옵션 필요
사용 시점서버 설정 불가 시 대안으로 사용
권장 대안301/302 서버 리다이렉트

참고 자료