<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>choco_sister.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 12 Apr 2022 06:35:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. choco_sister.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/choco_sister" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[네트워크 보안] 웹 공격 기술 및 대응법 (Dos, DDos, DRDos)]]></title>
            <link>https://velog.io/@choco_sister/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9B%B9-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EC%88%A0</link>
            <guid>https://velog.io/@choco_sister/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9B%B9-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EC%88%A0</guid>
            <pubDate>Tue, 12 Apr 2022 06:35:13 GMT</pubDate>
            <description><![CDATA[<h1 id="네트워크-기반-공격의-종류">네트워크 기반 공격의 종류</h1>
<ul>
<li><strong>네트워크 공격</strong>: 스니핑, 스푸핑, 세션 하이재킹</li>
<li><strong>서비스 거부 공격</strong>: Dos, DDos, Drdos</li>
<li><strong>네트워크 스캐닝 공격</strong>: TCP Scan, UDP Scan</li>
</ul>
<hr>
<h1 id="dos">DoS</h1>
<ul>
<li><strong>Dos(Denial of Service) 정의</strong><ul>
<li>대상 시스템이 정상적인 서비스를 할 수 없도록 가용성을 떨어뜨리는 공격</li>
</ul>
</li>
<li><strong>DDos 와의 차이점</strong><ul>
<li>Dos는 공격자가 단일 컴퓨터를 이용해 공격함</li>
</ul>
</li>
<li><strong>Dos 의 목표</strong><ul>
<li><strong>네트워크 자원 소진</strong>: 네트워크 대역폭(BandWidth)를 소진시킴</li>
<li><strong>시스템 자원 소진</strong>: CPU, 메모리, 디스크 등 자원에 과도한 부하를 발생시킴 (가용 디스크 자원 고갈, 가용 메모리 자원 고갈, 가용 프로세스 자원 고갈)</li>
<li><strong>자원 파괴</strong>: 디스크, 데이터, 시스템을 파괴함</li>
</ul>
</li>
</ul>
<hr>
<h2 id="dos-종류">Dos 종류</h2>
<h3 id="ping-of-death">Ping of Death</h3>
<ul>
<li>Ping of Death 개요<ul>
<li>Ping 을 이용하여 ICMP 패킷을 정상적인 크기보다 아주 크게 만들어진 패킷을 전송하면 네트워크를 통해 라우팅되어 공격 네트워크에 도달하는 동안 아주 작은 조각(Fragment)로 나뉘게 되어 공격대상 시스템은 이렇게 작게 조각화된 패킷을 모두 처리해야해서 정상적인 Ping 보다 훨씬 많은 부하가 걸리게 되고, 시스템의 성능 저하가 된다.</li>
</ul>
</li>
<li>Ping of Death 대응법<ul>
<li>ICMP Ping에 대해 응답을 하지 않도록 설정한다.
<code>sysctl -w net.ipv4.icmp_echo_ignore_all=1</code><h3 id="land-attack">Land Attack</h3>
</li>
</ul>
</li>
<li><strong>Land Attack 개요</strong><ul>
<li>출발지와 목적지가 같은 패킷을 만들어 공격 대상이 자기 자신에게 응답하도록 해 부하를 발생시킨다.</li>
</ul>
</li>
<li><strong>Land Attack 대응법</strong><ul>
<li>침입차단시스템 또는 OS패치를 통해 출발지 주소와 목적지 주소가 동일한 패킷을 차단시킨다.</li>
</ul>
</li>
</ul>
<h3 id="smurf-attack">Smurf Attack</h3>
<ul>
<li><p><strong>Smurf Attack 개요</strong></p>
<ul>
<li>ICMP 프로토콜 취약점을 이용한 DoS공격 기법</li>
<li>ICMP 패킷 소스 주소를 공격 대상 호스트로 위조한 후, 해당 패킷을 브로드캐스트 하면 근처의 호스트가 다량의 Echo Reply 를 공격 대상 호스트로 보낸다.</li>
<li>ICMP Echo Request &amp; ICMP Echo Reply</li>
</ul>
</li>
<li><p><strong>Smurf Attack 대응법</strong></p>
<ul>
<li>라우터에서 다른 네트워크에서 자신의 네트워크로 들어오는 IP브로드캐스트 패킷을 차단한다. (라우터에서 Direct Broadcast를 Disable시킨다.)</li>
<li>호스트는 IP브로드캐스트로 전송된 ICMP패킷에 대해 응답하지 않게 설정한다.
<code>(유닉스)
ndd -set /dev/ip ip_forward_directed_broadcasts 0</code>
<code>(리눅스)
sysctl -w net.ipv4.icmp_echo_ignore_broadcast=1</code></li>
</ul>
</li>
</ul>
<h3 id="teardrop-attack">Teardrop Attack</h3>
<ul>
<li><p><strong>Teardrop Attack 개요</strong></p>
<ul>
<li>하나의 IP 패킷이 분할된 IP 단편의 offset 값을 서로 중첩되도록 조작하여 이를 재조합하는 공격 (Bonk, Boink와 유사)</li>
<li>Bonk는 순서번호가 1인 단편을 계속 보냄</li>
<li>Boink는 처음에는 정상적인 순서의 단편을 보내다가 점점 어긋난 순서번호의 패킷을 보냄(Bonk 개선된 버전)</li>
<li>Fragmentation 의 취약점을 이용함, 이러한 공격을 Inconsistent Fragmentation 공격 이라함</li>
</ul>
</li>
<li><p><strong>IP Fragmentation</strong></p>
<ul>
<li>패킷의 크기가 MTU(Maximum Transmission Unit)을 초과하면 한번에 전송할 수 없다. </li>
<li>이 때문에 패킷을 MTU 이하의 작은 조각으로 분할하는 것을 단편화(Fragmentation), 분할된 조각을 단편(Fragment)라고 한다. </li>
<li>4000바이트의 패킷을 전송하려고 하는데 MTU가 1500인 경우 예시는 아래와 같다.</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th>순서</th>
<th align="center">페이로드</th>
<th align="right">헤더</th>
<th align="right">More Flag</th>
<th align="right">offset</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td align="center">1480</td>
<td align="right">20</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
<tr>
<td>2</td>
<td align="center">1480</td>
<td align="right">20</td>
<td align="right">1</td>
<td align="right">185</td>
</tr>
<tr>
<td>3</td>
<td align="center">1020</td>
<td align="right">20</td>
<td align="right">0</td>
<td align="right">370</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>tcpdump상의 datagram</strong>
id:size@offset[+]
ex) 41421:4000@8000+</p>
</blockquote>
<hr>
<h1 id="ddos">DDoS</h1>
<h2 id="ddosdenial-of-service-정의">DDos(Denial of Service) 정의</h2>
<ul>
<li>대상 시스템이 정상적인 서비스를 할 수 없도록 가용성을 떨어뜨리는 공격</li>
</ul>
<table>
<thead>
<tr>
<th>비고</th>
<th>대역폭 소진 공격</th>
<th>서비스 마비 공격</th>
</tr>
</thead>
<tbody><tr>
<td>계층</td>
<td>OSI 3~4계층</td>
<td>OSI 7계층</td>
</tr>
<tr>
<td>프로토콜</td>
<td>IP, ICMP, IGMP, UDP, TCP 등</td>
<td>HTTP, DNS, FTP, SMTP 등</td>
</tr>
<tr>
<td>공격대상</td>
<td>네트워크 인프라</td>
<td>웹 서버, 정보보호 장비 등</td>
</tr>
<tr>
<td>특징</td>
<td>회선 대역폭 고갈<br>전체 네트워크의 가용성에 영향을 끼침<br>단순 Flooding 형태의 대량의 트래픽 발생을 통한 공격 진행<br>Anti-DDos 장비를 통해 방어 가능</td>
<td>공격 대상 시스템만 마비시킴<br> 전체 네트워크에 대한 영향은 작음<br>소량의 트래픽으로 공격 가능<br>정상 트래픽을 이용한 공격 진행</td>
</tr>
</tbody></table>
<hr>
<h2 id="ddos-대역폭-소진-공격">DDos-대역폭 소진 공격</h2>
<h3 id="udp-flooding">UDP Flooding</h3>
<ul>
<li><strong>DNS 증폭 공격</strong><ul>
<li>DNS Amplification DDoS Attack</li>
<li>DNS를 이용한 UDP Flooding 서비스 거부 공격</li>
<li>DNS 질의는 DNS 질의량에 비하여 DNS 서버의 응답량이 훨씬 크다는 점을 이용</li>
<li>DNS 프로토콜에는 인증 절차가 없다는 점을 이용</li>
<li>DNS Query 타입을 &#39;ANY&#39;로 전송 → 정상패킷보다 크게 증폭됨</li>
<li>요청 주소를 희생자의 주소로 위조하여 다량의 서버에 보내는 방법으로 공격</li>
<li>access-list 1 deny udp any any eq 53</li>
</ul>
</li>
<li><strong>NTP 증폭 공격</strong><ul>
<li>NTP(123/udp)를 이용한 UDP Flooding 서비스 거부 공격</li>
<li>해당 ntp 서버에 최근 ntp질의에 응답을 했던 목록을 보여주는 monlist 기능을 이용</li>
<li>monlist를 요청 할 경우 600개의 응답이 보여지며 약 4,000 byte 이상의 응답 패킷을 생성함</li>
<li>요청 주소를 희생자의 주소로 위조하여 다량의 서버에 보내는 방법으로 공격<blockquote>
<p><strong>NTP(Network Time Protocol)</strong>: 시간을 동기화하여 정확하게 유지하는데 사용되는 프로토콜</p>
</blockquote>
<h3 id="icmp-flooding">ICMP Flooding</h3>
<h3 id="dns-query-flooding">DNS Query Flooding</h3>
</li>
</ul>
</li>
<li><strong>DNS Query Flooding 개요</strong><ul>
<li>UDP 프로토콜 기반 서비스를 제공하는 DNS에 DNS 쿼리 데이터를 다량으로 서버에 전송하여 DNS의 정상적인 서비스를 방해하는 공격</li>
</ul>
</li>
<li><strong>DNS Query Flooding 대응법</strong><ul>
<li>access-list 1 deny udp any any eq 53<h3 id="tcp-syn-flooding">TCP SYN Flooding</h3>
</li>
</ul>
</li>
<li><strong>TCP SYN Flooding 개요</strong><ul>
<li>TCP의 3-Way-Handshake 취약점을 이용한 DoS공격</li>
<li>다량의 SYN 패킷을 보내 백로그큐(Backlog Queue)를 가득 채우는 방법<blockquote>
<p><strong>백로그큐</strong> : 3-Way-Handshake를 위해 연결이 진행중인 요청을 담아두는 큐, 큐가 가득차면 다른 연결을 받아들일 수 없음</p>
</blockquote>
</li>
<li>다수의 클라이언트가 고의로 SYN만 보내고 아무런 동작을 하지 않는다면 SYN Backlog Queue는 가득참 → 더 이상 연결요청을 못 받음</li>
</ul>
</li>
<li><strong>TCP SYN Flooding 대응법</strong><ul>
<li>TCP Connection Timeout 시간을 짧게 설정함 (너무 짧으면 정상적인 요청도 느리다는 이유로 연결이 거부될 수 있음)</li>
<li>백로그 큐를 늘림
<code>리눅스: sysctl -w net.ipv4.tcp_max_syn_backlog = 1024</code>
<code>유닉스: ndd -set /dev/tcp tcp_conn_req_max_q1 1024</code></li>
<li>방화벽 설정: 의심 패킷에 대한 차단 정책을 추가
<code>1초에 10회 발생시 차단: 
iptables -A INPUT -p TCP --dport 80 --syn -m limit --limit 10/second -j Drop</code></li>
<li>라우터 설정</li>
</ul>
</li>
<li><em>인터셉트 모드*</em>: syn 패킷을 요청한 클라이언트와 방화벽에서 먼저 연결을 맺고 정상적이면 서버로 보냄</li>
<li><em>와치 모드*</em>: syn 패킷을 통과시키고 일정시간 연결이 안되면 라우터에서 차단함<ul>
<li>SYN COOKIE
Syn Flooding 공격을 방지하기 위한 방어 기술
클라이언트에서 연결요청이 있을 경우 SYN/ACK 패킷에 특별한 쿠키값을 담아 보내고, ACK가 올 경우 쿠키값을하여 제대로 된 경우 연결을 형성한다.
연결 정보를 Cookie을 통해 보냄으로써 SYN Backlog Queue 를 사용하지 않는다.
연결 요청이 많을 경우 쿠기 값 생성/전송 과정만으로도 가용성이 떨어질 수 있다.
<code># sysctl -w net.ipv4.tcp_syncookies=1</code></li>
</ul>
</li>
</ul>
<hr>
<h2 id="ddos-서비스-마비-공격">DDos-서비스 마비 공격</h2>
<h3 id="http-get-flooding">HTTP GET Flooding</h3>
<ul>
<li><strong>HTTP GET Flooding 개요</strong><ul>
<li>동일한 HTTP GET 요청을 다량으로 발생시켜 서버가 요청을 처리하도록 하는 공격</li>
<li>서버 자원을 과도하게 사용하도록 하여 정상적인 요청을 처리하지 못하도록 함</li>
</ul>
</li>
<li><strong>HTTP GET Flooding 대응법</strong><ul>
<li>임계치를 설정하고 비정상적 트래픽을 유발하는 IP를 방화벽 차단 목록으로 등록</li>
<li>콘텐츠 요청 횟수에 대한 임계치 설정</li>
</ul>
</li>
</ul>
<h3 id="cc-attack">CC Attack</h3>
<ul>
<li><strong>CC Attack 개요</strong><ul>
<li>HTTP GET Flooding with Cache Control</li>
<li>HTTP 캐시 옵션을 조작해 캐싱 서버가 아닌 웹서버가 직접 처리하도록 유도 → 웹 서버 자원 소진</li>
<li>Cache-Control 값이 no-store(캐시저장금지), must-revalidate(웹서버가 캐싱 서버에 저장된 캐시 데이터에 대한 검증 요구) 로 설정되어있으면 공격으로 판단</li>
</ul>
</li>
<li><strong>CC Attack 대응법</strong><ul>
<li>HTTP Get Flooding 과 마찬가지로 일반적인 방어 기법인 임계치 기반의 DDoS 공격 방어가 효과적임. 즉, TCP 세션 요청과 HTTP 요청에 대한 임계치 기법으로 방어가 가능</li>
<li>HTTP Cache-Control 헤더 옵션 별 임계치 정책으로 방어해야지만 큰 효과를 얻을 수 있음 (방화벽에 캐싱공격 문자열을 포함하는 IP 차단)</li>
</ul>
</li>
</ul>
<h3 id="slow-http-post-dos">Slow HTTP POST Dos</h3>
<ul>
<li><p><strong>Slow HTTP POST Dos 개요</strong></p>
<ul>
<li><strong>R-U-Dead-Yet(RUDY)</strong> 라고도 부름</li>
<li>POST 메소드로 Content-Length 필드에 임의의 큰 값을 설정하여 전송함</li>
<li>웹 서버가 클라이언트에서 해당 크기의 메시지를 전송할때까지 커넥션을 유지함</li>
<li>대량의 데이터를 장시간에 걸쳐 분할 전송하여 연결을 장시간 유지함 → 웹서버 가용량을 소진하게함 → 다른 클라이언트들의 정상적인 서비스 요청을 처리하지 못함</li>
</ul>
</li>
<li><p><strong>Slow HTTP POST Dos 대응법</strong></p>
<ul>
<li>각 POST 폼에 메시지 크기를 제한함</li>
<li>항시 TCP 상태를 모니터링하여, 평상시보다 Established 및 Time Wait 값이 많은지 확인함</li>
<li><strong>연결 타임아웃(Connection Timeout) 설정</strong> : 클라이언트와 서버간 일정 연경 유지시간 초과시 자동 연결 종료</li>
<li><strong>읽기 타임아웃(Read Timeout) 설정</strong> : 지정한 시간내에 body 정보가 모두 수신되지 않으면 오류코드 반환</li>
<li><strong>서버 방화벽 설정</strong> : iptables와 같은 방화벽을 통해 동일한 소스 IP에서 동시 연결가능한 개수의 임계치를 설정하여 초과 시 차단</li>
</ul>
</li>
</ul>
<h3 id="slow-http-header-dos">Slow HTTP Header Dos</h3>
<ul>
<li><p><strong>Slow HTTP Header Dos 개요</strong></p>
<ul>
<li>Slowloris 공격이라고도 부름</li>
<li>HTTP Header 정보를 비정상적으로 조작하여 웹서버가 온전한 Header정보가 올때 까지 기다리도록 한다. → 서버가 연결 상태를 유지할 수 있는 가용자원은 한계가 있으므로 임계치를 넘어가면 다른 정상적인 접근을 거부하게 된다.</li>
<li>HTTP에선 헤더의 끝을 /r/n 이라는 개행문자로 구분</li>
<li>공격자는 이 마지막 개행문자를 보내지 않고 지속적으로 의미없는 변수를 추가한다.
<img src="https://velog.velcdn.com/images/choco_sister/post/2a20ebf6-6423-4f9a-b7ea-247745aeadda/image.png" alt=""></li>
<li>클라이언트가 PSH ACK 패킷으로 Keep alive 패킷을 지속적으로 보낸다</li>
<li>Header와 Body를 구분하는 문자가 0d0a0d0a 가 아닌 0d0a 에서 끝났다는 것은 아직 전송할 헤더가 남았음을 의미한다.</li>
<li>공격자는 이렇게 연결을 유지하여 가용자원을 소진되게 만든다.</li>
</ul>
</li>
<li><p><strong>Slow HTTP POST Dos 대응법</strong></p>
<ul>
<li>공격자가 동시에 많은 세션을 유지하므로 방화벽 등을 통하여 세션 임계치 제한을 설정한다.</li>
<li>공격자가 헤더를 천천히 전달하며 연결 시간을 지속시키므로 연결 타임아웃 시간을 적절히 짧게 두어 의심되는 연결이 종료되도록 한다</li>
</ul>
</li>
</ul>
<h3 id="slow-http-read-dos"><strong>Slow HTTP Read DoS</strong></h3>
<ul>
<li>정상트래픽 이라면 Window Size가 가변적이지만 공격 트래픽은 Window Size가 &quot;0&quot;으로 고정</li>
<li>매우 작은 윈도우크기로 서버에 응답을 보내면 서버는 더 이상 데이터를 전송하지 못하고 연결만 유지한 상태로 대기</li>
</ul>
<h3 id="hash-dos">Hash DoS</h3>
<ul>
<li><strong>Hash DoS 개요</strong><ul>
<li>다량의 POST 파라미터(&#39;&amp;&#39;이용)를 보내서 Hash Table의 충돌을 유도하여 부하를 증가시킨다.</li>
<li>해시 테이블에서 해시 충돌이 발생하여 해시 테이블에 접근하는 시간이 증가한다.</li>
</ul>
</li>
<li><strong>Hash DoS 대응법</strong><ul>
<li>HTTP POST 파라미터 제한: 특정 발신지에서 IP로 연결할 수 있는 최대값 설정</li>
<li>POST 메시지 크기 제한</li>
</ul>
</li>
</ul>
<h3 id="hulk-dos">Hulk DoS</h3>
<ul>
<li><strong>Hulk DoS 개요</strong><ul>
<li>GET Flooding 공격 유형</li>
<li>http get 요청을 다량으로 하면서 접속대상주소를 지속적으로 변경하면서 공격 </li>
<li>파라미터를 계속 변경하면서 보냄 (DDos 차단 정책 우회)</li>
<li>임계치 설정 기반 방어가 불가능 (임계치는 고정된 URL에서만 설정 가능함)</li>
</ul>
</li>
<li><strong>Hulk DoS 대응법</strong><ul>
<li>접속 임계치 설정 </li>
<li>HTTP Request HOST 임계치 설정 (URL이 아닌 HTTP Request에 포함된 HOST 필드값을 카운트해 임계치 설정)</li>
</ul>
</li>
</ul>
<hr>
<h2 id="drdos">DRDos</h2>
<ul>
<li>Distributed Reflection Denial of Service</li>
<li>취약점이 있는 외부의 정상적인 서버들을 이용하여 공격을 수행하는 분산 서비스 거부 공격</li>
<li>IP Spoofing의 적극적인 사용 → 추적 방지</li>
<li>반사체(Reflector)의 사용 → 공격량의 증대(공격력 강화)</li>
</ul>
<hr>
<h2 id="기출문제">기출문제</h2>
<p><strong>1.  다음은 HTTP Request 메시지를 패킷 분석 도구로 캡쳐한 결과 중 일부이다. 각 물음에 답하시오.</strong>
<img src="https://velog.velcdn.com/images/choco_sister/post/07bcca74-5008-4ced-ac3f-c146aa1e980c/image.png" alt="">
<strong>1.1) 어떤 공격을 당하고 있는 것으로 추정할 수 있는가?
1.2) 이 공격의 원리는 무엇인가?
1.3) 대응방법을 2가지 이상 쓰시오.</strong>
<a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/19665">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/19665</a></p>
<p><strong>2. NTP DDos 에 대한 아래 보안 권고안의 의미를 설명하시오.
2.1) ntp -version
2.2) disable monlist
2.3) ntpdc-c monlist &quot;점검 대상 NTP 서버 IP&quot;
2.4) iptables -A OUT -p udp --sport 123 -m length --length 100 -j Drop</strong>
<a href="https://information-security.tistory.com/269">https://information-security.tistory.com/269</a></p>
<hr>
<p><a href="https://ensxoddl.tistory.com/254">https://ensxoddl.tistory.com/254</a>
<a href="https://jeongchul.tistory.com/312">https://jeongchul.tistory.com/312</a>
<a href="https://itwiki.kr/w/%EC%84%9C%EB%B9%84%EC%8A%A4_%EA%B1%B0%EB%B6%80_%EA%B3%B5%EA%B2%A9">https://itwiki.kr/w/%EC%84%9C%EB%B9%84%EC%8A%A4_%EA%B1%B0%EB%B6%80_%EA%B3%B5%EA%B2%A9</a>
<a href="https://itwiki.kr/w/IP_%EB%8B%A8%ED%8E%B8%ED%99%94">https://itwiki.kr/w/IP_%EB%8B%A8%ED%8E%B8%ED%99%94</a>
<a href="https://jjuromi.tistory.com/entry/%EC%9A%A9%EC%96%B4-%EB%B9%88%EC%B9%B8%EB%AC%B8%EC%A0%9C-%EC%A0%95%EB%B3%B4%EB%B3%B4%EC%95%88%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EB%8C%80%EB%B9%84-v6">https://jjuromi.tistory.com/entry/%EC%9A%A9%EC%96%B4-%EB%B9%88%EC%B9%B8%EB%AC%B8%EC%A0%9C-%EC%A0%95%EB%B3%B4%EB%B3%B4%EC%95%88%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EB%8C%80%EB%B9%84-v6</a>
<a href="https://repository.kisti.re.kr/bitstream/10580/6252/1/2015-083%20DDoS%20%EA%B3%B5%EA%B2%A9%20%EC%9C%A0%ED%98%95%EB%B3%84%20%EB%B6%84%EC%84%9D%EB%B3%B4%EA%B3%A0%EC%84%9C.pdf">https://repository.kisti.re.kr/bitstream/10580/6252/1/2015-083%20DDoS%20%EA%B3%B5%EA%B2%A9%20%EC%9C%A0%ED%98%95%EB%B3%84%20%EB%B6%84%EC%84%9D%EB%B3%B4%EA%B3%A0%EC%84%9C.pdf</a>
<a href="https://darksoulstory.tistory.com/326">https://darksoulstory.tistory.com/326</a>
<a href="https://skogkatt.tistory.com/138">https://skogkatt.tistory.com/138</a>
<a href="https://itwiki.kr/w/DRDoS">https://itwiki.kr/w/DRDoS</a>
<a href="https://information-security.tistory.com/269">https://information-security.tistory.com/269</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[어플리케이션 보안] Apache 웹 서버 보안]]></title>
            <link>https://velog.io/@choco_sister/%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%B3%B4%EC%95%88-Apache-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EB%B3%B4%EC%95%88</link>
            <guid>https://velog.io/@choco_sister/%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%B3%B4%EC%95%88-Apache-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EB%B3%B4%EC%95%88</guid>
            <pubDate>Mon, 11 Apr 2022 08:49:19 GMT</pubDate>
            <description><![CDATA[<h1 id="apache-http-서버">Apache HTTP 서버</h1>
<ul>
<li>Apache HTTP Server는 오픈 소스 소프트웨어 그룹인 아파치 소프트웨어 재단에서 만드는 웹 서버 프로그램</li>
</ul>
<hr>
<h2 id="apache-보안-설정">Apache 보안 설정</h2>
<ul>
<li><strong>서버 실행 계정 확인</strong>: root 말고 apache라는 별도의 계정을 권한으로 만들어 아파치 웹 프로세스에 대한 권한으로 할당한다.</li>
<li>** Apache 설정파일 수정(httpd.conf)**: Timeout, MaxClient, Port, User, MaxSpareServer 등 설정 파일을 수정한다 (/etc/httpd/conf/httpd.conf)</li>
</ul>
<hr>
<h2 id="httpdconf">httpd.conf</h2>
<ul>
<li><p>리눅스 아파치 웹서버의 메인 설정파일</p>
</li>
<li><p>위치 : /etc/conf/httpd/httpd.conf</p>
</li>
<li><p><strong>httpd.conf 세션 설정</strong></p>
<ul>
<li><strong>TimeOut</strong> : 클라이언트의 요청에 서버가 대기하는 시간 </li>
<li><strong>KeepAlive</strong> (on/off) : on 으로 설정하면 클라이언트와 서버간의 tcp 연결을 keepalivetimeout 동안 유지하게 된다. 즉, 한 번의 연결에 대해 한 번의 요청만 처리하는 것이 아니라 또 다른 요청을 기다리게 된다. (일반적으로 on이 좋다), 한번 맺은 세션을 요청이 끝나더라도 유지해주는 기능</li>
<li><strong>KeepAliveTimeout</strong> : KeepAlive 옵션이 on 이라면 클라이언트 최초 요청을 받은 뒤에 다음 요청이 전송될때까지 대기하는 시간(s)</li>
<li><strong>MaxKeepAliveRequests</strong> : KeepAlive 옵션이 on 이라면 <u>허용할 최대 요청 수</u>를 정의함. 이 옵션을 0으로 설정하면 무한대의 요청을 허용함 (성능은 좋아짐), KeepAlive 를 허용하는 유저 수.</li>
<li><strong>MaxClients</strong> : 아파치 서버 동시 접속자 수 (최대: 256)</li>
<li><strong>DirectoryIndex</strong> : 웹 디렉토리 접근 시 인식되는 인덱스 파일의 순서 지정</li>
<li><strong>Listen</strong> : 사용할 포트 지정</li>
<li><strong>CustomLog</strong> : 엑세스 로그 파일 위치 지정</li>
<li><strong>ErrorLog</strong> : 에러 로그 파일 위치 지정</li>
<li><strong>Port</strong> : 아파치가 사용할 기본 포트 (일반적으로 80)</li>
<li><strong>User</strong> : 보안상 절대 root 로 설정하지 말자</li>
</ul>
</li>
<li><p><strong>httpd.conf 접근제어</strong></p>
<ul>
<li><strong>Order Deny, Allow</strong>: Deny와 Allow 순서를 정한다.</li>
<li><strong>Deny from All</strong> : 모든 트래픽을 막는다.</li>
<li><strong>FollowSymLinks</strong> : 심볼릭 링크를 허용한다.</li>
<li><strong>LimitRequestBody</strong> : 파일 업로드, 다운로드 시 파일크기를 제한한다.</li>
<li><strong>Indexes</strong> : 웹 서버의 디렉토리에 접근 했을 때 DirectoryIndex 지시자로 설정한 파일이 없을 경우 디렉토리안의 파일목록을 보여준다. → &#39;디렉토리 리스팅&#39;이 가능하므로 해당 값을 삭제하는게 안전하다.</li>
<li><strong>AllowOverride</strong>: 클라이언트의 디렉토리 접근 제어에 관한 설정, 어떻게 접근을 허락할 것인가? (None, ALL, AuthConfig, FileInfo...) → &#39;None&#39; 이면 값을 &#39;AuthConfig&#39;로 변경해서 상위 디렉토리 접근을 금지할 수 있다.</li>
</ul>
</li>
</ul>
<pre><code>- 시스템 루트( / ) 디렉토리에 대한 제어
&lt;Directory /&gt;
Order Deny, Allow
Deny from All
LimitRequestBody 5000000
Options FollwSymLinks
AllowOverride None
&lt;/Directory&gt;

- /usr/local/apache/htdocs 디렉토리에 대한 제어
&lt;Directory  &quot;/usr/local/apache/htdocs&quot;/&gt;
Order Deny, Allow
Deny from All
Allow from 127.0.0.1
LimitRequestBody 5000000
Options Indexes FollowSymLinks
AllowOverride AuthConfig
&lt;/Directory&gt;</code></pre><ul>
<li>IIS 용 : WebKnight (국내 인터넷진흥원이 권고하는 무료 웹 방화벽)</li>
<li>아파치 용: <strong>ModSecurity</strong> (국내 인터넷진흥원이 권고하는 무료 웹 방화벽), 아래와 같이 httpd.conf 파일에 적용 가능함<pre><code>&lt;IfModule mode_security.c&gt;
정책내용
&lt;/IfModule&gt;</code></pre></li>
</ul>
<hr>
<h2 id="htaccess">.htaccess</h2>
<ul>
<li>.htaccess 파일을 사용하여 디렉토리별로 설정을 변경할 수 있다.</li>
</ul>
<hr>
<h2 id="기출문제">기출문제</h2>
<p><strong>1. htaccess 파일 설정의 의미에 대하여 답하시오.</strong>
*<em>1.1) *</em></p>
<pre><code>&lt;FileMatch &quot;\.(ph|lib|sh|)&quot;&gt;
Order Allow DENY
Deny From ALL
&lt;/FilesMatch&gt;</code></pre><p><strong>1.2) ** <code>AddType text/html .php .php1 .php2 .php3 .php4 .phtml</code>
**1.1 답)</strong> .ph, .lib, .sh 등의 서버 사이드 스크립트 파일에 대해 직접 URL 호출 금지 (업로드된 스크립트의 실행을 방지하기 위해)
<strong>1.2 답)</strong> 서버스크립트 확장자를 text/html MIME Type으로 재조정하여 업로드된 스크립트 실행 방지</p>
<p><a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/10005">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/10005</a>
<a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9721">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9721</a>
<a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/14779">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/14779</a>
<a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9998">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9998</a></p>
<hr>
<blockquote>
<p>참고사이트
<a href="https://namu.wiki/w/%EC%95%84%ED%8C%8C%EC%B9%98%20HTTP%20%EC%84%9C%EB%B2%84">https://namu.wiki/w/%EC%95%84%ED%8C%8C%EC%B9%98%20HTTP%20%EC%84%9C%EB%B2%84</a>
<a href="https://zidarn87.tistory.com/364">https://zidarn87.tistory.com/364</a>
<a href="https://peemangit.tistory.com/308">https://peemangit.tistory.com/308</a>
<a href="https://mosei.tistory.com/entry/apache-httpdconf-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%84%A4%EB%AA%85">https://mosei.tistory.com/entry/apache-httpdconf-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%84%A4%EB%AA%85</a>
<a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x">https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x</a>
<a href="https://dukkoong.tistory.com/18">https://dukkoong.tistory.com/18</a> (13회 기출문제)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크 보안] 방화벽(Firewall)의 종류와 구성방식]]></title>
            <link>https://velog.io/@choco_sister/%EB%B0%A9%ED%99%94%EB%B2%BD</link>
            <guid>https://velog.io/@choco_sister/%EB%B0%A9%ED%99%94%EB%B2%BD</guid>
            <pubDate>Thu, 17 Mar 2022 04:39:47 GMT</pubDate>
            <description><![CDATA[<h2 id="방화벽firewall">방화벽(Firewall)</h2>
<ul>
<li>외부의 불법침입으로부터 내부의 정보자산을 보호하기 위한 정책/하드웨어/소프트웨어의 집합</li>
<li>컴퓨터의 정보보안을 위해 정보통신망 <u>외부→내부, 내부→외부</u>로의 불법 접근을 차단하는 시스템</li>
<li>Access Control List(ACL)를 이용해 네트워크에 전송되는 트래픽에 대한 보안 정책을 설정함</li>
<li><strong>주요기능</strong>: <u>접근제어, 사용자 인증, 감사/로깅, 프록시, 주소변환(NAT), 데이터 암호화</u> 등</li>
</ul>
<p><img src="https://images.velog.io/images/choco_sister/post/08724187-8419-43e5-8144-9e8995fd0cab/%EB%B0%A9%ED%99%94%EB%B2%BD.png" alt=""></p>
<blockquote>
<p><strong>NAT(Network Address Translation)</strong>: 사설 주소와 범용 주소를 매핑 시켜서 가상 사설 네트워크를 지원하는 기술, 외부 네트워크에서 내부 IP 주소를 숨김
<strong>Static NAT</strong>: [내부 IP 주소:외부 IP 주소] 1:1 맵핑
<strong>Dynamic Nat</strong>: [내부 IP 주소:외부 IP 주소] N:M 맵핑
<strong>PAT(Port Addres Translantion)</strong>: 하나의 외부 IP 주소를 다수의 내부 IP 주소가 port 번호로 구분하여 사용함
<strong>Policy NAT</strong>: ACL을 이용, 출발지와 목적지에 따라 주소를 변환함</p>
</blockquote>
<hr>
<h2 id="방화벽의-종류">방화벽의 종류</h2>
<h3 id="1-패킷-필터링-방화벽packet-filtering-firewall">1. 패킷 필터링 방화벽(Packet Filtering Firewall)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/217e68ad-0560-40a8-a39d-ca408c231652/%ED%8C%A8%ED%82%B7%ED%95%84%ED%84%B0%EB%A7%81.png" alt=""></p>
<ul>
<li>1세대 방화벽</li>
<li>동작구간: OSI Layer3(네트워크계층), 4(전송계층)</li>
<li>내우방/외부망 사이에 존재하여 특정 트래픽을 허용/차단하는 단순한 형태의 방화벽</li>
<li><u><strong>패킷 헤더정보 조사</strong></u>: 발신지 주소와 포트를 검사하여 수신측 주소와 포트에 대한 접속 여부 결정</li>
<li>낮은 레이어에서 동작하기 때문에 비교적 속도가 빠르고, 기존 애플리케이션과 연동이 용이함</li>
<li>하드웨어에 의존적이지 않으나 강력한 로깅 기능/사용자 인증을 기대하기 어려움</li>
<li>연결 상태 추적을 하지 않음</li>
<li><strong>패킷 필터링을 사용하는 라우터</strong>: 스크리닝 라우터/패킷 필터링 라우터<blockquote>
<p><strong>라우터를 이용한 네트워크 보안 설정</strong></p>
</blockquote>
</li>
<li><em>Ingress 필터링*</em>: 라우터 외부에서 내부로 유입되는 패킷을 필터링, 인터넷 상에서 사용되지 않는 IP 대역은 공통적으로 필터링 해야함(출발지 IP 주소 유효성 검사)</li>
<li><em>Egress 필터링*</em>: 라우터 내부에서 외부로 나가는 패킷의 소스 ip를 체크하여 필터링, 라우터를 통과해 나가는 패킷 소스 ip는 반드시 라우터와 같은 대역이여야함</li>
<li><em>Blackhole 필터링*</em>: Null 라우팅, 특정한 ip대역에 대해서 Null이라는 가상의 쓰레기 인터페이스로 보냄</li>
<li><em>Unicast RPF(Reverse Path Forwarding)*</em>: 인터페이스를 통해 들어오는 패킷의 소스 ip 에 대해 라우팅 테이블을 확인하여 들어온 인터페이스로 다시 나가는지 확인 (패킷 출발지 ip 주소가 위변조 되었는지 확인함)</li>
</ul>
<h3 id="2-프록시-방화벽-proxy-firewall">2. 프록시 방화벽 (Proxy Firewall)</h3>
<ul>
<li>2세대 방화벽</li>
<li>동작구간: OSI Layer7(어플리케이션계층)</li>
<li>클라이언트와 외부 네트워크와의 중개인의 역할을 하며 이상이 없는 패킷을 목적지로 전달</li>
<li>패킷 필터링보다 더 높은 수준의 보호 능력 제공</li>
<li>패킷 정보를 Application 계층까지 조사</li>
</ul>
<h3 id="3-응용-게이트웨이-방식-application-gateway">3. 응용 게이트웨이 방식 (Application Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/9a5e1dde-2a58-460b-91cb-1a1976cc5d2e/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98.png" alt=""></p>
<ul>
<li>동작구간: OSI Layer7(어플리케이션계층)</li>
<li>외부망과 내부망의 완벽한 구분</li>
<li>내부의 IP 주소를 숨기는 것이 가능</li>
<li>데이터 부분 제어에 따른 높은 로깅 및 감사 기능</li>
</ul>
<h3 id="4-서킷-게이트웨이-방식-circuit-gateway">4. 서킷 게이트웨이 방식 (Circuit Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/0cba790d-0eb6-4020-bd78-18fe1ef622a3/%EC%84%9C%ED%82%B7%20%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4.png" alt=""></p>
<ul>
<li>동작구간: OSI Layer5(세션계층) ~ 7(어플리케이션계층)</li>
<li>공용 Proxy 존재 (서비스별로 존재X)</li>
</ul>
<h3 id="5-상태-기반-조사-방식-stateful-inspection">5. 상태 기반 조사 방식 (Stateful Inspection)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/30fb2adb-d223-4634-ac3e-5419b9b69305/%EC%83%81%ED%83%9C%EC%B6%94%EC%A0%81.png" alt=""></p>
<ul>
<li>3세대 방화벽</li>
<li>패킷 필터링 + Apllication Gateway</li>
<li>패킷으로부터 받은 전송상태, 연결상태, 다른 application 들과의 관계 검사</li>
<li>네트워크 계층에서 패킷을 처리하면서 프로토콜의 상태정보 테이블을 유지하여, 프로토콜의 특성에 따른 변화를 동적으로 대응함 (예로, 내부 사용자가 인터넷으로 ping request를 하면 이에 들어오는 ping reply는 허용하지만 인터넷으로부터 내부자의 request가 존재하지 않은 상태에서 불법적인 ping reply는 허용하지 않음)</li>
<li>연결의 시작부터 끝까지의 모든 활동을 모니터링 하여 관리자가 정한 규칙을 기반으로 필터링함</li>
<li>모든 통신 레이어에서 부석하므로 모든 채널에 대해서 추적 가능</li>
<li>UDP, RPC 패킷도 추적 가능</li>
</ul>
<hr>
<h2 id="방화벽의-구성방식">방화벽의 구성방식</h2>
<h3 id="1-스크리닝-라우터-screening-router">1. 스크리닝 라우터 (Screening Router)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/db351b71-a6f8-4006-809d-8f3534b5da6c/%EC%8A%A4%ED%81%AC%EB%A6%AC%EB%8B%9D%20%EB%9D%BC%EC%9A%B0%ED%84%B0.png" alt=""></p>
<ul>
<li>망과 망 사이에 라우터를 설치하고 라우터에 ACL을 구성함</li>
<li>응용 프로그램 환경변화에 무관하게 동작하므로 투명한 구성이 가능</li>
<li>라우터에 부하를 줌</li>
<li>주로 방화벽 설치가 힘든 중소기업들이 많이 사용함</li>
</ul>
<h3 id="2-베스천-호스트-bastion-host--싱글-홈드-게이트웨이-single-homed-gateway">2. 베스천 호스트 (Bastion Host) / 싱글 홈드 게이트웨이 (Single Homed Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/903f1a76-5a05-4b8f-a63f-2e9f80d71ef1/%EB%B2%A0%EC%8A%A4%EC%B2%9C%ED%98%B8%EC%8A%A4%ED%8A%B8.png" alt=""></p>
<ul>
<li>OSI Layer 7에서 동작</li>
<li>방어 기능을 가진 호스트 시스템</li>
<li>인증기능/모니터링/로깅 등 기능 제공</li>
<li>베스천 호스트가 공격당하면 내부 네트워크 자원 보호 불가능</li>
</ul>
<h3 id="3-듀얼-홈드-게이트웨이-dual-homed-gateway">3. 듀얼 홈드 게이트웨이 (Dual Homed Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/4ad8afb8-969b-4aca-9e74-dee733f96c13/%EB%93%80%EC%96%BC%ED%99%88%EB%93%9C%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4.png" alt=""></p>
<ul>
<li>두 개의 네트워크 인터페이스를 가진 베스천 호스트를 이용해 구성</li>
<li>논리적으로만 구분하는 베스천 호스트와 달리 물리적으로도 구분이 되어 훨씬 안전함</li>
</ul>
<h3 id="4-스크린드-호스트-게이트웨이-screened-host-gateway">4. 스크린드 호스트 게이트웨이 (Screened Host Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/eba0934c-6085-4a53-a102-a4cca01ae086/%EC%8A%A4%ED%81%AC%EB%A6%B0%EB%93%9C%20%ED%98%B8%EC%8A%A4%ED%8A%B8%20%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4.png" alt=""></p>
<ul>
<li>스크리닝 라우터 + 베스천호스트</li>
<li>Layer 3, 4에서 스크리닝 라우터 1차 필터링</li>
<li>Layer 7에서 베스천 호스트가 방어</li>
</ul>
<h3 id="5-스크린드-서브넷-게이트웨이-screened-subnet-gateway">5. 스크린드 서브넷 게이트웨이 (Screened Subnet Gateway)</h3>
<p><img src="https://images.velog.io/images/choco_sister/post/ac08e8df-bce0-445f-bbd6-2b9a67c215bb/%EC%8A%A4%ED%81%AC%EB%A6%B0%EB%93%9C%EC%84%9C%EB%B8%8C%EB%84%B7%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4.png" alt=""></p>
<ul>
<li>스크리닝 라우터 2개 사이에 하나의 서브넷(망)을 구성함: DMZ</li>
<li>스크리닝 라우터 -&gt; 베스천 호스트 서브넷 -&gt; 스크리닝 라우터 -&gt; 내부망</li>
<li>가장 안전하고 비싸며 느리다.</li>
</ul>
<blockquote>
<p><strong>DMZ</strong>: 외부에서 서비스 제공 시 내부 자원을 보호하기 위한 네트워크 구간과 외부 네트워크 구간 사이에서 접근 제한을 수행하는 영역, 내부 네트워크 노출을 막기 위해 구성함</p>
</blockquote>
<hr>
<h2 id="기출문제">기출문제</h2>
<p><strong>1. 패킷 필터링 방화벽과 관련하여 다음 물음에 답하시오. (출처 참고)</strong></p>
<p>1) 존재하지 않는 외부 IP를 이용한 Spoofing 공격에 대응하기 위한 패킷필터링 방화벽 기술의 이름과 원리
2) 공격자가 패킷을 소형 단편화하여 tiny fragment 공격을 수행하는 이유
3) Tiny fragment 공격 대응 방법
4) stateful 패킷필터링과 일반 패킷 필터링 방화벽의 차이점</p>
<details>
    <summary>1 답 보기</summary>
  1) Ingress Filtering <br>
  2)  쪼개진 패킷을 재조합하는 기능을 제공하지 않는 방화벽의 경우 이렇게 다수로 쪼개진 패킷을 탐지하거나 차단할 수 없는 약점이 있기 때문<br>
  3) 단편화된 패킷을 재조합하는 기능이 있는 방화벽을 사용,  Port 번호가 포함되어 있지 않을 정도로 분할된 패킷은 필터링 장비(IDS, IPS)에서 탐지 or 차단<br>
  4) 일반 패킷 필터링 방화벽은 지나가는 패킷 헤더안의 IP주소와 Port 주소만을 단순검색하여 통제함. Tiny fragment 와 같은 공격에 취약하나 처리 속도는 빠름.
