
  <!DOCTYPE html>
  <html lang="ko">
    <head>
      <meta charset="utf-8" />
      <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=yes,width=device-width,height=device-height" />
      <meta http-equiv="X-UA-Compatible" content="ie=edge">

      
          <title>[H:730]을 구독해주세요✋</title>
          
          <meta name="description" content="월~금요일 아침 7시30분.
한겨레 H:730과 함께 하세요.

쉴 새 없이 쏟아지는 뉴스 더미에서
독자님께  꼭 필요한 뉴스를 골라 배달합니다.
하루를 여는 에디터들의 편지와 함께
일목요연하게 브리핑합니다.

*아래 구독하기 버튼을 누르면 '확인 팝업창 없이' 구독신청이 완료됩니다.
*현재 한겨레의 모든 뉴스레터는 무료입니다. '광고 동의'는 향후 혹여 뉴스레터에 광고가 포함될 경우를 위한 사전 동의 성격입니다. 뉴스레터 서비스가 확대될 경우 레터 내에 광고가 삽입될 수 있고 NYT, WSJ, WP같은 국외 유수의 언론들은 대개 그리 하고 있습니다. 또한, 한겨레가 새로운 서비스를 시작할 때 구독자님들께 그런 정보를 보내드리기 위해서라도 '광고성 정보 수신' 항목은 필요합니다. 번거로우시더라도 너른 양해 부탁드립니다.  
  
*지난 H:730 보기
https://page.stibee.com/archives/70653" />
	        <meta name="keywords" content="[H:730]을 구독해주세요✋, 뉴스레터, newsletter" />
        
          <meta property="og:title" content="[H:730]을 구독해주세요✋"/>
          <meta property="og:description" content="월~금요일 아침 7시30분.
한겨레 H:730과 함께 하세요.

쉴 새 없이 쏟아지는 뉴스 더미에서
독자님께  꼭 필요한 뉴스를 골라 배달합니다.
하루를 여는 에디터들의 편지와 함께
일목요연하게 브리핑합니다.

*아래 구독하기 버튼을 누르면 '확인 팝업창 없이' 구독신청이 완료됩니다.
*현재 한겨레의 모든 뉴스레터는 무료입니다. '광고 동의'는 향후 혹여 뉴스레터에 광고가 포함될 경우를 위한 사전 동의 성격입니다. 뉴스레터 서비스가 확대될 경우 레터 내에 광고가 삽입될 수 있고 NYT, WSJ, WP같은 국외 유수의 언론들은 대개 그리 하고 있습니다. 또한, 한겨레가 새로운 서비스를 시작할 때 구독자님들께 그런 정보를 보내드리기 위해서라도 '광고성 정보 수신' 항목은 필요합니다. 번거로우시더라도 너른 양해 부탁드립니다.  
  
*지난 H:730 보기
https://page.stibee.com/archives/70653"/>
          <meta property="og:image" content="https://s3.ap-northeast-2.amazonaws.com/img.stibee.com/30367_list_70653_subscriptions_header_image.gif?v=1612254680"/>
        
      <meta name="twitter:card" content="summary">
      <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
      <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
      <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png">
      <meta name="msapplication-TileColor" content="#da532c">
      <meta name="theme-color" content="#ffffff">
      <link href="/static/css/763.e785920a.css" rel="stylesheet" />
      <meta name="naver-site-verification" content="72253dacb98f56ac73f44a8cf8b5f12db38bc861" />

      <script type="text/javascript">
        (function (f, b) { if (!b.__SV) { var e, g, i, h; window.mixpanel = b; b._i = []; b.init = function (e, f, c) { function g(a, d) { var b = d.split("."); 2 == b.length && ((a = a[b[0]]), (d = b[1])); a[d] = function () { a.push([d].concat(Array.prototype.slice.call(arguments, 0))); }; } var a = b; "undefined" !== typeof c ? (a = b[c] = []) : (c = "mixpanel"); a.people = a.people || []; a.toString = function (a) { var d = "mixpanel"; "mixpanel" !== c && (d += "." + c); a || (d += " (stub)"); return d; }; a.people.toString = function () { return a.toString(1) + ".people (stub)"; }; i = "disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split(" "); for (h = 0; h < i.length; h++) g(a, i[h]); var j = "set set_once union unset remove delete".split(" "); a.get_group = function () { function b(c) { d[c] = function () { call2_args = arguments; call2 = [c].concat(Array.prototype.slice.call(call2_args, 0)); a.push([e, call2]); }; } for (var d = {}, e = ["get_group"].concat(Array.prototype.slice.call(arguments, 0)), c = 0; c < j.length; c++) b(j[c]); return d; }; b._i.push([e, f, c]); }; b.__SV = 1.2; e = f.createElement("script"); e.type = "text/javascript"; e.async = !0; e.src = "undefined" !== typeof MIXPANEL_CUSTOM_LIB_URL ? MIXPANEL_CUSTOM_LIB_URL : "file:" === f.location.protocol && "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match("^\/\/") ? "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" : "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"; g = f.getElementsByTagName("script")[0]; g.parentNode.insertBefore(e, g); } })(document, window.mixpanel || []);
        var isDevelopment = window.location.hostname.toLowerCase().search('qa-page.stibee.com') >= 0
        if (isDevelopment) {
          mixpanel.init('9e30c13fe764a85c5e64cd7c2b7b9cb0', { debug: true, persistence: 'localStorage' });
        } else {
          mixpanel.init('3fc318e90152de4748e8f6ed5b40a0a6', { debug: false, persistence: 'localStorage' });
        }
      </script>
      <!-- Facebook Pixel Code -->
      <script>
      !function(f,b,e,v,n,t,s)
      {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
      n.callMethod.apply(n,arguments):n.queue.push(arguments)};
      if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
      n.queue=[];t=b.createElement(e);t.async=!0;
      t.src=v;s=b.getElementsByTagName(e)[0];
      s.parentNode.insertBefore(t,s)}(window, document,'script',
      'https://connect.facebook.net/en_US/fbevents.js');
      fbq('init', '937128733822281');
      fbq('track', 'PageView');
      </script>
      <noscript><img height="1" width="1" style="display:none"
      src="https://www.facebook.com/tr?id=937128733822281&ev=PageView&noscript=1"
      /></noscript>
      <!-- End Facebook Pixel Code -->
        
      
    </head>
    <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root">
    
    </div>
    
    <script src="/static/js/runtime-main.72721c04.js"></script>
    <script src="/static/js/763.chunk.js"></script>
    <script src="/static/js/main.93e37582.js"></script>
    </body>
    <script src="https://nsp.pay.naver.com/sdk/js/naverpay.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script>
    <script type="text/javascript" src="https://cdn.iamport.kr/v1/iamport.js"></script>
    <script>
      IMP.init('imp27287957');
    </script>
    <noscript>
      <img src="https://c.paypal.com/v1/r/d/b/ns?f=RISK_SESSION_CORRELATION_ID&s=SOURCE_IDENTIFIER&js=0&r=1" />
    </noscript>
  </html>
  
  
  