Stateful 패킷 필터링 방화벽은 동일한 출발지 IP주소, 출발지 포트 번호, 목적지 IP주소, 목적지 포트 번호 상태 등을 갖는 패킷들의 상태를 저장하고 그룹으로 필터링 함으로써 일반 패킷 필터링 방식보다 신뢰성 높고 정교하게 공격을 막을 수 있음. 예를 들어 SYN 요청을 통해 Establish가 되지 않은 상태에서 Establish된 것처럼 조작된 패킷은 차단 가능함.
</details>

<p><strong>2. 다음의 (A), (B)에 대해서 각각 기술하시오. (출처 참고)</strong>
(A) : Standard 또는 Extended Access-List를 활용하여 라우터 내부로 즉, 사내 네트워크로 유입되는 패킷의 소스 IP주소를 체크하여 허용 또는 거부하도록 하는 것이다.
(B) : 내부에서 라우터 외부로 나가는 패킷의 소스IP주소를 체크하여 허용 또는 거부하도록 하는 것이다.</p>
<details>
    <summary>2 답 보기</summary>
     (A): ingress 필터링, (B): Egress 필터링
</details>

<p><strong>3. 사이트 보안 담당자는 신규 도입된 보안장비(방화벽, IPS, IDS, VPN 등)에 대해 취약점 분석 평가를 실시하고자 한다. 보안장비의 계정관리 측면에서 조치해야할 사항 4가지는?</strong></p>
<p>1) 관리자 계정 - 보안장비에 기본적으로 설정되어 있는 관리자 계정 변경
2) 관리자 계정의 패스워드 - 보안장비에 기본적으로 설정되어 있는 관리자 계정의 패스워드를 변경함
3) 계정별 권한 설정 - 보안장비에 등록된 계정별 권한을 설정
4) 계정 관리 - 보안장비에 등록되어 있는 계정 중 사용하지 않는 계정을 제거 또는 관리</p>
<hr>
<p><a href="https://itwiki.kr/w/%EB%B0%A9%ED%99%94%EB%B2%BD">https://itwiki.kr/w/%EB%B0%A9%ED%99%94%EB%B2%BD</a>
<a href="https://m.blog.naver.com/dang0616/220609594698">https://m.blog.naver.com/dang0616/220609594698</a>
<a href="http://itnovice1.blogspot.com/2019/09/blog-post_46.html">http://itnovice1.blogspot.com/2019/09/blog-post_46.html</a>
<a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=wnrjsxo&amp;logNo=221066364387">https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=wnrjsxo&amp;logNo=221066364387</a>
<a href="https://blog.naver.com/PostView.naver?blogId=stereok2&amp;logNo=222587717690&amp;parentCategoryNo=&amp;categoryNo=28&amp;viewDate=&amp;isShowPopularPosts=true&amp;from=search">https://blog.naver.com/PostView.naver?blogId=stereok2&amp;logNo=222587717690&amp;parentCategoryNo=&amp;categoryNo=28&amp;viewDate=&amp;isShowPopularPosts=true&amp;from=search</a> (기출1번)
<a href="https://tistorysolution.tistory.com/194">https://tistorysolution.tistory.com/194</a> (기출2번)
<a href="https://information-security.tistory.com/269">https://information-security.tistory.com/269</a> (기출3번)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크 보안] 스노트(Snort)]]></title>
            <link>https://velog.io/@choco_sister/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%B3%B4%EC%95%88-%EC%8A%A4%EB%85%B8%ED%8A%B8Snort</link>
            <guid>https://velog.io/@choco_sister/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%B3%B4%EC%95%88-%EC%8A%A4%EB%85%B8%ED%8A%B8Snort</guid>
            <pubDate>Thu, 07 Oct 2021 11:33:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/choco_sister/post/d3666047-7ab3-4b71-9870-b604b4dd0b52/image.png" alt=""></p>
<h2 id="스노트-개요">스노트 개요</h2>
<ul>
<li>네트워크상의 실시간 트래픽 분석 및 패킷 로깅을 수행할 수 있는 오픈소스 네트워크 침입 탐지 시스템(IDS)</li>
<li>1998년 SourceFire사의 CTO Martin Roesch에 의해 발표됨</li>
<li>침입탐지시스템(IDS) 중 가장 널리 사용됨</li>
<li>윈도우, 리눅스 버전이 있음</li>
</ul>
<hr>
<h2 id="스노트-기능">스노트 기능</h2>
<ul>
<li><strong>패킷 스니퍼(Packet Sniffer)</strong> : 네트워크 상의 패킷 스니핑</li>
<li><strong>패킷 로거(Packet Logger)</strong> : 모니터링한 패킷을 저장하고 로그에 남기는 기능</li>
<li><strong>네트워크 침입탐지(IDS/IPS)</strong> : 네트워크 트랙픽 분석 후 침입탐지</li>
</ul>
<hr>
<h2 id="스노트-룰">스노트 룰</h2>
<p><strong>룰 헤더</strong>부분과 <strong>룰 옵션</strong>으로 구성된다.</p>
<h3 id="1-룰-헤더">1. 룰 헤더</h3>
<table>
<thead>
<tr>
<th>액션</th>
<th>프로토콜</th>
<th>송신 IP</th>
<th>송신 PORT</th>
<th>방향</th>
<th>수신 IP</th>
<th>수신 PORT</th>
<th>(룰 옵션)</th>
</tr>
</thead>
<tbody><tr>
<td>탐지 후 행동들</td>
<td>탐지 프로토콜</td>
<td>출발 IP</td>
<td>출발 PORT</td>
<td>탐지방향지정</td>
<td>목적 IP</td>
<td>목적 포트</td>
<td></td>
</tr>
<tr>
<td>#### 1.1. Action: 탐지 후 행동들</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>alert</strong> : 경고를 발생시킨다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>log</strong> : 로그를 기록한다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>pass</strong> : 패킷을 무시한다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>active</strong> : alert를 발생시키고 대응하는 dynamic을 유효화 한다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>dynamic</strong> : active에 의해 유효화된 경우 한쪽의 패킷을 기록한다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>drop</strong> : 패킷을 차단하고 기록한다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>#### 1.2. Protocol: 탐지 할 프로토콜 종류</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>TCP</strong> : TCP 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>UDP</strong> : UDP 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>ICMP</strong> : ICMP 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>IP</strong> : IP 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>#### 1.3. 송신 IP &amp; PORP</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>any</strong> : 모든 포트</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>포트번호</strong> : 특정 포트</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>포트번호:포트번호</strong> : 포트번호 ~ 포트번호</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>:포트번호</strong> : 포트번호 이하 모든 포트</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>포트번호:</strong> : 포트번호 이상 모든 포트</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>예시</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>211.11.22.33 80</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>211.11.22.0/24 443</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>any 80</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>211.11.22.33 any</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>any any</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>&#39;$HOME_NET&#39; 와 같이 snort.conf에서 지정한 변수를 참조할 수도 있다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>#### 1.3. Direction</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>-&gt;</strong> : 출발지 -&gt; 목적지 패킷 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- <strong>&lt;&gt;</strong> : 출발지 목적지 사이 모든 패킷 탐지</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="2-룰-바디">2. 룰 바디</h3>
<ul>
<li>패킷 탐지 사용자 설정</li>
<li>세미콜론(;)을 이용하여 옵션과 옵션을 구분<h4 id="21-일반옵션-설정">2.1. 일반옵션 설정</h4>
</li>
<li><strong>msg</strong> : alert 발생 시 이벤트 명</li>
<li><strong>sid</strong> : 스노트 룰 ID<pre><code>99이하 : 시스템 예약 ID
100 ~ 1000000 이하 : snort 자체지정 sid
1000001 이상 : 사용자 정의 sid</code></pre></li>
<li><strong>rev</strong> : 룰 수정횟수 수정 시 숫자가 증가<h4 id="22-페이로드-범위-설정">2.2. 페이로드 범위 설정</h4>
</li>
<li><strong>dsize</strong> : dzise:&lt;바이트, dsize:바이트&lt;&gt;바이트 와 같이 상한선, 하한선, 범위를 지정할 수 있다.</li>
<li><strong>content</strong> : 문자, 바이너리로 패턴을 탐지한다.<ul>
<li><strong>content</strong>: &quot;문자&quot;</li>
<li><strong>content</strong>: | 00 01 0A AA |</li>
<li><strong>content</strong>: &quot;| 90 90 90 | /bin/sh&quot;</li>
</ul>
</li>
<li><strong>offset</strong> : 검색을 시작할 byte수를 지정한다.</li>
<li><strong>depth</strong> : offset부터 시작하여 검색할 byte수를 지정한다.</li>
<li><strong>nocase</strong> : 대소문 자를 구별하지 않는다.</li>
<li><strong>flags</strong> : TCP 제어 플래그를 지정한다. F, S, FA, FSA 등으로 지정 가능하다.</li>
<li><strong>pcre</strong> : 정규식을 사용한다.</li>
<li><strong>threshold</strong> : 패킷의 발생량을 기반으로 탐지한다.
아직까지 흔히 사용 되고 있지만 공식적으론 사용을 권장하지 않는다.
비슷한 기능을 하진 detection_filter 사용이 권장된다.<ul>
<li><strong>type</strong>        limit(로그발생기준: 임계값), threshold(로그발생기준: 패킷량), both(로그발생기준: IP)</li>
<li><strong>track</strong>        by_src , by_dst</li>
<li><strong>count</strong>        n : number events used by the thresholding</li>
<li><strong>seconds</strong>        m : time period over which count is accrued.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="스노트-예제">스노트 예제</h2>
<p><strong>1. 비정상적인 SSH 로그인 시도 탐지 시나리오 (Brute Force Attack : 30초안에 5번 로그인 시도 공격 탐지)</strong>
<code>alert tcp any any -&gt; any 22 (msg:&quot;SSH Brute Force Attack&quot;; content:&quot;SSH-2.0&quot;; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000001;)</code></p>
<p>*<em>2. 모든 네트워크 대역에서 Telnet으로 접속하는 패킷 중 14번째 자리까지 &#39;anonymous&#39;가 포함된 트래픽에 대해서 &#39;Dangerous&#39; 메시지로 경고하는 snort rule을 만드시오.
*</em>
<code>alert tcp any any -&gt; any 23 (msg:&quot;Dangerous&quot;; content:&quot;anonymous&quot;; depth:14; sid:1;)</code></p>
<p><strong>3. 다음 보기를 보고 문제점과 해결방안을 제시하시오.</strong>
<code>tcp any any -&gt; any any PCRE(/^POST.*Contentx2dLengthx2ax20evilstring)</code>
<strong>3.1. 해당 Rule은 어떤 문제점을 가지고 있는가?</strong>
 Rule에는 HTTP프로토콜에 대한 정규식(POST, Content-Length가 포함)이지만 모든 포트 any로 설정되어 있어 HTTP서비스가 아닌 불필요한 트랙픽에 대해서도 감시를 수행함. 시스템에 오버헤드 유발.
<strong>3.2. 해결방안은 무엇인가?</strong> 목적지 주소와 포트를 웹서버주소, 80 포트로 설정하여 부하를 감소
tcp any any -&gt; 웹서버IP 80</p>
<p><strong>4. 다음의 snort 룰에 대한 물음에 답하시오.</strong>
<code>alter tcp any any -&gt; 80 *msg &quot;XSS&quot;; ①content:&quot;GET&quot;; offset:1; depth:3; ②content:&quot;/login.php?iD:&lt;script?&quot;; distance:1;)</code></p>
<p><strong>4.1. content: &quot;GET&quot;; offset:1; depth:3; 무슨 뜻인가?</strong>
패킷 중 2번째 문자열 부터 3바이트 내에 GET 문자열 있는지 검사(=2번째 문자열부터 4번째 문자열까지 GET 문자열 패턴 검사)
<strong>4.2. content: &quot;/login.php?iD&quot;; distance:1; 무슨 뜻인가?</strong>
첫번째 content 패턴 검색 후 1바이트 떨어진 위치에서  &quot;/login.php?iD&quot; 문자열 있는지 검사
<strong>4.3. 문자열 &quot; GET /login.Php?iD :&lt;script? &quot; 검색이 안된다면 어떻게 변형해야하는가?</strong>
nocase 옵션을 사용, sid 추가
<code>alter tcp any any -&gt; 80 *msg &quot;XSS&quot;; content:&quot;GET&quot;; offset:1; depth:3; content:&quot;/login.php?iD:&lt;script?&quot;; distance:1; **nocase; sid:100001;**)</code></p>
<p><strong>5. 다음의 snort 룰에 대한 물음에 답하시오.</strong>
<code>alert tcp any any &lt; &gt; any ①[443,465,523] (②content:&quot;|18 03 00|&quot;; depth: 3; ③content:&quot;|01|&quot;; distance: 2; within: 1; ④content:!&quot;|00|&quot;; within: 1; ⑤msg: &quot;SSLv3 Malicious Heartbleed Request V2&quot;; sid:1;)</code></p>
<ol>
<li>목적지 포트는 443번, 465번, 523번 포트로 지정한다.</li>
<li>3byte 내에 18 03 00 바이너리 값이 있는지 검사한다.</li>
<li>첫번째 컨텐츠 2byte 떨어진 곳에서 1byte 범위 내에 01 바이너리 값이 있는지 검사한다.</li>
<li>두번째 컨첸츠 끝난 위치에서 1byte 내에 00 바이너리 값이 없는지 검사한다.</li>
<li>alert 알림명으로 SSL~V2를 쓴다.</li>
<li>sid번호 (스노트 룰 번호)는 1로 지정한다.</li>
</ol>
<p><strong>6. 모든 네트워크 대역에서 Telnet으로 접속하는 패킷 중 14번째 자리까지 &#39;anonymous&#39;가 포함된 트래픽에 대해서 &#39;Dangerous&#39; 메시지로 경고한느 snort rule을 만드시오.</strong>
<code>alert tcp any any -&gt; any 23 (msg:&quot;Dangerous&quot;; content:&quot;anonymous&quot;; depth:14; sid:1;)</code></p>
<p><strong>7. 다음은 HTTP GET Flooding 공격에 대한 스노트 탐지이다.</strong>
<code>alert tcp any any -&gt; any 80 (msg:&#39;HTTP Get Flooding Detect&#39;; content:&quot;GET/HTTP1&quot;;(   ); nocase; threshold: type threshold, track by src, count 10, seconds 1; sid:1000001)</code>
<strong>7.1) 스노트 룰의 action 은 패킷이 탐지 되었을때의 처리 방식을 의미한다. 탐지된 패킷을 차단하고 로그를 남기는 action 2가지는</strong>? drop, reject
<strong>7.2) content를 첫번째 바이트로부터 13번째 바이트 범위안애서 검사하고자 할때 () 안에 들어갈 옵션은?</strong>  depth 13
<strong>7.3) threshold 옵션은 특정 시간동안 발생하는 이벤트 수를 제한하여 과도하게 많은 이벤트가 발생하는 것을 방지하기 위한 옵션이다. 위에서 alert 이벤트 발생 수를 제한하는 기준과 방식은?</strong> 출발지를 기준으로 매 1초동안 10번째 이벤트마다 action을 수행</p>
<hr>
<p><a href="https://itwiki.kr/w/%EC%8A%A4%EB%85%B8%ED%8A%B8">https://itwiki.kr/w/%EC%8A%A4%EB%85%B8%ED%8A%B8</a>
<a href="https://goc1221.tistory.com/60">https://goc1221.tistory.com/60</a>
<a href="https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9815">https://q.fran.kr/%EB%AC%B8%EC%A0%9C/9815</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL + PostGis] SHP 파일 import]]></title>
            <link>https://velog.io/@choco_sister/PostgreSQL-PostGis-SHP-%ED%8C%8C%EC%9D%BC-import</link>
            <guid>https://velog.io/@choco_sister/PostgreSQL-PostGis-SHP-%ED%8C%8C%EC%9D%BC-import</guid>
            <pubDate>Mon, 09 Aug 2021 04:45:36 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>pgAdmin 실행 후 DB 추가 혹은 기존 DB 선택</p>
</li>
<li><p>DB 오른쪽 클릭 후 &#39;Query Tool&#39; 선택
<img src="https://images.velog.io/images/choco_sister/post/843b617a-c9aa-4c81-a711-df27b4902ce1/image.png" alt=""></p>
</li>
<li><p>아래 구문 입력 후 Execute</p>
<pre><code>create extension postgis</code></pre><p><img src="https://images.velog.io/images/choco_sister/post/eea6d4be-fe5f-45f3-aed3-8aaaf089fbff/image.png" alt=""></p>
</li>
<li><p>PostGIS 실행 후 connection 정보 입력
<img src="https://images.velog.io/images/choco_sister/post/67687fe7-2cb1-4444-9d5c-5a5241943de3/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>Servhe host는 localhost 혹은 원격 host ip를 입력 / &#39;5432&#39;는 PORT로 필요시 수정</li>
</ul>
<ol start="5">
<li><p>SHP파일에 한국어가 포함되어 있으면 Options 에서 EUC-KR로 인코딩 변경
<img src="https://images.velog.io/images/choco_sister/post/d4c78021-8960-4803-ab13-1d1a13aa6f19/image.png" alt=""></p>
</li>
<li><p>SHP파일 import
<img src="https://images.velog.io/images/choco_sister/post/0150a8eb-d79e-483e-bd33-9066ba2b73c3/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>dbf file (.dbf) can not be opened. Shapefile import failed. 
에러가 발생하면 파일의 경로 중 한글이 포함되어 있는 경로가 있을 수 있음. 이 경우에는 바탕화면/C 로 파일들을 빼주자.</li>
<li>SRID(공간 참조 식별자, Spatial Reference Identifier)는 필요시 설정해주자. (국토정보지리원 정밀지도의 SRID는 32652)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] Vue3 에서 jquey('$') 이용하기 + error '$' is not defined no-undef (Vue-Cli 4.x , jquey 에러)]]></title>
            <link>https://velog.io/@choco_sister/Vue-Vue3-%EC%97%90%EC%84%9C-jquey-%EC%9D%B4%EC%9A%A9%ED%95%98%EA%B8%B0-error-is-not-defined-no-undef-Vue-Cli-4.x-jquey-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@choco_sister/Vue-Vue3-%EC%97%90%EC%84%9C-jquey-%EC%9D%B4%EC%9A%A9%ED%95%98%EA%B8%B0-error-is-not-defined-no-undef-Vue-Cli-4.x-jquey-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Thu, 17 Jun 2021 01:30:02 GMT</pubDate>
            <description><![CDATA[<h3 id="1-jquery-node-module-추가">1. jquery node module 추가</h3>
<pre><code>$ npm install jquery</code></pre><h3 id="2-mainjs-에-아래-코드추가">2. main.js 에 아래 코드추가</h3>
<pre><code class="language-javascript">import jQuery from &#39;jquery&#39;
...
const app = createApp(App)
...
global.$ = jQuery</code></pre>
<h3 id="3-여기서-global-을-정의해도-eslint-때문에-아래와-같은-에러가-생길-수도-있다">3. 여기서 global 을 정의해도 ESlint 때문에 아래와 같은 에러가 생길 수도 있다.</h3>
<p>error &#39;$&#39; is not defined no-undef</p>
<p><img src="https://images.velog.io/images/choco_sister/post/04263dec-acf7-4b39-9452-c01ce93bea99/image.png" alt=""></p>
<ul>
<li><p>원인 : ESlint의 &#39;no-undef&#39; 룰에 의해서 생기는 에러, 변수가 scope 안에 정의되어 있지 않거나 알려진 global(known global) 이 아닐 경우 에러가 생긴다. </p>
</li>
<li><p>해결 : eslint config에 global 옵션 추가</p>
</li>
</ul>
<pre><code>&quot;eslintConfig&quot;: {
    &quot;globals&quot;: {
        &quot;todoEventBus&quot;: &quot;readable&quot;
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue 3] Vue-CLI 4 설치방법]]></title>
            <link>https://velog.io/@choco_sister/Vue-3-Vue-CLI-4-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@choco_sister/Vue-3-Vue-CLI-4-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 16 Jun 2021 07:28:05 GMT</pubDate>
            <description><![CDATA[<p>프로젝트를 설치할 폴더를 하나 생성 후,
cmd에서 이동 후 설치하자.</p>
<h2 id="1-vue-cli-설치">1) Vue-Cli 설치</h2>
<pre><code>$ npm install -g @vue/cli</code></pre><h4 id="버전-확인">버전 확인</h4>
<pre><code>$ vue --version
@vue/cli 4.5.13</code></pre><h2 id="2-프로젝트-생성">2) 프로젝트 생성</h2>
<p>frontend 는 프로젝트 이름으로 원하는 걸로 바꿔서 설치하자.</p>
<pre><code>$ vue create frontend</code></pre><p><img src="https://images.velog.io/images/choco_sister/post/2645d1ae-539e-41d0-a7fb-33529f8bc557/image.png" alt=""></p>
<p>2번째 라인의 &#39;Default (Vue3) ([Vue 3] babel, eslint)&#39; 선택
<img src="https://images.velog.io/images/choco_sister/post/7945a59b-203c-4be6-876c-9aa7fb2cc9d4/image.png" alt=""></p>
<h2 id="3-프로젝트-실행로컬-서버">3) 프로젝트 실행(로컬 서버)</h2>
<pre><code>$ cd frontend
$ npm run serve</code></pre><p>이제 &#39;<a href="http://localhost:8080/&#39;%EB%A1%9C">http://localhost:8080/&#39;로</a> 접속하면 생성된 Vue-Cli 페이지를 확인가능하다. 
<img src="https://images.velog.io/images/choco_sister/post/9e9c9a46-a99f-44b8-81f2-9e442c1c0593/image.png" alt=""></p>
<blockquote>
<p><strong>babel</strong>: 자바스크립트 컴파일러, 최신의 자바스크립트 코드를 이전단계의 자바스크립트 코드로 변환가능하게 해주는 개발 도구, 하위호환성, 트랜스파일러(Transpiler)
<strong>ESLint</strong>: 자바스크립트 문법 에러 표시 도구</p>
</blockquote>
<h2 id="4-gui-사용하기">4) GUI 사용하기</h2>
<pre><code>$ vue ui</code></pre><p>&#39;vue ui&#39; 커맨드를 이용해 GUI 를 통해 프로젝트 플로그인/의존성 관리가 가능하다.
<img src="https://images.velog.io/images/choco_sister/post/648d9521-1445-4a9a-af6b-e31f2689ccf6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue 3] Node Express + Vue-CLI 4.x 생성 및 연동하기 (axios 이용)]]></title>
            <link>https://velog.io/@choco_sister/Vue-3-Vue-CLI-Vuex-VueRouter-Axios-JWT-%EB%A1%9C%EA%B7%B8%EC%9D%B8%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84-1-BackendAPI%EC%84%9C%EB%B2%84-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@choco_sister/Vue-3-Vue-CLI-Vuex-VueRouter-Axios-JWT-%EB%A1%9C%EA%B7%B8%EC%9D%B8%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84-1-BackendAPI%EC%84%9C%EB%B2%84-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Wed, 16 Jun 2021 06:10:15 GMT</pubDate>
            <description><![CDATA[<p><strong>* 시리즈 최종목표</strong></p>
<ul>
<li>뷰 : 로그인, 로그아웃, 회원가입, 관리자화면</li>
<li>회원의 Role에 따라 이용가능한 기능을 제한함 (페이지 접근 제어)</li>
</ul>
<p>*** 현 포스트 목표 **</p>
<ul>
<li>Frontend(Vue-CLI 4.x)와 Backend(Node Express)의 생성</li>
<li>Frontend, Backend 간의 통신 테스트</li>
<li><span style="color:indianred">[주의] Frontend, Backend 를 통합하지 않고 연동만 합니다. </span></li>
</ul>
<p><strong>* 환경설정</strong></p>
<ul>
<li><strong>Backend</strong>: Node Express</li>
<li><strong>Frontend</strong>: 
  vue 3.0.4
  vue-CLI 4.5.13
  webpack 4.46.0</li>
</ul>
<p>Backend, Frontend 폴더 위치는 상관 없습니다.
아래는 현 포스트에서 나오는 결과물의 디렉토리 구조입니다.
<img src="https://images.velog.io/images/choco_sister/post/fe91e3c4-8f3a-42eb-90c4-2f71daa62ba7/image.png" alt=""></p>
<h1 id="1-backendnode-express-생성">1. Backend(Node Express) 생성</h1>
<p>백엔드를 생성할 폴더 생성 후,
cmd에서 해당 디렉토리로 이동 후 아래 명령어 입력</p>
<pre><code>$ npm install express-generator -g</code></pre><p><img src="https://images.velog.io/images/choco_sister/post/338ca81b-38b4-48de-9dc4-fa56e3e7d259/image.png" alt=""></p>
<pre><code>$ express --view=pug backend</code></pre><p>&#39;backend&#39; 부분은 express 앱 이름으로, 원하는 것으로 작성.
<img src="https://images.velog.io/images/choco_sister/post/b4e56f87-24b9-48b5-8102-8a1c81fcea11/image.png" alt=""></p>
<pre><code>$ cd backend
$ npm init
$ npm start</code></pre><p><img src="https://images.velog.io/images/choco_sister/post/674de310-9d7c-4d61-ba4b-6696c592ca46/image.png" alt="">
<img src="https://images.velog.io/images/choco_sister/post/3420520f-af65-4660-bd6a-641e1cb3cbfa/image.png" alt=""></p>
<p>npm init 을 입력했을때 콘솔창에서 &#39;node ./bin/www&#39; 가 출력되면 정상적으로 서버가 동작하고 있는것.
크롬에서 &#39;<a href="http://localhost:3000/&#39;">http://localhost:3000/&#39;</a> 로 접속했을때 위와 같은 화면이 나오면 된다.</p>
<h1 id="2-frontendvue-cli-생성">2. Frontend(Vue-CLI) 생성</h1>
<p>프론트엔드를 생성할 폴더 생성 후,
cmd에서 해당 디렉토리로 이동 후 아래 명령어 입력</p>
<h2 id="1-vue-cli-설치">1) Vue-Cli 설치</h2>
<pre><code>$ npm install -g @vue/cli</code></pre><h4 id="버전-확인">버전 확인</h4>
<pre><code>$ vue --version
@vue/cli 4.5.13</code></pre><h2 id="2-프로젝트-생성">2) 프로젝트 생성</h2>
<p>frontend 는 프로젝트 이름으로 원하는 걸로 바꿔서 설치하자.</p>
<pre><code>$ vue create frontend</code></pre><p><img src="https://images.velog.io/images/choco_sister/post/2645d1ae-539e-41d0-a7fb-33529f8bc557/image.png" alt=""></p>
<p>2번째 라인의 &#39;Default (Vue3) ([Vue 3] babel, eslint)&#39; 선택
<img src="https://images.velog.io/images/choco_sister/post/7945a59b-203c-4be6-876c-9aa7fb2cc9d4/image.png" alt=""></p>
<h2 id="3-프로젝트-실행로컬-서버">3) 프로젝트 실행(로컬 서버)</h2>
<pre><code>$ cd frontend
$ npm run serve</code></pre><p>이제 &#39;<a href="http://localhost:8080/&#39;%EB%A1%9C">http://localhost:8080/&#39;로</a> 접속하면 생성된 Vue-Cli 페이지를 확인가능하다. 
<img src="https://images.velog.io/images/choco_sister/post/9e9c9a46-a99f-44b8-81f2-9e442c1c0593/image.png" alt=""></p>
<blockquote>
<p><strong>babel</strong>: 자바스크립트 컴파일러, 최신의 자바스크립트 코드를 이전단계의 자바스크립트 코드로 변환가능하게 해주는 개발 도구, 하위호환성, 트랜스파일러(Transpiler)
<strong>ESLint</strong>: 자바스크립트 문법 에러 표시 도구</p>
</blockquote>
<p>정상적으로 vue-cli 프로젝트가 실행되는걸 확인했으면, 추가로 아래 모듈들을 설치한다. (프로젝트 폴더(frontend)에 설치)
<span style="color:indianred">해당 포스트만 참고하고 시리즈(JWT 회원관리)에는 관심없으시면 <strong>axios만 설치하시면 됩니다!!</strong></span></p>
<pre><code>npm install axios
npm install vue-router@4
npm install vuex@next --save
npm install vee-validate@next --save
npm install bootstrap jquery popper.js
npm install @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/vue-fontawesome@prerelease
</code></pre><h2 id="4-gui-를-사용해-의존성-확인하기-선택">4) GUI 를 사용해 의존성 확인하기 (선택)</h2>
<pre><code>$ vue ui</code></pre><p>&#39;vue ui&#39; 커맨드를 이용해 GUI 를 통해 프로젝트 플러그인/의존성을 조회할 수 있다.
앞서 설치했던 모듈들을 확인해보자.</p>
<p><img src="https://images.velog.io/images/choco_sister/post/3e4ec55d-0a08-4355-9ce1-3cbf46b5fa00/image.png" alt=""></p>
<h1 id="3-백엔드-프론트엔드-통신-테스트">3. 백엔드-프론트엔드 통신 테스트</h1>
<h2 id="1-백엔드-express">1) 백엔드 (Express)</h2>
<h3 id="1-routesindexjs-파일-수정">1. &#39;routes/index.js&#39; 파일 수정</h3>
<p>GET, POST 두 가지의 방식을 이용해 통신해 볼 것이다.
&#39;/getTest&#39; 로는 단순 응답을, &#39;/postTest&#39;에서는 클라이언트에서 보낸 parameter를 이용해 응답을 준다.
index.js 파일을 아래처럼 수정하자.</p>
<pre><code class="language-javascript">var express = require(&#39;express&#39;);
var router = express.Router();

/* GET home page. */
router.get(&#39;/&#39;, function(req, res, next) {
  res.render(&#39;index&#39;, { title: &#39;Express&#39; });
});

router.get(&#39;/api/getTest&#39;, async (req, res) =&gt; {
  try {
    res.send({
      msg: &#39;This my response : get&#39;
    })
  } catch (err) {
    console.log(err);
    res.send({
      error: &#39;Can&quot;t read api data&#39;,
    });
  }
});

router.post(&#39;/api/postTest&#39;, async (req, res) =&gt; {
  try {
    console.log(req.body)
    res.send({
      msg: &#39;Hi!&#39; + req.body.name
    })
  } catch (err) {
    console.log(err);
    res.send({
      error: &#39;Can&quot;t read api data&#39;,
    });
  }
});

module.exports = router;
</code></pre>
<p>그리고 백엔드를 재시작한 후 &#39;<a href="http://localhost:3000/post/getTest&#39;">http://localhost:3000/post/getTest&#39;</a> 에 접속하면 응답이 오는걸 확인 가능하다.
<img src="https://images.velog.io/images/choco_sister/post/ca871296-e291-4f52-925a-55bb66a5ece5/image.png" alt=""></p>
<p>혹은 REST API를 테스트할 수 있는 도구를 이용하면 되는데,
나는 크롬확장프로그램인 &#39;REQBIN&#39;을 이용하여 테스트했다.</p>
<ul>
<li>post Test (매개변수 name 값인 &#39;choco&#39; 이용해 응답한다.)
<img src="https://images.velog.io/images/choco_sister/post/8bf5c4b0-6840-4ada-aeef-191b827afcad/image.png" alt=""></li>
</ul>
<h2 id="2-프론트엔드-vue">2) 프론트엔드 (Vue)</h2>
<h3 id="1-vueconfigjs-파일-추가">1. &#39;vue.config.js&#39; 파일 추가</h3>
<p>프로젝트 루트에 &#39;vue.config.js&#39; 파일을 생성하고 아래 코드를 넣는다.
웹팩 개발 서버(프론트엔드)에서 Express(백엔드)로 프록시 요청을 함.</p>
<blockquote>
<p><strong>프록시(Proxy)</strong>: 프록시는 &#39;대리&#39; 라는 뜻으로, 네트워크 통신에서 &#39;대리 응답&#39; 등에 사용하는 개념. 보안상의 문제로 직접 통신할 수 없는 두 지점 사이에서 프록시를 이용해 중계를 하는 개념.</p>
</blockquote>
<pre><code class="language-javascript">module.exports = {
    devServer: {
        proxy: { 
            &#39;/api&#39;: { 
                target: &#39;http://localhost:3000/api/&#39;, 
                changeOrigin: true, 
                pathRewrite:{ &quot;^/api&quot; : &#39;&#39; } 
            } 
        },
        headers: { &quot;Access-Control-Allow-Origin&quot;: &quot;*&quot; }
    }
}</code></pre>
<p><img src="https://images.velog.io/images/choco_sister/post/00b9bef9-8011-478f-af22-7b6c1c3d397d/image.png" alt=""></p>
<h3 id="2-component-수정-통신-test-용">2. component 수정 (통신 test 용)</h3>
<p>&#39;src&gt;components&gt;HelloWorld.vue&#39; 파일을 아래와 같이 수정한다.
아주 간단한 통신 테스트로, 반응형 변수로 선언된 &#39;getMsg&#39;와 &#39;postMsg&#39;에 통신 결과값을 대입해 화면에 보여준다.</p>
<pre><code class="language-javascript">&lt;template&gt;
  &lt;div&gt;
    &lt;h1&gt;{{state.getMsg}}&lt;/h1&gt;
    &lt;h1&gt;{{state.postMsg}}&lt;/h1&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
import { onMounted, reactive } from &#39;vue&#39;
import axios from &#39;axios&#39;

export default {
  name: &#39;Test&#39;,
  setup () {
    const state = reactive ({
      getMsg: &#39;&#39;,
      postMsg: &#39;&#39;
   })

    onMounted(() =&gt; {
      try {
        let urlGet = &#39;/api/getTest&#39;;
        axios.get(urlGet, {
        })
        .then(function (response) {
          state.getMsg = response.data.msg
        })
        .catch(function (error) {
          alert(error);
        });


        let urlPost = &#39;/api/postTest&#39;;
        axios.post(urlPost, {
          name: &#39;choco&#39;
        }).then(function (response) {
          state.postMsg = response.data.msg
        })
        .catch(function (error) {
          alert(error);
        });
     } catch (err) {
        console.log(err);
      }
    });

    return {
      state
    }
  }
}
&lt;/script&gt;

&lt;style scoped&gt;
&lt;/style&gt;
</code></pre>
<p><img src="https://images.velog.io/images/choco_sister/post/68f77fd4-b805-4903-b6ce-3ebb1bf4e57c/image.png" alt=""></p>
<p>통신 결과값이 정상적으로 출력되는걸 확인할 수 있다.
다음 포스트에서는 Vue router 를 이용해 화면 전환(로그인/관리자화면/일반유저화면)을 하는 방법을 포스팅하겠습니다.</p>
<p>참고:
<a href="http://expressjs.com/ko/starter/generator.html">http://expressjs.com/ko/starter/generator.html</a> (express)
<a href="https://bezkoder.com/vue-3-authentication-jwt/">https://bezkoder.com/vue-3-authentication-jwt/</a> (회원가입)
<a href="https://cli.vuejs.org/guide/installation.html">https://cli.vuejs.org/guide/installation.html</a> (vue-cli)
<a href="https://cli.vuejs.org/guide/creating-a-project.html#using-the-gui">https://cli.vuejs.org/guide/creating-a-project.html#using-the-gui</a> (vue-cli 프로젝트 생성)
<a href="https://next.router.vuejs.org/installation.html">https://next.router.vuejs.org/installation.html</a> (vue-router4)
<a href="https://next.vuex.vuejs.org/installation.html">https://next.vuex.vuejs.org/installation.html</a> (vuex4)
<a href="https://vee-validate.logaretm.com/v4/">https://vee-validate.logaretm.com/v4/</a> (vee-validate v4)
<a href="https://milkye.tistory.com/202">https://milkye.tistory.com/202</a> (프록시)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발자를 위한 블로그 플랫폼 비교분석 (naver, tisotry, velog, medium, github, blogger...?)]]></title>
            <link>https://velog.io/@choco_sister/%EA%B8%B0%EC%88%A0%EB%B8%94%EB%A1%9C%EA%B7%B8%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@choco_sister/%EA%B8%B0%EC%88%A0%EB%B8%94%EB%A1%9C%EA%B7%B8%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 15 Jun 2021 06:49:17 GMT</pubDate>
            <description><![CDATA[<p>IT 업계에 계신 분이라면 누구나 다 기술블로그를 하나쯤 만들어볼까 하는 시기가 한번쯤은 오지 않을까요?</p>
<p>저 역시 기술 포트폴리오 겸 개발 관련 지식을 공유하고 싶어 기술 블로그를 하나 만들기로 결심했는데, 요즘 괜찮은 블로그 플랫폼이 너무 많아 정하기가 너무 힘들더라구요.</p>
<p>그래서 네이버/티스토리/벨로그(Velog)/미디엄(Medium)/깃허브(Github)블로그/구글 블로거(Blogger)를 한번 비교해봤습니다.</p>
<h3 id="1-블로그-플랫폼-비교">1) 블로그 플랫폼 비교</h3>
<p>플랫폼|특징/장점|단점|용도
|--|----|----|--|
네이버(Naver)|국내 검색엔진 특화<br>진입장벽 매우 낮음<br>이웃/소통에 좋음<br>패션/뷰티는 무조건 네이버|커스마이징 되긴 하지만 별로..<br>구글에서 검색 잘 안됨|일상,맛집,리뷰,뷰티 등
티스토리(Tistory)|진입장벽 매우 낮음<br>커스마이징이 쉬움(괜찮은 템플릿이 많이 풀려있음)<br>수익/통계/구독 있음|코드블럭이 그저그럼<br>개발친화적이라기엔 조금 애매함(다양한 주제로 글쓰기 가능)<br>카카오가 브런치를 많이 밀어주면서 포지션이 더 애매해짐|리뷰, 여행, 개발 
벨로그(Velog)|프론트엔드 개발자 벨로퍼트님이 개발<br>편함 깔끔함 심플함<br>글 작성이 매우 직관적임<br>개발특화<br>조회수/통계/구독 기능 있음(최근 추가됨)<br>팀블로그로 좋음|마크다운으로만 작성 가능<br>수익은 추후 추가 예정<br>커스마이징 어려움<br>개인이 운영|개발
미디엄(Medium)|해외에서 많이 사용하는듯<br>구독 수익 통계 기능 있음<br>피드백이 좋음<br>개발특화<br>팀블로그로 좋음|글쓰기 개수 제한 있음(결제하면 업그레이드 가능)<br>한글 폰트가 별로라고함<br>커스터마이징 어려움|개발
깃허브(Github)블로그|확장성이 좋음<br>커스마이징 매우 좋음(Jekyll외 Ghost, Hexo 같은 정적 사이트 생성기와 연동 가능)<br>개발특화|초기세팅이 어려움<br>github를 안해봤거나, 개발자가 아니라면 접근성이 낮음 (불친절함)<br>Github Pages 트래픽 제한 (월100GB)<br>하나의 저장소가 1GB를 넘어가면 돈을 내고 사용해야함(이미지 블로깅엔 적합하지 않음)|개발
블로거(Blogger)|갓구글에서 서비스함<br>해외 친화적<br>1계정당 100개의 블로그 생성 가능(굳이)|검색 노출이 잘 안된다고함<br>마크다운 지원 안됨<br>커스마이징 어려움|다양한 주제/영어로 글쓰고 싶으신분</p>
<h3 id="2-기술-블로그">2) 기술 블로그</h3>
<p>사실 velog/medium 이 개발자 친화적이고 (비교적) 사용이 간편해서 
이 둘 플랫폼 중에서 고민하다가</p>
<ul>
<li>tistory는 마크다운이 가능하나, 전반적으로 개발친화적이라고 보기에는 어려워 개발자에겐 애매한 포지션</li>
<li>medium은 포스팅 갯수 제한때문에 고민됨</li>
<li>github는 초기 구축이 귀찮음</li>
</ul>
<p>이런 이유로 velog에 글을 1개 작성해봤는데 웬걸!! 글 작성이 매우 쉽고 직관적이었다. 개발 글을 올리기에 정말 최적화가 잘되있었다.</p>
<p>이제 드디어 개발 플랫폼을 정했다고 신나하고 있었는데 누군가 정성스레 잘 만든 github 블로그를 보고나니 디자인에 대한 욕심이 생겨서 <del>github 블로그로 결정했다.</del></p>
<p>만약 개발자라도 프론트엔드에 관심이 없거나, 블로그를 예쁘게 커스터마이징 하는데 관심이 없으면 velog/medium을 추천한다.</p>
<p><del>아니면 귀찮음을 감수하고서라도 나만의 예쁜 블로그가 갖고싶으면 github블로그를 추천함.</del></p>
<p><strong>→ 돌아서 다시 velog로 정착함!!</strong></p>
<p>어째서? 냐면 나는 이미지를 굉장히 많이 올리고 싶은데,
깃허브 블로그에 이미지를 올리려면 repo에 올린 후 가져오거나, url을 가져와야 하기 때문이다.
만약, 한 포스팅이 이미지 10개가 올라간다고 치면,
10개의 이미지를 또 업로그하고 그 URL을 가져와야한다는 소린데......</p>
<p>그때문에 다시 tistory도 고려해봤으나,
동일 주제로 구글에 검색하면 velog가 최상단에 있는걸 확인하고
<strong>SEO 최적화때문에 velog로 결정했습니다.</strong></p>
<h3 id="3-결론">3) 결론</h3>
<p>그래서 결론은</p>
<blockquote>
<p>기술블로그는 velog로 운영하기로함</p>
</blockquote>
<p>이 글은 모두 주관적인 기준에 의해 쓰여진 것입니다!
혹시 기술 블로그를 시작하고자 하는 분들께 도움이 됬으면 좋겠네요.</p>
]]></description>
        </item>
    </channel>
</rss>