<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>nochik_k.log</title>
        <link>https://velog.io/</link>
        <description>느리지만 굳세고 단단하게 성장하고픈 FE</description>
        <lastBuildDate>Sun, 07 May 2023 03:22:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. nochik_k.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/nochik_k" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Network 스터디 7회차] 회고]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-8%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-8%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 07 May 2023 03:22:32 GMT</pubDate>
            <description><![CDATA[<p>2023.04.11~2023.05.06(4주 / 주 2회) 
JS 코드에서 진행했던 CS-네트워크 면접대비 스터디에 참여한 그 회고를 남겨보고자 한다.</p>
<p><strong>- 활동 내용</strong>
 네트워크의 개념 중 일부를 매 회차마다 나눠, 다음 회차까지 개인적으로 정리를 하는 방식이었다. 이후 스터디 시간에는 4인으로 구성된 조로 돌아가면서 면접자, 지원자, 관찰자 역할로 정리해온 내용을 기반으로 면접을 진행했다. </p>
<p> (주로 다뤘던 내용 HTTP / TCP 계층 / IP 계층)</p>
<p>** - 활동 증거자료**
 <a href="https://velog.io/@nochik_k/series/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC">네트워크 스터디의 기록</a></p>
<p>-** 성과**
 네트워크를 따로 공부한 것은 처음이었는데, 깊은 부분에 대해서는 아직 더 공부가 필요하지만 전반적인 개념을 숙지할 수 있었다.
그리고, 앞으로의 CS 공부방향에 대한 감도 잡을 수 있었다.</p>
<p><strong>- 팀원들이 나를 바라본 이미지 및 장점</strong>
  몇 회간에 걸친 면접 시뮬레이션을 마치고, 조원들에게 피드백을 들었다.
  공통적인 의견으로 아이스 브레이킹, 분위기를 편안하게 느껴지게 하는 소프트 스킬이 좋다는 얘기를 들을 수     있었다.</p>
<p><strong>- 배운 점, 좋았던 점</strong>
  혼자 CS 공부를 한다는 것이 굉장히 막막하게 느껴져서 신청한 스터디였는데, 나에게는 3가지의 이유에서 유익했다.</p>
<ol>
<li>공부에 참고할 수 있는 자료와 여러 면접 팁을 제공해준다는 점에서, 기존에 스터디와 면접 경험이 없는 나에게는 많은 도움이 되었다.<ol start="2">
<li>이미 네트워크를 공부해본 경험이 있는 조원들도 있어서, 그들의 답변을 들으며 어떤 식으로 말하면 더 좋을지 생각할 수 있는 시간이었다. </li>
<li>직장이나 교육을 들으면서도 빠지지 않고 스터디에 임하시는 분들에게서, 그들의 열정과 배우고 성장하고 싶은 태도가 전해지는 느낌이었다.</li>
</ol>
</li>
</ol>
<p>*<em>- 힘들었던 점 *</em>
네트워크는 공부하면 공부할수록 한없이 깊어질 수 있겠다는 생각이 들었다. 프로젝트와 다른 CS 과목에 대한 공부와 코딩테스트 준비해야할 것을 생각하면, 그만큼의 시간을 투자할 여건은 충분하지 않은데 어느 정도까지 알고 있어야할지 고민이 됐다.
=&gt; 이 고민을 멘토분에게 여쭤봤을 때, 핵심적인 내용을 3문장 내외로 말할 수 있을 정도로 준비를 해놓고, 시간이 생긴다면 추가로 공부하는 것도 좋을 것 같다는 답변을 듣고 그렇게 따로 정리하니 마음이 한결 후련해졌다.</p>
<p><strong>- 아쉬웠던 점, 반성하고 싶은 점</strong>
스터디의 운영이나 진행방향에 대해선, 아쉬웠던 점이 없었다.
다만, 스스로 반성하고 고칠 점 3가지와 앞으로의 다짐을 적어보려한다.</p>
<ol>
<li><p>표정관리
면접을 마치고 조원들에게 받은 피드백으로, 당장 생각이 나지 않는 질문에 대해 인상을 찌푸린다거나 다소 당황스러운 모습을 보이는 것이 눈에 보인다.</p>
<p>=&gt; 스스로 인지하고 있던 단점으로, 거울보면서 연습하거나 동영상으로 찍어보며, 시선처리나 그외의 모습을 고칠 것이다.</p>
</li>
<li><p>태도
스스로에게 &#39;이번 스터디에 진심이었는가?&#39;라는 질문을  물었을 때 확신을 가지고 &#39;그렇다&#39;라고 대답할 수 없었다. 어느 회차엔 숙제를 채운다는 느낌으로 다소 형식적으로 임했던 것 같다.</p>
<p>=&gt; 내가 진심으로 임하지 않으면, 시간을 더 투자해야한다거나 등의 짐을 스스로에게 부여하는 꼴일 것이다. 앞으로의 스터디에선 더 진정성있게 임하여, 더 값진 결과물을 낼 수 있도록 노력해야겠다.</p>
<ol start="3">
<li>정리하는 습관
스터디 매 회차마다 공부한 내용을 어느 곳에든 적어야만 했는데, 가독성이 좋다거나, 내용을 잘 정리하진 못했던 것 같다.</li>
</ol>
<p>=&gt; 이번 스터디로 네트워크 공부를 끝냈다고 생각하지는 않기에, 추가로 공부하며 내용을 수정할 것이며, 다른 분들이 정리해 둔 자료의 목차나 구성을 참고해서 짜임새 있게 글을 적어보려한다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 운영체제 질답 정리]]></title>
            <link>https://velog.io/@nochik_k/CS-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%A7%88%EB%8B%B5-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@nochik_k/CS-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%A7%88%EB%8B%B5-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 01 May 2023 11:59:05 GMT</pubDate>
            <description><![CDATA[<h1 id="운영체제-질답">운영체제 질답</h1>
<p>1일 5개씩 채울 예정</p>
<ol>
<li><strong>운영체제가 무엇인가요?</strong><blockquote>
<p>운영체제(Operating System, OS)는 컴퓨터 하드웨어와 소프트웨어 리소스를 관리하고 사용자와 컴퓨터 간의 인터페이스 역할을 하는 시스템 소프트웨어입니다. 주요 기능으로는 프로세스 관리, 메모리 관리, 파일 시스템 관리, 입출력 관리 등이 있습니다. 사용자의 요청을 해석하고 컴퓨터 자원을 효율적으로 분배하며, 하드웨어와 소프트웨어 간의 연결고리 역할을 수행합니다.</p>
</blockquote>
</li>
</ol>
<ol start="2">
<li><p><strong>멀티 프로그래밍 시스템에 대해 설명 해주세요.</strong></p>
<blockquote>
<p>멀티 프로그래밍 시스템은 여러 개의 프로그램이 동시에 메모리에 적재되어 실행되는 컴퓨터 시스템입니다. 이 시스템은 CPU의 효율적인 사용을 목표로 하여, 한 프로그램의 실행이 대기 상태에 있을 때 다른 프로그램이 실행됩니다. 멀티 프로그래밍은 시스템의 자원을 최대한 활용하여 전체적인 처리량을 높이고 응답 시간을 줄입니다. 이를 통해 컴퓨터 자원의 낭비를 최소화하며 사용자들에게 동시에 서비스를 제공할 수 있게 됩니다.</p>
</blockquote>
</li>
<li><p><strong>멀티 프로세싱 시스템에 대해 설명해주세요.</strong></p>
<blockquote>
<p>멀티 프로세싱 시스템은 여러 개의 프로세서(CPU)를 가진 컴퓨터 시스템으로, 동시에 여러 작업을 처리할 수 있습니다. 이러한 시스템은 병렬 처리를 통해 프로그램의 실행 속도를 높이고 전체적인 시스템 성능을 향상시킵니다. 멀티 프로세싱 환경에서는 프로세서 간의 작업 분배와 협업이 중요한 요소로 작용하며, 이를 효율적으로 관리하는 것이 운영체제의 역할입니다. 이 시스템은 고성능 컴퓨팅, 대규모 데이터 처리, 실시간 시스템 등 다양한 분야에서 활용되고 있습니다.</p>
</blockquote>
</li>
<li><p><strong>타임 쉐어링 시스템에 대해 설명해주세요.</strong></p>
<blockquote>
<p>타임 쉐어링 시스템은 여러 사용자가 동시에 컴퓨터를 공유하며 사용할 수 있는 컴퓨팅 방식입니다. 이 시스템은 CPU의 작업 시간을 작은 단위로 나누어 여러 사용자에게 할당함으로써, 각 사용자에게 동시에 실행되는 것처럼 느끼게 합니다. 이를 통해 컴퓨터의 자원을 효율적으로 활용하고, 여러 사용자가 동시에 작업을 수행할 수 있게 됩니다. 타임 쉐어링 시스템은 빠른 응답 시간을 중요시하며, 사용자 간의 상호작용이 많은 작업에서 특히 유용합니다. 이러한 시스템은 멀티태스킹, 멀티유저 시스템 등과 밀접한 관련이 있습니다.</p>
</blockquote>
</li>
<li><p><strong>인터렉티브 시스템에 대해 설명해주세요.</strong></p>
<blockquote>
<p>인터렉티브 시스템은 사용자와 컴퓨터 간의 직접적인 상호작용이 이루어지는 컴퓨팅 환경을 말합니다. 이 시스템은 사용자의 입력에 대해 즉각적인 응답을 제공함으로써, 직관적이고 효율적인 작업 수행이 가능합니다. 인터렉티브 시스템은 주로 그래픽 사용자 인터페이스(GUI)와 터치스크린 기반의 디바이스에서 사용되며, 사용자 친화적인 작업 환경을 제공합니다. 이러한 시스템은 즉각적인 피드백이 필요한 응용 프로그램, 게임, 멀티미디어 등 다양한 분야에서 활용되고 있습니다. 인터렉티브 시스템의 핵심은 사용자 경험(UX) 향상을 위한 인터페이스 설계와 효율적인 자원 관리에 있습니다.</p>
</blockquote>
</li>
<li><p><strong>커널에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>커널모드에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>폴링에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>인터럽트에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>DMA에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>동기식 입출력에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>비동기식 입출력에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>프로세스와 쓰레드에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>멀티 쓰레딩에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>스와핑에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>CPU 스케줄링에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>FCFS 방식에 대해 설명해주세요.</strong> </p>
</li>
<li><p><strong>라운드 로빈 방식에 대해 설명해주세요.</strong> </p>
</li>
<li><p><strong>SJF(Shortest Job First) 방식에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>SRTF 방식에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>멀티 레벨 큐에 대해 설명해주세요.</strong> </p>
</li>
<li><p><strong>멀티 레벨 피드백 큐에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>병행성에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>Race Condition에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>Critical Section에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>DeadLock에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>DeadLock 발생 조건은?</strong></p>
</li>
<li><p><strong>DeadLock을 막는 방법은?</strong></p>
</li>
<li><p><strong>Mutual Exclusion에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>Mutual Exclusion을 할 수 있는 방법은?</strong></p>
</li>
<li><p><strong>Mutex에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>이진 세마포어와 Mutex의 차이는?</strong></p>
</li>
<li><p><strong>세마포어에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>모니터에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>DeadLock에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>절대 주소 지정과 상대주소 지정의 차이점은?</strong></p>
</li>
<li><p><strong>메모리 분할에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>메모리 배치 기법에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>colaescing(통합)에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>compaction(압축)에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>버디 시스템에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>페이징에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>세그멘테이션에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>가상 주소를 실 주소를 어떻게 변환하죠?</strong></p>
</li>
<li><p><strong>가상 메모리에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>페이지 교체에 대해서 설명해주세요.</strong></p>
</li>
<li><p><strong>LRU에 대해 설명 해주세요.</strong></p>
</li>
<li><p><strong>LFU에 대해 설명 해주세요.</strong></p>
</li>
<li><p><strong>클럭 알고리즘에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>쓰레싱에 대해 설명해주세요.</strong></p>
</li>
<li><p><strong>워킹 알고리즘에 대해 설명해주세요.</strong> </p>
</li>
<li><p><strong>페이지 부재 빈도 알고리즘에 대해 설명해주세요.</strong></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 6회차] ]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-6%ED%9A%8C%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-6%ED%9A%8C%EC%B0%A8</guid>
            <pubDate>Sun, 30 Apr 2023 05:01:29 GMT</pubDate>
            <description><![CDATA[<p><strong>쿠키나 세션, 토큰이 필요한 이유</strong>
HTTP는 기본적으로 상태가 없는(stateless) 프로토콜이기 때문에, 이전 요청과 관련된 정보가 새로운 요청에 자동으로 전달되지 않기에, HTTP 상태를 유지하기 위해 클라이언트와 서버가 상호작용시 이전 정보를 기억할 수 있게 해주는 방법으로 사용한다. </p>
<h3 id="쿠키">쿠키</h3>
<blockquote>
<p>쿠키(Cookie)는 웹사이트에서 사용자의 정보를 추적하고 관리하기 위해 사용되는 기술 중 하나로, 웹사이트가 사용자의 컴퓨터에 저장하는 작은 텍스트 파일이다.</p>
</blockquote>
<p><strong>쿠키를 통한 HTTP 상태유지 작동 방식</strong></p>
<ol>
<li>클라이언트가 서버에 처음 요청을 보낸다.</li>
<li>서버는 응답과 함께 Set-Cookie 헤더를 사용하여 쿠키를 클라이언트에게 전달합니다. 이 헤더는 쿠키의 이름, 값, 만료일, 도메인, 경로 등의 정보를 포함한다.</li>
<li>클라이언트는 쿠키를 브라우저에 저장한다.</li>
<li>클라이언트가 서버에 추가 요청을 보낼 때, 브라우저는 자동으로 쿠키를 포함한 Cookie 헤더를 요청에 추가한다.</li>
<li>서버는 클라이언트로부터 받은 쿠키 정보를 사용하여 이전 상태를 파악하고, 그에 따른 적절한 응답을 클라이언트에게 전달한다.</li>
</ol>
<p><strong>장점</strong></p>
<ol>
<li>사용자 경험 개선: 사용자의 환경 설정, 로그인 상태 등과 같은 정보를 기억하여 웹 사이트 방문 시 사용자에게 맞춤화된 경험을 제공할 수 있다.</li>
<li>서버 부하 감소: 클라이언트 측에 데이터를 저장함으로써 서버의 저장 공간과 처리 부하를 줄일 수 있다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>보안 문제: 쿠키는 클라이언트 측에 저장되기 때문에 악의적인 사용자가 쿠키를 탈취하거나 변조할 가능성이 있기에, 중요한 정보는 쿠키에 저장하지 않는 것이 좋다.</li>
<li>용량 제한: 쿠키는 용량이 제한되어 있어(약 4KB) 많은 정보를 저장할 수 없다.</li>
<li>브라우저 호환성: 일부 브라우저에서는 쿠키를 지원하지 않거나 사용자가 쿠키를 비활성화할 수 있다. 이 경우 쿠키를 사용한 상태 유지 기능이 작동하지
않기에 이러한 상황에 대비해야 한다.</li>
<li>개인 정보 침해 우려: 쿠키는 사용자의 행동을 추적하고 개인화된 경험을 제공하기 위해 사용되기 때문에, 사용자의 개인 정보 보호에 대한 우려가 있다. 이러한 이유로 일부 사용자들은 쿠키를 비활성화하거나 정기적으로 삭제할 수 있다.</li>
</ol>
<h3 id="세션">세션</h3>
<blockquote>
<p>세션(Session)은 사이트에서 사용자의 정보를 추적하고 관리하기 위해 사용되는 기술 중 하나로, 서버와 클라이언트 사이의 일시적인 상호작용을 의미한다.</p>
</blockquote>
<p><strong>세션을 통한 HTTP 상태유지 작동 방식</strong></p>
<ol>
<li>클라이언트가 서버에 요청을 보낸다(예: 로그인 요청).</li>
<li>서버는 요청을 처리한 후, 세션을 생성하고 세션 ID를 생성한다. 이 세션 ID는 클라이언트와 서버 간의 상호 작용을 식별하는데 사용된다.</li>
<li>서버는 응답과 함께 Set-Cookie 헤더를 사용하여 세션 ID를 클라이언트에게 전달한다.</li>
<li>클라이언트는 세션 ID를 쿠키로 저장하고, 이후 요청 시 세션 ID를 포함한 Cookie 헤더를 요청에 추가한다.</li>
<li>서버는 클라이언트로부터 받은 세션 ID를 사용하여 해당 세션에 저장된 정보를 조회하고, 이를 기반으로 적절한 응답을 클라이언트에게 전달한다.</li>
</ol>
<p><strong>장점</strong></p>
<ol>
<li>보안: 중요한 정보가 서버 측에서 관리되기 때문에 클라이언트에서 정보가 탈취되거나 변조될 가능성이 줄어든다.</li>
<li>저장 용량: 세션은 서버에서 관리되므로 쿠키보다 더 많은 정보를 저장할 수 있다.</li>
<li>사용자 개인화: 사용자의 환경 설정, 로그인 상태 등과 같은 정보를 저장하여 웹 사이트 방문 시 사용자에게 맞춤화된 경험을 제공할 수 있다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>서버 부하 증가: 세션 정보가 서버에 저장되기 때문에 서버의 저장 공간과 처리 부하가 증가할 수 있다. 이를 해결하기 위해 세션 정보를 분산 저장하거나, 서버의 자원을 적절히 관리해야 한다.</li>
<li>세션 타임아웃: 세션은 일정 시간동안 유효하며, 이 시간이 지나면 세션 정보가 삭제된다. 따라서 사용자가 웹사이트를 오랫동안 방문하지 않을 경우, 저장된 정보가 소멸되어 사용자가 다시 로그인해야 하는 등의 불편함이 발생할 수 있다.</li>
<li>확장성 문제: 웹 사이트의 규모가 커질수록 세션 관리에 필요한 자원과 처리 과정이 복잡해질 수 있습니다. 이를 해결하기 위해 로드 밸런서, 세션 클러스터링 등의 기술을 사용할 수 있다.</li>
</ol>
<h3 id="토큰">토큰</h3>
<blockquote>
<p>토큰은 클라이언트와 서버 간에 인증, 권한 부여, 정보 전달 등의 목적으로 사용되는 문자열로, 웹 서비스에서 상태 유지를 위한 중요한 기술이다. 토큰은 일반적으로 암호화되어 안전하게 전송되며, 서버는 토큰을 통해 사용자를 식별하고 인증한다.</p>
</blockquote>
<p><strong>토큰을 통한 HTTP 상태유지 작동 방식</strong></p>
<ol>
<li>클라이언트가 서버에 로그인 요청을 한다.</li>
<li>서버는 사용자의 인증 정보를 확인한 후, 토큰을 생성하고 클라이언트에게 전달한다.</li>
<li>클라이언트는 받은 토큰을 저장한 후, 이후 요청에서 토큰을 헤더에 포함시켜 서버에 전송한다.</li>
<li>서버는 클라이언트로부터 받은 토큰을 검증하고, 사용자의 인증 상태와 권한을 확인한다.</li>
<li>클라이언트의 요청에 따라 서버는 적절한 응답을 전송한다.</li>
</ol>
<p><strong>장점</strong></p>
<ol>
<li>상태를 저장하지 않는 서버: 토큰은 클라이언트 측에서 관리되기 때문에, 서버는 상태를 저장할 필요가 없어서, 서버의 부하를 줄이고, 확장성을 높여준다.</li>
<li>보안성: 토큰은 암호화되어 전송되기 때문에, 사용자 인증 정보를 안전하게 보호할 수 있다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>토큰 크기: 토큰은 인증 정보와 메타데이터를 포함하므로, 쿠키에 비해 상대적으로 크기가 클 수 있어, 네트워크 부하가 증가할 수 있다.</li>
<li>저장 및 관리: 클라이언트는 토큰을 저장하고 관리해야 하며, 이에 따른 보안 문제가 발생할 수 있다. 예를 들어, 토큰이 노출되거나 탈취당할 경우, 사용자의 인증 정보가 위험에 노출될 수 있다.</li>
</ol>
<h3 id="cors">CORS</h3>
<blockquote>
<p>CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 페이지가 다른 도메인의 리소스에 액세스할 수 있도록 하는 웹 보안 메커니즘이다. </p>
</blockquote>
<blockquote>
<p>Same-Origin Policy(동일 출처 정책)는 웹 보안의 핵심 원칙 중 하나로, 웹 페이지가 다른 출처의 리소스에 액세스하는 것을 제한한다. 출처는 URL의 스키마(http, https 등), 호스트(도메인) 및 포트 번호의 조합으로 구성된다. 동일 출처 정책은 사용자의 정보를 보호하고 악의적인 사이트로부터의 공격을 방지하기 위해 사용된다.</p>
</blockquote>
<p>기본적으로 웹 브라우저의 보안 정책인 SOP로 인해, 웹 페이지는 동일한 출처에서만 리소스를 로드할 수 있지만, CORS를 사용하여 서버는 다른 출처의 요청에 대한 액세스를 허용할 수 있다.</p>
<p><strong>CORS에 대한 프론트엔드의 관점</strong></p>
<ol>
<li>프론트엔드 웹 애플리케이션은 다른 출처의 API나 리소스에 액세스하려 할 때, 브라우저가 자동으로 CORS 요청을 생성한다. 이 요청에는 Origin 헤더가 포함되어, 요청이 보내지는 출처를 나타낸다.</li>
<li>브라우저는 서버로부터 받은 응답의 CORS 관련 헤더(Access-Control-Allow-Origin 등)를 검사하여, 해당 요청이 허용되는지 여부를 결정한다. 허용되면 응답을 처리하고, 그렇지 않으면 에러를 발생시킨다.</li>
</ol>
<p><strong>CORS에 대한 백엔드의 관점</strong></p>
<ol>
<li>백엔드 서버는 클라이언트로부터의 요청을 받을 때, 해당 요청이 CORS 요청인지 확인한다. CORS 요청인 경우, 요청 헤더의 Origin 값을 확인하여 출처를 검사한다.</li>
<li>서버는 서버에서 설정한 규칙에 따라 출처를 허용하거나 거부할 수 있다. 출처를 허용하는 경우, 서버는 응답 헤더에 Access-Control-Allow-Origin과 같은 CORS 관련 헤더를 추가하고, 응답을 클라이언트에 전달한다.</li>
</ol>
<p>CORS를 사용하면 다른 출처의 리소스에 액세스할 수 있지만, 안전하게 정보를 공유하려면 백엔드 서버에서 적절한 CORS 정책을 설정해야 한다. 서버에서 너무 많은 출처를 허용하면 보안에 취약해질 수 있으므로, 필요한 출처만 허용하는 것이 좋다. </p>
<h3 id="rest">REST</h3>
<blockquote>
<p>REST(Representational State Transfer)는 분산 시스템을 설계하는 아키텍처 스타일로, 웹 서비스와 API의 디자인에 널리 사용된다.</p>
</blockquote>
<p>REST는 웹 서비스가 확장성, 성능, 간편함, 수정 용이성, 신뢰성 등의 특징을 가지도록 설계하는 데 도움을 줍니다.</p>
<p><strong>REST 아키텍처의 6가지 원칙</strong></p>
<ol>
<li>클라이언트-서버 구조(Client-Server): 클라이언트와 서버가 독립적으로 구성되어 서로의 발전과 변화에 영향을 주지 않으면서 상호 작용한다.</li>
<li>무상태(Stateless): 각 요청이 서버에 필요한 모든 정보를 포함하며, 서버는 클라이언트의 상태를 저장하지 않는다. 이를 통해 서버의 확장성과 관리가 용이해진다.</li>
<li>캐시 가능(Cacheable): 서버는 응답을 캐시할 수 있는지 여부를 명시할 수 있으며, 클라이언트는 캐시된 응답을 사용해야한다. 이를 통해 클라이언트의 성능과 효율성이 향상된다.</li>
<li>계층 구조(Layered System): 시스템은 여러 계층으로 구성될 수 있으며, 각 계층은 독립적으로 작동한다. 이를 통해 시스템의 유연성과 재사용성이 증가한다.</li>
<li>코드 온 디맨드(Code on Demand, 선택적): 클라이언트는 서버로부터 실행 가능한 코드를 받아 기능을 확장할 수 있다. 이를 통해 클라이언트의 기능이 동적으로 변경될 수 있다.</li>
<li>인터페이스 일관성(Uniform Interface): REST는 일관된 인터페이스를 통해 자원에 액세스하고 조작한다. 이를 통해 시스템의 단순화와 상호 운용성이 향상된다.</li>
</ol>
<h4 id="restful">RESTful</h4>
<blockquote>
<p>RESTful이란, REST 원칙을 따르는 시스템을 의미한다.   REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있다.</p>
</blockquote>
<h4 id="rest-api">REST API</h4>
<blockquote>
<p>REST 원칙에 따라 설계된 API(Application Programming Interface)이다. 클라이언트와 서버 간의 통신을 가능하게 하는 인터페이스로, 클라이언트가 서버의 자원에 액세스하고 조작할 수 있다.
URI는 정보의 자원을 표현해야하며, 자원에 대한 행위는 HTTP Method (GET, PUT, POST, DELETE등등)로 표현</p>
</blockquote>
<p><strong>특징</strong></p>
<ul>
<li>자원 지향(Resource-Oriented): REST API는 웹 자원을 중심으로 설계되며, 각 자원은 고유한 URI(Uniform Resource Identifier)로 식별된다.</li>
<li>표준화된 인터페이스: REST API는 일관된 인터페이스를 사용하여 자원에 액세스하고 조작한다. 이를 통해 클라이언트와 서버 간의 상호 운용성이 향상된다.</li>
<li>HTTP 메서드 활용: REST API는 HTTP 메서드(GET, POST, PUT, DELETE 등)를 활용하여 자원에 대한 작업을 수행한다. 이를 통해 API의 사용이 단순화되고 이해하기 쉬워진다.</li>
<li>상태 코드(Status Code) 활용: REST API는 HTTP 상태 코드를 사용하여 요청의 결과를 명확하게 전달한다. 이를 통해 클라이언트가 에러 처리를 쉽게 수행할 수 있다.</li>
</ul>
<p>REST 원칙에 따라 설계된 API는 확장성, 성능, 간편함 등의 이점을 제공하여, 다양한 플랫폼과 기기에서 효율적으로 사용할 수 있으며, 이를 통해 웹 서비스와 애플리케이션의 개발 및 유지 보수가 용이해진다.</p>
<h3 id="xss">XSS</h3>
<p>XSS(Cross-Site Scripting)는 웹 사이트의 보안 취약점 중 하나로, 공격자가 웹 사이트에 악성 스크립트를 삽입하여 다른 사용자의 정보를 탈취하거나 조작하는 공격이다. XSS 공격은 주로 웹 사이트가 사용자로부터 입력 받은 데이터를 충분히 검증하지 않고 사용할 때 발생한다.</p>
<p><strong>XSS의 공격방식</strong></p>
<ul>
<li>Stored XSS(저장형 XSS): 공격자가 웹 사이트의 데이터베이스에 악성 스크립트를 저장하고, 다른 사용자가 해당 데이터를 조회할 때 실행되는 공격이다. 예를 들어, 게시판이나 댓글 등에 악성 스크립트를 포함한 글을 작성하는 경우이다.</li>
<li>Reflected XSS(반사형 XSS): 공격자가 웹 사이트의 URL에 악성 스크립트를 포함시켜 다른 사용자가 해당 링크를 클릭할 때 실행되는 공격이다. 이메일, 메신저 등을 통해 악성 URL을 전달하는 경우가 대표적이다.</li>
<li>DOM-based XSS(DOM 기반 XSS): 공격자가 웹 페이지의 DOM(Document Object Model)을 조작하여 악성 스크립트가 실행되게 하는 공격이다. 클라이언트 측에서 데이터 처리를 수행하는 자바스크립트 코드에 취약점이 있는 경우 발생한다.</li>
</ul>
<p><strong>XSS에 대한 대응방식</strong></p>
<ul>
<li>입력 데이터 검증: 사용자로부터 입력 받은 데이터에 대해 충분한 검증을 수행하고, 스크립트 코드가 포함되어 있는지 확인하여 악성 스크립트의 삽입을 방지할 수 있다.</li>
<li>출력 데이터 인코딩: 사용자가 입력한 데이터를 웹 페이지에 출력할 때, HTML 인코딩을 수행하여 스크립트 코드가 실행되지 않도록 한다. 예를 들어, &#39;&lt;&#39;와 &#39;&gt;&#39; 같은 문자를 &#39;&lt;&#39;와 &#39;&gt;&#39;로 변환하는 것이다.</li>
<li>콘텐츠 보안 정책(CSP, Content Security Policy): 웹 서버가 웹 페이지에 대한 보안 정책을 설정하여, 허용된 출처의 스크립트만 실행되도록 할 수 있고, 악성 스크립트의 실행을 차단할 수 있다.</li>
</ul>
<h3 id="sql-injection">SQL Injection</h3>
<blockquote>
<p>SQL Injection은 웹 애플리케이션의 보안 취약점 중 하나로, 공격자가 악의적인 SQL 쿼리를 주입하여 데이터베이스를 조작하거나 민감한 정보를 탈취하는 공격이다. </p>
</blockquote>
<p>SQL 인젝션은 주로 웹 애플리케이션에서 사용자로부터 입력받은 데이터를 처리할 때, 충분한 검증 없이 SQL 쿼리에 사용되는 경우 발생한다.</p>
<p>*<em>SQL 인젝션의 대표적인 공격 방식
*</em></p>
<ul>
<li>공격자가 로그인 폼의 아이디 또는 비밀번호 입력 필드에 악성 SQL 쿼리를 입력하여 인증을 우회하는 방법</li>
<li>공격자가 웹 사이트의 검색 기능을 이용하여 악성 SQL 쿼리를 주입하고, 데이터베이스에서 민감한 정보를 탈취하는 방법</li>
<li>공격자가 URL의 쿼리 문자열에 악성 SQL 쿼리를 포함시켜 서버에 전달하고, 웹 애플리케이션이 그대로 쿼리를 실행하여 공격에 성공하는 방법</li>
</ul>
<p><strong>SQL 인젝션 공격에 대한 대응 방식</strong></p>
<ul>
<li>입력 데이터 검증: 사용자로부터 입력 받은 데이터에 대해 충분한 검증을 수행하고, SQL 쿼리에 사용되기 전에 필터링하는 것이 중요하다. 이를 통해 악성 쿼리의 주입을 방지할 수 있다.</li>
<li>파라미터화된 쿼리 사용: 데이터베이스 쿼리에 사용자 입력 값을 직접 포함시키지 않고, 파라미터를 사용하여 값이 쿼리에 대입되도록 한다. 이를 통해 공격자가 쿼리의 구조를 변경할 수 없게 만들 수 있다.</li>
<li>저장 프로시저 사용: 저장 프로시저를 사용하면 SQL 쿼리의 구조를 고정시킬 수 있어, 공격자가 쿼리를 변경하는 것을 어렵게 만든다. 하지만 저장 프로시저 자체에 취약점이 없도록 주의해야 한다.</li>
<li>최소 권한 원칙 적용: 데이터베이스 계정에 대해 최소한의 권한만 부여하여, 공격자가 성공한 경우에도 피해를 최소화할 수 있다.</li>
</ul>
<h3 id="url-uri-urn">URL, URI, URN</h3>
<blockquote>
<p>URI (Uniform Resource Identifier): 인터넷에서 자원을 식별하는 고유한 문자열이다. </p>
</blockquote>
<blockquote>
<p>URL (Uniform Resource Locator): 인터넷에서 자원의 위치를 나타내는 문자열이다. URL은 프로토콜(예: HTTP, FTP), 도메인, 경로, 쿼리 문자열 등을 통해 자원의 위치를 표현한다. 예를 들어, &quot;<a href="https://www.example.com/index.html&quot;%EA%B3%BC">https://www.example.com/index.html&quot;과</a> 같은 형태를 가진다.</p>
</blockquote>
<blockquote>
<p>URN (Uniform Resource Name): 인터넷에서 자원의 고유한 이름을 나타내는 문자열이다. URN은 자원의 실제 위치와 관계없이 고유한 이름을 부여하며, 자원의 이름만으로 식별이 가능하다. 예를 들어, &quot;urn:isbn:0451450523&quot;과 같은 형태를 가집니다.</p>
</blockquote>
<ul>
<li>URI는 인터넷 자원을 식별하기 위한 가장 상위 개념으로, URL과 URN을 포함합니다.</li>
<li>URL은 자원의 실제 위치를 나타내는 것으로, 프로토콜, 도메인, 경로 등을 포함하여 자원의 위치를 명시적으로 표현합니다.</li>
<li>URN은 자원의 고유한 이름을 나타내는 것으로, 자원의 실제 위치와 관계없이 자원을 식별할 수 있는 고유한 이름을 부여합니다.</li>
</ul>
<h3 id="웹-캐시">웹 캐시</h3>
<blockquote>
<p>웹 캐시는 웹 페이지나 파일 등의 자원을 일시적으로 저장해두는 저장소를 의미한다. 웹 캐시를 사용하면 이전에 요청했던 자원을 빠르게 다시 불러올 수 있다. 웹 캐시는 주로 웹 브라우저, 프록시 서버, CDN(Content Delivery Network) 등에서 사용된다.</p>
</blockquote>
<p><strong>웹 캐시를 사용했을 때의 이점</strong></p>
<ul>
<li><p>네트워크 부하 감소: 캐싱된 자원은 원본 서버에서 다시 요청할 필요가 없기 때문에, 네트워크 트래픽과 서버 부하를 줄일 수 있다.</p>
</li>
<li><p>빠른 로딩 속도: 캐싱된 자원은 로컬 저장소나 가까운 프록시 서버에서 불러올 수 있으므로, 원격 서버에서 자원을 가져오는 것보다 훨씬 빠르게 로딩된다. 이로 인해 사용자 경험이 향상되며, 웹 사이트의 성능이 개선된다.</p>
</li>
<li><p>대역폭 절약: 캐싱된 자원은 원본 서버와의 통신을 최소화하기 때문에, 대역폭 사용량을 줄일 수 있다. 이는 특히 데이터 전송 비용이 중요한 모바일 환경에서 큰 이점이 된다.</p>
</li>
<li><p>내구성과 가용성 향상: 원본 서버에 문제가 발생하거나 접속이 불가능한 경우에도, 캐싱된 자원을 통해 웹 사이트의 일부 기능이나 콘텐츠를 계속 사용할 수 있다.</p>
</li>
</ul>
<p>웹 캐시를 사용하면 네트워크 부하를 줄이고, 로딩 속도를 높이며, 대역폭을 절약하고, 서비스의 내구성과 가용성을 향상시킬 수 있지만, 웹 캐시를 사용할 때 주의해야 할 점도 있다.
예를 들어, 캐시된 자원이 최신 정보를 반영하지 못하는 경우가 있을 수 있으므로, 캐시 정책을 적절하게 설정하고 관리해야 한다.</p>
<h3 id="웹-프록시">웹 프록시</h3>
<blockquote>
<p> 웹 프록시란 클라이언트와 서버 간의 통신을 중계하는 중간 서버다. 클라이언트가 서버에 요청을 보내면, 웹 프록시가 그 요청을 받아 서버로 전달하고, 서버로부터 받은 응답을 클라이언트에게 전달한다. 웹 프록시는 보안, 성능 최적화, 로드 밸런싱 등 다양한 목적으로 사용된다.</p>
</blockquote>
<p>웹 프록시의 사용 예시:</p>
<ul>
<li>캐싱: 웹 프록시는 자주 사용되는 웹 페이지나 파일을 캐시하여 저장해두고, 캐싱된 자원이 요청될 때 원본 서버에 접근하지 않고 빠르게 응답할 수 있다.</li>
<li>필터링: 웹 프록시를 사용하여 특정 웹 사이트에 대한 접근을 차단하거나, 악성 코드가 포함된 사이트를 필터링할 수 있다.</li>
<li>익명성: 웹 프록시를 통해 서버와의 통신이 이루어지기 때문에, 클라이언트의 IP 주소를 숨기고 실제 원격 서버에 익명으로 접근할 수 있다.</li>
</ul>
<p>웹 프록시는 주로 포워드 프록시와 리버스 프록시로 구분된다.</p>
<h4 id="포워드-프록시">포워드 프록시</h4>
<p>포워드 프록시는 클라이언트 측에서 사용되며, 클라이언트의 요청을 원격 서버로 전달하여, 캐싱, 필터링, 익명성 보장 등의 기능을 제공한다. 예를 들어, 기업이나 학교 네트워크에서 특정 웹 사이트에 대한 접근을 제한하거나, 개인정보를 보호하기 위해 포워드 프록시를 사용할 수 있다.</p>
<h4 id="리버스-프록시">리버스 프록시</h4>
<p>리버스 프록시는 서버 측에서 사용되며, 외부 클라이언트의 요청을 내부 서버로 전달하여 로드 밸런싱, SSL 암호화, 캐싱 등의 기능을 제공한다. 예를 들어, 웹 서비스에서 리버스 프록시를 사용하여 여러 서버에 분산된 요청을 처리하거나, 안전한 암호화 통신을 위해 SSL 인증서를 관리할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 5회차] IP 정리]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-5%ED%9A%8C%EC%B0%A8-IP-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-5%ED%9A%8C%EC%B0%A8-IP-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 28 Apr 2023 00:48:27 GMT</pubDate>
            <description><![CDATA[<h2 id="ip">IP</h2>
<h3 id="ip주소">IP주소</h3>
<blockquote>
<p>IP 주소는  인터넷 프로토콜 주소(Internet Protocol Address)의 줄임말로, 인터넷에서 각 기기를 고유하게 식별하기 위한 주소 체계</p>
</blockquote>
<p>인터넷에서 데이터를 전송할 때, 데이터를 패킷이라는 작은 조각으로 나누어 전송하게 되는데, TCP는 이 패킷들의 전송을 관리해주는 역할을 한다.</p>
<p>네트워크에서 IP 주소가 갖는 의미</p>
<ul>
<li><strong>기기 식별</strong>: IP 주소를 사용하여 네트워크에서 특정 기기를 식별하고, 통신이 원활하게 이루어질 수 있다.</li>
<li><strong>데이터 라우팅</strong>: 데이터 패킷이 네트워크를 통해 전송될 때, 라우터와 스위치 등의 네트워크 기기들은 IP 주소를 기반으로 패킷의 목적지를 찾아 올바른 경로로 전달한다.</li>
<li><strong>네트워크 계층 통신</strong>: IP 주소는 인터넷 프로토콜을 기반으로 하는 네트워크 계층에서 통신을 가능하게 하며, 네트워크 상에서 다양한 기기들이 서로 정보를 교환할 수 있게 하는 기능이다.</li>
</ul>
<h3 id="ipv4와-ipv6의-차이점">IPv4와 Ipv6의 차이점</h3>
<ul>
<li><p>주소 공간 크기: IPv4는 32비트 주소 체계로 총 2^32(약 43억)개의 주소를 생성할 수 있다. 반면, IPv6는 128비트 주소 체계로 2^128개의 주소를 생성할 수 있어, 인터넷 연결 기기의 급격한 증가에 대응할 수 있다.</p>
</li>
<li><p>주소 표현: IPv4 주소는 4개의 8비트 숫자로 구성되며, 점( . )으로 구분되어 표기된다. 예를 들어, 192.168.0.1 같은 형태이다. IPv6 주소는 8개의 16비트 숫자로 구성되며, 콜론( : )으로 구분되어 표기된다. 예를 들어, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 같은 형태이다.</p>
</li>
<li><p>IP 헤더 구조: IPv4와 IPv6는 서로 다른 헤더 구조를 가지고 있다. IPv6는 헤더의 크기를 줄이고, 처리 속도를 높이기 위해 더 간소화된 형태로 설계되었다.</p>
</li>
<li><p>자동 구성: IPv6는 Stateless Address Autoconfiguration(SLAAC) 기능을 통해, 기기가 네트워크에 연결되면 자동으로 IP 주소를 구성할 수 있다. 반면, IPv4에서는 DHCP 서버를 통한 동적 IP 주소 할당 또는 수동으로 정적 IP 주소를 설정해야 한다.</p>
</li>
<li><p>보안 기능: IPv6는 기본적으로 IPsec를 지원하여, 기기 간의 통신을 암호화하고 인증할 수 있다. 반면, IPv4에서는 IPsec를 선택적으로 적용할 수 있으며, 별도의 구성이 필요하다.</p>
</li>
<li><p>멀티캐스트 지원: IPv6에서는 멀티캐스트를 향상시키고 확장한 기능을 제공하며, 브로드캐스트를 완전히 대체한다. IPv4에서는 브로드캐스트와 멀티캐스트를 모두 지원한다.</p>
<p><strong>IPv6는 보안, 확장성, 효율성 측면에서 IPv4보다 발전된 인터넷 프로토콜</strong>로 인식되고 있다. 그러나 호환성 문제와 기존 인프라에 대한 업그레이드 비용 등으로 인해, 아직 전 세계적으로 완벽한 전환은 이루어지지 않고 있다. IPv4와 IPv6는 서로 호환되지 않기 때문에, 전환 기간 동안 이중 스택(Double Stack)과 같은 기술이 사용되어 두 가지 프로토콜을 동시에 지원하게 된다.</p>
</li>
</ul>
<h3 id="서브넷과-서브넷-마스크">서브넷과 서브넷 마스크</h3>
<blockquote>
<p>서브넷(Subnet)은 IP 네트워크를 더 작은 네트워크 단위로 분할하는 것을 의미한다. 이를 통해 IP 주소를 효율적으로 관리하고, 네트워크 트래픽을 줄이며, 보안을 강화할 수 있습니다.
서브넷 마스크(Subnet Mask)는 IP 주소와 함께 사용되어 네트워크의 어느 부분이 네트워크 주소이고 어느 부분이 호스트 주소인지 구분하는 데 도움을 준다.</p>
</blockquote>
<p>IP 주소는 두 가지 부분으로 구성되어 있다.</p>
<p>네트워크 부분(Network part): 네트워크를 식별하는데 사용되며, 서로 다른 네트워크에 있는 기기 간의 통신을 가능하게 한다.
호스트 부분(Host part): 네트워크 내에서 개별 기기를 식별하는데 사용되며, 같은 네트워크 내의 기기들이 서로 통신할 수 있게 한다.</p>
<p>서브넷 마스크는 일반적으로 이진수로 표현되며, 1로 시작해서 연속된 0으로 끝난다. IPv4에서 서브넷 마스크는 4개의 8비트 숫자로 구성되어 점( . )으로 구분되어 표기된다. 예를 들어, 255.255.255.0과 같은 형태이다.</p>
<p>서브넷 마스크를 사용하여 IP 주소의 네트워크 부분과 호스트 부분을 구분하는 방법은 다음과 같습니다:</p>
<ol>
<li>IP 주소와 서브넷 마스크를 이진수로 변환한다.</li>
<li>IP 주소의 이진수와 서브넷 마스크의 이진수를 비트별로 AND 연산한다. 결과는 해당 IP 주소의 네트워크 주소가 된다.</li>
<li>네트워크 주소와 서브넷 마스크를 XOR 연산하면 호스트 주소를 구할 수 있다.</li>
</ol>
<p>예를 들어, IP 주소가 192.168.1.10이고 서브넷 마스크가 255.255.255.0인 경우:</p>
<ol>
<li>IP 주소(192.168.1.10)를 이진수로 변환하면 11000000.10101000.00000001.00001010이다.</li>
<li>서브넷 마스크(255.255.255.0)를 이진수로 변환하면 11111111.11111111.11111111.00000000이다.</li>
<li>두 이진수를 AND 연산하면, 11000000.10101000.00000001.00000000이며, 이를 10진수로 변환하면 192.168.1.0이 되며, 이것이 네트워크 주소이다.</li>
<li>네트워크 주소와 서브넷 마스크를 XOR 연산하면, 00000000.00000000.00000000.00001010이며, 이를 10진수로 변환하면 0.0.0.10이 되며, 이것이 호스트 주소입니다.</li>
</ol>
<p><strong>서브넷 마스크를 사용하면 네트워크를 더 세분화하여 관리할 수 있으며, 기업이나 대규모 조직에서 특히 유용합니다. 서브넷을 통해 네트워크를 작은 단위로 나누면 트래픽을 효율적으로 관리할 수 있고, 보안 문제를 최소화하며, IP 주소의 낭비를 줄일 수 있습니다.</strong></p>
<h3 id="라우팅">라우팅</h3>
<blockquote>
<p>라우팅(Routing)은 네트워크에서 데이터 패킷이 출발지에서 목적지까지 최적의 경로를 찾아 전달하는 과정을 의미한다. 
라우터(Router)는 이러한 라우팅 과정을 수행하는 네트워크 장비로, 다양한 네트워크 간의 연결을 가능하게 하며 트래픽을 효율적으로 관리한다.</p>
</blockquote>
<p>네트워크에서 패킷이 라우터를 통해 이동하는 과정</p>
<ol>
<li>출발지 기기에서 데이터를 패킷 형태로 분할합니다. 각 패킷에는 출발지 IP 주소와 목적지 IP 주소가 포함되어 있습니다.</li>
<li>패킷은 출발지와 목적지 간의 경로 상에 위치한 라우터들을 거쳐 전달됩니다.</li>
<li>각 라우터는 자체 라우팅 테이블을 가지고 있습니다. 라우팅 테이블은 목적지 IP 주소에 따라 패킷을 어떤 경로로 전달할지에 대한 정보를 담고 있습니다.</li>
<li>라우터는 라우팅 테이블을 참조하여 들어온 패킷의 목적지 IP 주소와 연결된 최적의 경로를 결정합니다.</li>
<li>라우터는 패킷을 결정된 경로를 통해 다음 라우터나 최종 목적지로 전달합니다.</li>
<li>이 과정이 반복되며, 패킷은 최종 목적지에 도착하게 됩니다.</li>
<li>목적지 기기에서는 도착한 패킷들을 원래의 데이터로 재조립합니다.</li>
</ol>
<p><strong>라우팅 알고리즘은 네트워크 상황에 따라 동적으로 최적의 경로를 찾을 수 있으며, 장애나 혼잡 상황에 유연하게 대처할 수 있다.</strong> 라우팅을 통해 인터넷에서 다양한 기기와 네트워크 간의 원활한 통신이 가능하게 된다.</p>
<h3 id="public-ip와-private-ip의-차이">Public IP와 Private Ip의 차이</h3>
<p>공인 IP(Public IP)와 사설 IP(Private IP)는 인터넷 프로토콜 주소(IP 주소)의 두 가지 유형으로, 사용 목적과 범위에 따라 구분된다.</p>
<h4 id="공인-ippublic-ip">공인 IP(Public IP)</h4>
<p>인터넷상에서 고유하게 할당되는 IP 주소로, 전 세계적으로 유일한 주소이다. 공인 IP 주소를 사용하면 인터넷에 연결된 모든 기기와 통신이 가능하다. 일반적으로 인터넷 서비스 공급자(ISP)에 의해 할당되며, 웹 서버, 이메일 서버 등 공개적으로 접근 가능한 서버 및 서비스에 사용된다.</p>
<h4 id="사설-ipprivate-ip">사설 IP(Private IP)</h4>
<p>는 특정 네트워크 내에서만 사용되는 IP 주소로, 인터넷상에서는 중복되어 사용될 수 있습니다. 사설 IP 주소는 특정 범위에 따라 할당되며, 일반적으로 가정이나 기업의 내부 네트워크에서 사용됩니다. 사설 IP 주소는 인터넷에 직접 연결되지 않기 때문에 외부에서 직접 접근할 수 없습니다. 이를 통해 내부 네트워크의 보안성을 높일 수 있습니다.</p>
<p>사설 IP 주소 범위는 다음과 같다:</p>
<p>10.0.0.0 - 10.255.255.255 (A 클래스)
172.16.0.0 - 172.31.255.255 (B 클래스)
192.168.0.0 - 192.168.255.255 (C 클래스)</p>
<p>공인 IP와 사설 IP 주소를 결합하여 사용하는 경우, 네트워크 주소 변환(Network Address Translation, NAT)이라는 기술이 적용된다. <strong>NAT를 사용하면 사설 IP 주소를 공인 IP 주소로 변환하여 인터넷에 연결할 수 있어, IP 주소의 효율적인 관리 및 보안성이 강화된다.</strong> 대표적으로 가정이나 기업에서 사용하는 공유기는 NAT를 통해 여러 기기가 하나의 공인 IP 주소를 공유하여 인터넷에 접속할 수 있다.</p>
<h3 id="라우팅-프로토콜">라우팅 프로토콜</h3>
<blockquote>
<p>라우팅 프로토콜(Routing Protocol)은 네트워크에서 라우터 간의 정보 교환 및 최적의 경로를 찾기 위한 알고리즘과 규칙을 정의하는 통신 규약</p>
</blockquote>
<p>우팅 프로토콜을 사용하면 라우터는 다른 라우터와 라우팅 정보를 주고받아 동적으로 최적의 경로를 결정하고, 장애나 혼잡 상황에 유연하게 대응할 수 있다. 라우팅 프로토콜은 크게 <strong>내부 게이트웨이 프로토콜(IGP)</strong>과 외부 게이트웨이 프로토콜(EGP)로 나뉜다.</p>
<h4 id="내부-게이트웨이-프로토콜igp-interior-gateway-protocol">내부 게이트웨이 프로토콜(IGP, Interior Gateway Protocol)</h4>
<p>IGP는 하나의 오토노머스 시스템(AS, Autonomous System) 내에서 라우터 간의 라우팅 정보를 교환하는 데 사용되는 프로토콜로, 주로 RIP과 OSPF가 사용된다.</p>
<p>RIP(Routing Information Protocol): 거리 벡터 라우팅 프로토콜로, 라우터 간의 거리(홉 수)를 기반으로 최단 경로를 결정한다. RIP는 단순하고 구현이 쉽지만, 네트워크 크기가 커지면 복잡해지고 수렴 시간이 길어질 수 있다. 최대 15 홉까지만 지원하며, 이를 초과하면 라우팅이 불가능하다.</p>
<p>OSPF(Open Shortest Path First): 링크 상태 라우팅 프로토콜로, 라우터 간의 링크 비용을 고려하여 최단 경로를 계산한다. 다익스트라 알고리즘을 사용하며, RIP에 비해 복잡하지만 네트워크 변화에 빠르게 대응할 수 있고, 대규모 네트워크에서도 효율적이다. OSPF는 계층적 구조를 사용하여 네트워크를 분할할 수 있어 확장성이 좋다.</p>
<h4 id="외부-게이트웨이-프로토콜egp-exterior-gateway-protocol">외부 게이트웨이 프로토콜(EGP, Exterior Gateway Protocol)</h4>
<p>EGP는 서로 다른 오토노머스 시스템 간의 라우팅 정보를 교환하는 데 사용되는 프로토콜이며, BGP(Border Gateway Protocol)가 대표적이다.</p>
<p>BGP(Border Gateway Protocol): 경로 벡터 라우팅 프로토콜로, 인터넷에서 사용되는 메인 라우팅 프로토콜이다. BGP는 AS 간의 연결 및 정책 기반 라우팅을 지원하며, 각 AS가 자체적으로 정책을 설정할 수 있다. BGP는 라우팅 정보에 경로 속성을 추가하여 전달하며, 이를 통해 라우터는 다양한 요소를 고려해 최적의 경로를 선택할 수 있다.</p>
<p>BGP의 주요 특징</p>
<ul>
<li>안정성: BGP는 TCP(Transmission Control Protocol)를 사용하여 라우팅 정보를 안전하게 전송합니다.</li>
<li>정책 기반 라우팅: BGP는 정책 기반 라우팅을 지원하여, 다양한 요소를 기반으로 경로를 선택할 수 있습니다. 이를 통해 트래픽 관리 및 보안 정책을 구현할 수 있습니다.</li>
<li>루프 방지: AS 경로 정보를 포함하여 루프를 방지하고, 경로 선택에 참고할 수 있습니다.</li>
<li>확장성: 인터넷 전체를 커버할 수 있는 규모의 네트워크에서도 사용할 수 있는 높은 확장성을 가지고 있습니다.</li>
</ul>
<p>이처럼 <strong>라우팅 프로토콜은 네트워크 상황, 규모 및 요구사항에 따라 선택하여 사용할 수 있으며, 각각의 프로토콜은 특성에 따라 장단점을 가지고 있다. 이들 프로토콜을 통해 라우터는 동적으로 최적의 경로를 찾고, 네트워크의 효율성과 안정성을 유지할 수 있다.</strong></p>
<h3 id="ip는-어떻게-할당되는가">IP는 어떻게 할당되는가</h3>
<p>IP 주소는 기기에 할당되는데, 이 과정은 크게 정적 할당과 동적 할당으로 나뉜다.</p>
<h4 id="정적할당static-allocation">정적할당(Static Allocation)</h4>
<p> IP 주소를 수동으로 설정하여 기기에 할당하는 방법이다. 네트워크 관리자가 각 기기의 네트워크 설정에서 IP 주소, 서브넷 마스크, 게이트웨이, DNS 서버 등의 정보를 직접 입력하여 할당한다. </p>
<ul>
<li>장점:  IP 주소가 고정되어 있어, 원격 접속이나 서버 구축 등에 유리하다. </li>
<li>단점: 관리가 복잡하고, IP 주소 변경 시 수동으로 수정해야 한다는 단점이 있다.</li>
</ul>
<h4 id="동적할당dynamic-allocation">동적할당(Dynamic Allocation)</h4>
<p> IP 주소를 자동으로 설정하여 기기에 할당하는 방법이다. DHCP(Dynamic Host Configuration Protocol)를 사용하여 IP 주소를 자동으로 할당하며, 이는 대부분의 가정이나 기업 내부 네트워크에서 주로 사용된다. DHCP 서버는 일정 범위의 IP 주소 풀(Pool)에서 사용 가능한 IP 주소를 기기에 할당하며, IP 주소의 사용 기간(리스 시간)이 정해져 있다. 리스 시간이 만료되면, 기기는 새로운 IP 주소를 요청하거나 기존 IP 주소를 연장할 수 있다. </p>
<ul>
<li>장점: IP 주소 관리가 편리하고, IP 주소의 재사용이 가능하다는 것이다.</li>
<li>단점: IP 주소가 자주 변경될 수 있어, 일부 서버 구축에는 불편할 수 있다.</li>
</ul>
<p>요약하면, *<em>정적 할당은 수동으로 IP 주소를 설정하여 할당하는 방법으로, IP 주소가 고정되어 있어 원격 접속이나 서버 구축에 유리하지만 관리가 복잡하다. 동적 할당은 DHCP를 사용하여 자동으로 IP 주소를 할당하는 방법으로, IP 주소 관리가 편리하고 IP 주소의 재사용이 가능하지만, IP 주소가 자주 변경될 수 있어 일부 서버 구축에는 불편할 수 있다.
*</em></p>
<h3 id="nat">NAT</h3>
<blockquote>
<p>NAT(Network Address Translation)은 네트워크 주소 변환 기술로, 사설 IP 주소와 공인 IP 주소 간의 변환을 수행한다.</p>
</blockquote>
<p>NAT를 사용하면 여러 개의 사설 IP 주소를 하나의 공인 IP 주소로 대표할 수 있으며, 이를 통해 IP 주소의 효율적인 관리 및 보안성이 강화된다. 일반적으로 NAT는 가정이나 기업 내부 네트워크에서 사용되는 공유기에서 주로 적용된다.</p>
<p>주소 변환이 필요한 예시:</p>
<p><strong>가정에서 인터넷 사용</strong>: 가정에서 인터넷을 사용할 때 보통 여러 대의 기기가 있다. 각각의 기기는 사설 IP 주소를 사용하며, 인터넷 서비스 공급자(ISP)가 제공하는 공인 IP 주소를 통해 인터넷에 접속한다. 이때 공유기에서 NAT 기능이 활성화되어 있어, 여러 대의 기기가 하나의 공인 IP 주소를 사용하여 인터넷에 접속할 수 있다.</p>
<p><strong>기업 내부 네트워크</strong>: 기업 내부에서도 비슷한 상황이 발생한다. 기업 내부에 있는 많은 기기들이 사설 IP 주소를 사용하여 통신하며, 외부 인터넷과의 연결을 위해 공인 IP 주소가 필요하다. 이때 NAT를 사용하여 사설 IP 주소를 공인 IP 주소로 변환하여 인터넷과 연결할 수 있다. 이를 통해 IP 주소 자원을 절약하고, 보안성을 높일 수 있다.</p>
<p>NAT의 주요 기능 중 하나는** 포트 주소 변환(PAT, Port Address Translation)**이다. PAT는 여러 개의 사설 IP 주소와 포트 번호를 하나의 공인 IP 주소와 포트 번호로 변환할 수 있다. 이를 통해 다수의 기기가 동시에 인터넷에 접속하거나 서비스를 이용할 수 있으며, IP 주소의 효율적인 활용이 가능하다.</p>
<p>이처럼 <strong>NAT는 사설 IP 주소와 공인 IP 주소 간의 변환을 통해 IP 주소를 효율적으로 관리하고, 보안성을 높이는 역할을 한다. 이 기술은 가정이나 기업 내부 네트워크에서 인터넷에 연결할 때 주로 사용된다.</strong></p>
<h3 id="icmp">ICMP</h3>
<blockquote>
<p>ICMP(Internet Control Message Protocol)는 인터넷 제어 메시지 프로토콜로, IP(Internet Protocol)와 함께 사용되어 네트워크 상의 문제를 진단하고 통지하는데 사용된다.</p>
</blockquote>
<p>ICMP는 IP 계층 위에서 작동하며, 에러 보고, 진단, 제어 메시지 등을 전송하기 위해 설계되었으며, 주로 네트워크 문제 해결에 도움이 되는 다양한 유틸리티와 함께 사용되며, 효율적인 네트워크 운영에 기여한다.</p>
<p><strong>ICMP와 IP 간의 관계</strong></p>
<p>IP는 데이터를 패킷 단위로 전송하는 프로토콜이며, 전송 중 발생할 수 있는 다양한 오류 상황을 처리하지 않습니다. 이러한 오류 상황에 대처하기 위해 ICMP가 사용된다.
ICMP는 IP와 함께 작동하여, IP 패킷 전송 중 발생하는 오류를 감지하고 관련 정보를 전달하는 역할을 한다. 예를 들어, 목적지 IP 주소가 도달할 수 없는 경우, ICMP를 사용하여 발신지에 해당 정보를 알린다.
ICMP는 IP 헤더 다음에 위치하며, IP 프로토콜의 일부로 취급되기도 하기에, ICMP 메시지도 IP 패킷으로 전송된다.</p>
<p>ICMP를 사용하는 대표적인 예시는 &#39;ping&#39; 명령어와 &#39;traceroute&#39; 명령어이다.</p>
<p>ping: ping은 호스트 간의 연결 상태와 응답 시간을 확인하는 데 사용되는 도구이다. ICMP 에코 요청 및 에코 응답 메시지를 사용하여 대상 호스트에 데이터를 전송하고 응답을 기다린다. 이를 통해 네트워크 연결 상태와 지연 시간을 파악할 수 있다.
traceroute: traceroute는 패킷이 목적지에 도달하기까지 거치는 라우터의 경로를 추적하는 도구이다. ICMP 시간 초과(Time Exceeded) 메시지를 사용하여 각 라우터의 위치를 파악하고, 전체 경로를 확인할 수 있다.</p>
<p>이처럼 <strong>ICMP는 IP와 함께 작동하여 네트워크 문제를 진단하고 통지하는 역할을 수행한다. 이를 통해 네트워크 운영자는 네트워크 상태를 모니터링하고, 오류를 신속하게 파악 및 해결할 수 있다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 4회차] TCP 정리]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-4%ED%9A%8C%EC%B0%A8-TCP-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-4%ED%9A%8C%EC%B0%A8-TCP-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 23 Apr 2023 23:55:13 GMT</pubDate>
            <description><![CDATA[<h2 id="tcp">TCP</h2>
<h3 id="tcp-1">TCP</h3>
<blockquote>
<p>TCP(Transmission Control Protocol)는 인터넷 프로토콜 스위트의 핵심 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 목표로 설계된 프로토콜 </p>
</blockquote>
<p>인터넷에서 데이터를 전송할 때, 데이터를 패킷이라는 작은 조각으로 나누어 전송하게 되는데, TCP는 이 패킷들의 전송을 관리해주는 역할을 한다.</p>
<p><strong>특징</strong></p>
<ul>
<li>연결 지향성: TCP는 통신을 시작하기 전에 먼저 두 장치간에 연결을 설정한다. 이렇게 함으로써 양측이 서로 데이터를 주고받기 전에 신뢰성 있는 통신이 가능한지 확인할 수 있다.</li>
<li>신뢰성 있는 데이터 전송: TCP는 패킷의 전송 상태를 확인하고, 패킷이 손실되거나 에러가 발생한 경우 재전송을 요청함으로써 데이터의 정확한 전송을 보장한다.</li>
<li>흐름 제어: TCP는 송신 측과 수신 측의 데이터 처리 속도를 조절하여, 네트워크의 혼잡도를 낮추고 효율적인 데이터 전송이 가능하도록 한다.</li>
<li>혼잡 제어: TCP는 네트워크 상태에 따라 데이터 전송 속도를 동적으로 조절하여, 네트워크 혼잡도를 줄이고 전체 시스템의 성능을 향상시킨다.</li>
<li>전이중 통신: TCP는 양방향 데이터 전송을 지원하며, 송신 측과 수신 측이 동시에 데이터를 주고받을 수 있다.</li>
</ul>
<h3 id="3-way-handshake">3-way handshake</h3>
<blockquote>
<p>3 way handshake는 TCP 프로토콜에서 사용하는 연결 설정 과정</p>
</blockquote>
<p>클라이언트와 서버 사이에 데이터 전송을 시작하기 전에, 양측이 서로 연결 가능한지 확인하고 소통하기 위한 기본 파라미터를 동기화하는데 사용된다.</p>
<p><strong>사용하는 이유</strong></p>
<ul>
<li><p>연결 가능성 확인: 클라이언트와 서버가 서로의 존재와 연결 가능성을 확인한다. 이를 통해 불필요한 데이터 전송을 줄이고 효율적인 통신이 가능해진다.</p>
</li>
<li><p>동기화: 양측의 초기 시퀀스 번호를 교환하여, 패킷 전송 순서를 정확하게 관리할 수 있어, 신뢰성 있는 데이터 전송이 가능해진다.</p>
</li>
<li><p>흐름 제어 및 혼잡 제어 파라미터 설정: 3 way handshake 과정에서, 양측은 서로의 윈도우 크기(Window Size)와 같은 중요한 통신 파라미터를 교환하고 동기화하게 되어 효율적인 데이터 전송이 가능해집니다.</p>
</li>
</ul>
<p><strong>과정</strong>
<img src="https://velog.velcdn.com/images/nochik_k/post/b8e20a71-ba1b-4bfa-a81f-749f4c0f02b3/image.jpg" alt=""></p>
<pre><code>사진출처: https://networkhunt.com/tcp-three-way-handshake/</code></pre><ol>
<li><p>SYN (동기화): 클라이언트가 서버에게 SYN 패킷을 보내어 연결 요청을 합니다. 이 패킷에는 클라이언트의 초기 시퀀스 번호(Sequence Number)가 포함되어 있습니다.</p>
</li>
<li><p>SYN-ACK (동기화-응답): 서버는 SYN 패킷을 받고, 자신의 초기 시퀀스 번호와 함께 ACK 패킷을 클라이언트에게 보냅니다. 이 과정에서 서버는 클라이언트의 시퀀스 번호를 확인하고, 자신의 시퀀스 번호를 설정합니다.</p>
</li>
<li><p>ACK (응답): 클라이언트는 서버의 SYN-ACK 패킷을 받으면, 서버의 시퀀스 번호를 확인하고, 최종적으로 ACK 패킷을 보내어 연결 과정을 완료합니다.</p>
</li>
</ol>
<h3 id="4-way-handshake">4-way handshake</h3>
<blockquote>
<p>4 way handshake는 TCP 프로토콜에서 사용되는 연결 해제 과정 </p>
</blockquote>
<p>클라이언트와 서버 간의 통신이 완료된 후, 양쪽에서 연결을 안전하게 종료할 수 있다.</p>
<p>** 사용하는 이유**</p>
<ul>
<li><p>양방향 통신 종료: TCP는 전이중 통신을 지원하기 때문에, 양쪽 모두 통신을 종료하고자 함을 확인해야 한다. 4 way handshake를 통해 이를 안전하게 처리할 수 있다.</p>
</li>
<li><p>데이터 전송 완료 확인: 4 way handshake 과정에서 서버는 모든 데이터를 클라이언트에게 전송하고 나서야 연결을 종료하게 된다. 이를 통해 데이터 전송의 신뢰성을 보장할 수 있다.</p>
</li>
</ul>
<p><strong>과정</strong>
<img src="https://velog.velcdn.com/images/nochik_k/post/4e0ed025-bb5e-41c3-90e1-67d5f940b817/image.png" alt=""></p>
<pre><code>사진 출처: https://beenii.tistory.com/127</code></pre><ol>
<li><p>FIN (종료): 클라이언트가 서버에게 통신을 종료하고자 함을 알리기 위해 FIN 패킷을 보낸다.</p>
</li>
<li><p>ACK (응답): 서버는 클라이언트의 FIN 패킷을 받고, 해당 패킷에 대한 확인 응답으로 ACK 패킷을 클라이언트에게 전송한다. 이때 서버는 아직 전송해야 할 데이터가 남아있을 수 있으므로, 연결을 바로 종료하지는 않는다.</p>
</li>
<li><p>서버 데이터 전송 완료 및 FIN: 서버가 남아있는 모든 데이터를 클라이언트에게 전송하고, 전송이 완료되면 클라이언트에게 자신도 연결을 종료하겠다는 의미로 FIN 패킷을 보냅니다.</p>
</li>
<li><p>ACK (응답): 클라이언트는 서버의 FIN 패킷을 받고, 해당 패킷에 대한 확인 응답으로 ACK 패킷을 서버에게 전송합니다. 이 ACK 패킷이 도착하면 서버는 연결을 종료합니다.</p>
</li>
</ol>
<h3 id="congestion-control">Congestion control</h3>
<blockquote>
<p>혼잡 제어(Congestion control)는 네트워크에서 데이터의 전송 속도를 조절하여 전체적인 성능을 향상시키고, 네트워크의 혼잡도를 낮추기 위한 메커니즘 </p>
</blockquote>
<p>TCP 프로토콜에서 혼잡 제어는 패킷 손실, 지연 시간 증가, 네트워크의 자원 사용량 등 여러 요인을 고려하여 데이터 전송 속도를 동적으로 조절한다.</p>
<p> <strong>필요한 이유</strong></p>
<ul>
<li><p>네트워크 자원의 공정한 분배: 여러 사용자가 동시에 네트워크를 사용할 경우, 혼잡 제어를 통해 각 사용자에게 공정한 네트워크 자원 할당이 가능하다.</p>
</li>
<li><p>성능 향상: 혼잡 제어를 통해 패킷 손실 및 지연 시간을 최소화하고, 네트워크의 전체적인 성능을 향상시킬 수 있다.</p>
</li>
<li><p>안정적인 네트워크 운영: 네트워크 혼잡도를 조절함으로써, 네트워크의 안정성을 유지하고 장애 발생 가능성을 줄일 수 있다.</p>
</li>
</ul>
<p><strong>종류</strong></p>
<ol>
<li><p>슬로우 스타트(Slow Start): 초기 전송 속도를 낮게 시작하여, 속도를 점진적으로 증가시키는 알고리즘이다. 네트워크의 혼잡 상태를 파악하고 적절한 전송 속도를 찾기 위해 사용된다.</p>
</li>
<li><p>합 증가 / 곱 감소(AIMD(Additive Increase / Multicative Decrease)): 일정한 전송 속도에서 시작하여, 혼잡 윈도우 크기를 1씩 증가시키켜 속도를 증가시키지만, 중간에 패킷 손실이 발생하거나 혼잡 상태가 감지되면 혼잡 윈도우 크기를 반으로 줄여서 네트워크 혼잡을 회피하는 알고리즘이다.</p>
</li>
<li><p>빠른 회복(Fast Recovery): 패킷 손실이 발생하면 전송 속도를 급격히 낮추지 않고, 일정 수준에서 유지하며 혼잡 상태를 회복하는 알고리즘이다. 빠른 회복을 통해 전송 속도를 빠르게 회복하고 성능을 향상시킬 수 있다.</p>
</li>
<li><p>빠른 재전송(Fast Retransmit): 패킷 손실이 감지되면 즉시 해당 패킷을 재전송하는 알고리즘이다. 빠른 재전송을 통해 패킷 손실에 대한 처리 시간을 단축하고, 전송 속도를 빠르게 회복할 수 있다.</p>
</li>
<li><p>CUBIC: 슬로우 스타트, 혼잡 회피, 빠른 회복 등의 알고리즘을 결합하여, 전송 속도를 동적으로 조절하는 알고리즘이다. 테일러드 커브는 네트워크의 혼잡 상태에 따라 적절한 전송 속도를 선택하고, 성능을 최적화한다.</p>
</li>
<li><p>BBR(Bottleneck Bandwidth and RTT): BBR은 병목 대역폭과 반품 시간(Round-Trip Time) 정보를 이용하여 전송 속도를 결정하는 알고리즘이다. BBR은 네트워크의 현재 상태를 파악하고, 최적의 전송 속도를 적용하여 성능을 향상시킨다.</p>
</li>
</ol>
<p>// 슬로우 스타트와 혼잡 회피는 전통적인 혼잡 제어 알고리즘에서 주로 사용되는 기법. 빠른 재전송과 빠른 회복은 TCP Reno 및 TCP NewReno에서 도입되어, 전송 속도를 빠르게 회복하고 성능을 향상시키는 데 도움이 된다. 최근에는 특히 TCP CUBIC과 BBR이 높은 성능과 네트워크 환경 적응력으로 인해 널리 사용되고 있다.
// 혼잡제어 정책: TCP Tahoe =&gt; TCP Reno(리눅스, 윈도우, 스마트폰) =&gt; TCP CUBIC(리눅스 디폴트)</p>
<h3 id="flow-control">Flow control</h3>
<blockquote>
<p>수신 측의 처리 능력에 맞춰 송신 측의 전송 속도를 조절하여, 수신측이 처리할 수 있는 범위 내에서 데이터를 전송하는 메커니즘</p>
</blockquote>
<p>수신측의 버퍼 오버플로우를 방지하고, 데이터 손실을 최소화하기 위해 사용한다.</p>
<p> <strong>필요한 이유</strong></p>
<ul>
<li><p>수신측 처리능력 고려: 송신측이 수신측의 처리능력을 초과하여 데이터를 전송하면, 수신측에서 데이터 손실이 발생할 수 있다. 흐름 제어를 통해 이러한 상황을 방지할 수 있다.</p>
</li>
<li><p>버퍼 오버플로우 방지: 수신측에서 처리할 수 있는 데이터 양을 초과하는 경우, 버퍼 오버플로우가 발생하여 데이터 손실이 발생할 수 있다. 흐름 제어를 사용하면 송신측과 수신측의 전송 속도를 적절하게 조절하여 이를 방지할 수 있다.</p>
</li>
<li><p>네트워크 자원 효율적 사용: 흐름 제어를 통해 송신측과 수신측 간의 데이터 전송 속도를 최적화하면, 네트워크 자원의 효율적인 사용이 가능하고,네트워크의 전체적인 성능을 향상시킬 수 있다.</p>
</li>
</ul>
<p><strong>종류</strong></p>
<ol>
<li><p>정지-대기(Stop-and-Wait): 송신측이 한 번에 하나의 패킷을 전송한 후, 수신측의 ACK(응답)를 기다리는 방식으로, 수신측이 ACK를 전송하면, 송신측은 다음 패킷을 전송한다. 단순하지만 효율성이 낮다.</p>
</li>
<li><p>슬라이딩 윈도우(Sliding Window): 송신측이 수신측의 윈도우 크기에 따라 여러 패킷을 연속적으로 전송할 수 있는 방식이다. 수신측은 ACK를 전송함으로써 송신측에게 자신이 처리할 수 있는 패킷의 양을 알려준다. 정지-대기 방식에 비해 효율성이 높다.</p>
</li>
<li><p>수신측 윈도우 조절(Receiver Window Scaling): 수신측이 자신의 버퍼 크기에 따라 윈도우 크기를 동적으로 조절하는 방식이다. 이를 통해 수신측의 처리능력에 맞게 데이터 전송 속도를 조절할 수 있다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 3회차] UDP, 신뢰적 데이터 전송의 원리 정리
]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-3%ED%9A%8C%EC%B0%A8-UDP-%EC%8B%A0%EB%A2%B0%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1%EC%9D%98-%EC%9B%90%EB%A6%AC-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-3%ED%9A%8C%EC%B0%A8-UDP-%EC%8B%A0%EB%A2%B0%EC%A0%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1%EC%9D%98-%EC%9B%90%EB%A6%AC-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 21 Apr 2023 08:51:13 GMT</pubDate>
            <description><![CDATA[<h2 id="udp">UDP</h2>
<h3 id="udp-1">UDP</h3>
<blockquote>
<p>UDP(User Datagram Protocol)는 데이터를 데이터그램 단위로 처리하는 비연결형, 신뢰성이 없는 전송 프로토콜</p>
</blockquote>
<p>특징</p>
<ul>
<li>UDP는 흐름제어, 오류제어 또는 손상된 세그먼트의 수신에 대한 재전송을 하지 않아서, 세그먼트의 순서가 바뀐다거나, 전송 중 내용이 손실될 수 있다.</li>
<li>TCP보다 간단하고 빠르다.(작은 header size, 흐름제어 X)</li>
<li>네트워크 부하가 적지만, 신뢰성 있는 데이터의 전송을 보장하지 못하기에, 스트리밍 서비스같이 연속성이 중요한 서비스에 사용된다.</li>
</ul>
<p>TCP vs UDP</p>
<table>
<thead>
<tr>
<th><center>TCP</center></th>
<th><center>UDP</center></th>
</tr>
</thead>
<tbody><tr>
<td><center>연결지향형 프로토콜</center></td>
<td><center>비연결지향형 프로토콜</center></td>
</tr>
<tr>
<td><center>가상 회선 방식</center></td>
<td><center>데이터그램 방식</center></td>
</tr>
<tr>
<td><center>수신여부 확인 O</center></td>
<td><center>수신여부 확인 X</center></td>
</tr>
<tr>
<td><center>1:1 통신</center></td>
<td><center>1:1, 1:N, N:N통신</center></td>
</tr>
<tr>
<td><center>전송순서 보장 O</center></td>
<td><center>전송순서 보장 X</center></td>
</tr>
<tr>
<td><center>신뢰성 높음(데이터 재전송O)</center></td>
<td><center>신뢰성 낮음(데이터 재전송X)</center></td>
</tr>
<tr>
<td><center>전송속도 느림<center></td>
<td><center>전송속도 빠름</center></td>
</tr>
<tr>
<td><center>Segment</center></td>
<td><center>Datagram</center></td>
</tr>
<tr>
<td><center>HTTP, SMTP, FTP</center></td>
<td><center>DNS, 스트리밍 서비스</center></td>
</tr>
</tbody></table>
<h3 id="심화">심화</h3>
<h3 id="udp-체크섬checksum">UDP 체크섬(checksum)</h3>
<p><img src="https://velog.velcdn.com/images/nochik_k/post/87edd5e3-82e0-4817-b7f3-07c9cc988ea9/image.webp" alt="">
<img src="https://velog.velcdn.com/images/nochik_k/post/f6054cfd-fe9c-4b29-a465-68b0ed5aaaa0/image.webp" alt=""></p>
<pre><code>  //사진 출처: https://heegyukim.medium.com/computer-network-7-udp-86d45323d5c7</code></pre><blockquote>
<p>UDP 체크섬은 네트워크를 통해서 전송된 데이터의 값이 변경되었는지(무결성)를 검사하는 값으로, 수신된 데이터에 오류여부를 확인한다.</p>
</blockquote>
<ul>
<li>UDP 헤더는 송신 및 수신 포트번호, 데이터 길이, 체크섬 값으로 구성된다.</li>
<li>체크섬 계산법: 가상 헤더(송신 및 수신 IP 주소, 프로토콜 ID, UDP 길이), UDP 헤더, 데이터들을 16비트 단위로 쪼개 전부 더하고, 1의 보수를 취한다. 만약, 비트 중에서 하나라도 0이 잇다면 패킷에 오류가 있음을 의미</li>
<li>보안기능을 제공하는 것은 아니므로, 보안적인 조치가 필요하다.</li>
</ul>
<h2 id="신뢰적-데이터-전송">신뢰적 데이터 전송</h2>
<blockquote>
<p>RDT(Reliable Data Transfer protocol): 하위 계층에서 상위 계층에 데이터를 전송할 때 전송된 데이터가 손상, 손실되지 않게 보장하는 프로토콜</p>
</blockquote>
<p>  신뢰적 데이터 전송을 위해서는 다양한 방법이 사용될 수 있습니다. 대표적인 방법으로는 Stop-and-wait, Sliding Window, Go Back N, Selective Repeat 등의 프로토콜이 있습니다. 이러한 프로토콜은 일련번호, ACK, NACK, 윈도우 등의 기능을 이용하여 데이터의 손실이나 손상을 감지하고, 해당 데이터 블록을 재전송하거나, 누락된 데이터 블록을 요청하는 방식으로 동작합니다.</p>
<ul>
<li>UDP와 TCP가 구분되는 가장 큰 차이</li>
</ul>
<h3 id="전송-후-대기-프로토콜">전송 후 대기 프로토콜</h3>
<blockquote>
<p>Stop-and-Wait Protocol: 데이터 전송에서 사용되는 방법 중 하나로, 송신 측에서 하나의 패킷을 전송하고, 수신 확인 응답(ACK)를 받은 후에 다음 패킷을 전송하는 방식</p>
</blockquote>
<p> 송신자는 전송할 데이터를 일정한 크기의 데이터 블록으로 나눠서 일련번호와 함께 보내고,수신자는 해당 데이터 블록을 받은 후에는 일련번호와 함께 ACK를 송신자에게 보내어 해당 데이터 블록을 수신했다는 것을 알립니다.
송신자는 ACK를 받은 후에야 다음 데이터 블록을 보내게 됩니다.
  만약 ACK를 받지 못하거나 ACK가 손상된 경우에는 해당 데이터 블록을 다시 전송해야 합니다. 이때, 송신자는 해당 데이터 블록을 재전송하고, 수신자는 다시 해당 데이터 블록을 받아서 재조립합니다.</p>
<ul>
<li>특징: 패킷 단위 전송(하나의 패킷만 전송), 슬라이딩 윈도우 방식</li>
<li>장점: 간단한 구현, 오류 검출 및 복구가 용이</li>
<li>단점: 대역폭 이용 효율성 저하, 처리속도 저하(한 개의 프레임만 전송 가능해서 성능이 좋지 못하고, 응답신호가 유실되거나 지연시 타임아웃으로 재전송하게 되면, 중복된 프레임 발생 가능성 O)</li>
</ul>
<h3 id="파이프라인-프로토콜">파이프라인 프로토콜</h3>
<blockquote>
<p>Pipelined Protocol: 데이터 전송을 여러 단계로 나누어 전송하고 처리하는 방식</p>
</blockquote>
<p>  송신자는 일정한 개수의 데이터 블록을 묶어서 보내는데, 이를 윈도우(window)라고 한다. 윈도우의 크기는 수신자의 버퍼 크기에 따라 조절되며, 수신자는 윈도우 안에서 최대한 많은 데이터 블록을 받아서 재조립합니다.
  만약 수신자가 윈도우 안에서 데이터 블록을 받지 못하거나 손상된 데이터를 받은 경우, 해당 데이터 블록은 재전송해야하는 데이터 블록만 재전송하며, 그 외의 데이터 블록은 계속해서 전송됩니다.</p>
<ul>
<li>특징: 대량의 데이터를 효율적으로 전송하고 처리하기 위해 개발된 프로토콜</li>
<li>장점: 대역폭 이용 효율성이 높음(여러 개의 패킷이 동시에 전송될 수 있음), 프로토콜 병목현상 최소화(각 단계에서 발생한 병목현상은 다른 단계에 영향을 끼치지 X)</li>
<li>단점: 오류 처리의 어려움(각 단계에서 발생한 오류 처리가 어려움), 구현의 어려움(여러 단계이기에, 구현이 복잡), 응답 시간의 지연(전체적인 처리 시간이 늘어나 응답 시간이 더디게 될 수 O)</li>
</ul>
<p>// 버퍼링: 입출력 장치(저속)와 CPU(고속)의 속도차를 RAM을 활용하여 완충하는 것 </p>
<h3 id="심화-1">심화</h3>
<h3 id="슬라이딩-윈도우">슬라이딩 윈도우</h3>
<blockquote>
<p>Sliding Window: 송신 측이 전송한 패킷의 수신 여부에 따라 윈도우의 크기를 조절하여 데이터 전송을 조절하는 방식</p>
</blockquote>
<p>  송신자는 일정한 개수의 데이터 블록을 묶어서 윈도우(window)라는 블록으로 보내는데, 윈도우의 크기는 수신자의 버퍼 크기에 따라 조절됩니다. 윈도우 안에서는 최대한 많은 데이터 블록을 보낼 수 있습니다.</p>
<p>수신자는 윈도우 안에서 수신한 데이터 블록을 일련번호를 기반으로 재조립합니다. 그리고, 윈도우 안의 일련번호를 기준으로 다음에 받아야할 데이터 블록의 일련번호를 추적합니다. 수신자는 윈도우 안에서 받아야할 데이터 블록을 모두 받은 후에는 윈도우를 이동시켜서 다음 데이터 블록들을 받을 수 있도록 합니다.</p>
<p>송신자는 ACK를 수신하지 못한 데이터 블록이 있다면, 해당 블록부터 다시 전송을 시작합니다. 이때, 윈도우의 크기는 변하지 않습니다. ACK를 수신한 데이터 블록은 윈도우에서 제거되고, 다음 데이터 블록을 전송하기 위해 윈도우를 이동시킵니다.</p>
<ul>
<li>장점: 대역폭 이용 효율성이 높음, 신뢰성(수신 측에서 패킷을 제대로 수신했는지 확인 후 다음 패킷을 요청)</li>
<li>단점: 오버헤드(패킷의 수신여부를 확인하기 위한 추가적인 오버헤드가 필요), 응답 시간의 지연(수신 측에서 패킷을 제대로 수신했는지 확인하는 과정에서 지연 시간이 발생할 수 있음), 일련번호의 중복이나 오류가 발생할 경우 데이터의 손상이나 블록의 순서가 있음</li>
</ul>
<h3 id="go-back-n">Go Back N</h3>
<blockquote>
<p>GBN: 데이터 전송에서 오류 처리와 재전송을 위해 사용되는 방법 중 하나로, 송신 측에서 여러 패킷을 전송하고, 수신 측에서 순서대로 수신하며, 오류가 발생한 패킷부터 다시 전송을 요청하는 방식 (ACK 없이 보내는 방식)</p>
</blockquote>
<p>  송신자는 데이터 블록을 보낼 때 일련번호와 함께 보내며, 수신자는 일련번호를 이용하여 받아야 할 데이터 블록을 추적합니다. 수신자는 데이터 블록을 받으면 확인 응답(ACK)을 보내고, 송신자는 해당 ACK를 받으면 다음 데이터 블록을 보냅니다.
  만약 수신자가 일련번호가 누락된 데이터 블록을 받거나 손상된 데이터 블록을 받은 경우, 수신자는 해당 데이터 블록부터 다시 받기를 요청합니다.이때, 송신자는 요청된 데이터 블록부터 다시 전송을 시작하며, 이전에 보낸 데이터 블록들은 모두 재전송됩니다. 이를 Go Back N이라고 합니다.</p>
<ul>
<li>특징: 연속적인 패킷 전송, 빠른 재전송(오류가 발생한 패킷부터 다시 전송을 요청), 슬라이딩 윈도우 방식(송신 측이 전송한 패킷이 수신 측에서 확인되기 전까지 윈도우 크기를 유지)</li>
<li>장점: 신뢰성이 높음(오류가 발생한 패킷부터 다시 전송하기에, 신뢰성이 높음), 구현이 용이</li>
<li>단점: 전체 처리 속도 감소(오류가 발생한 패킷부터 다시 전송 요청하기 때문), 대역폭 이용 효율성 저하</li>
</ul>
<h3 id="selective-repeat">Selective Repeat</h3>
<blockquote>
<p>SR: 데이터 전송에서 오류 처리와 재전송을 위해 사용되는 방법 중 하나로, 수신 측에서 오류가 발생한 패킷만 다시 요청하고, 정상적으로 수신된 패킷은 바로 처리하는 방식(패킷을 모두 버리지 않고 keep해두는 방식)</p>
</blockquote>
<p>  송신자는 데이터 블록을 보낼 때 일련번호와 함께 보내며, 수신자는 일련번호를 이용하여 받아야 할 데이터 블록을 추적합니다. 수신자는 데이터 블록을 받으면 해당 블록의 일련번호를 확인 응답(ACK)로 송신자에게 보내고, 수신자는 일련번호를 기준으로 버퍼에 저장합니다.
  만약 수신자가 일련번호가 누락된 데이터 블록을 받거나 손상된 데이터 블록을 받은 경우, 수신자는 해당 데이터 블록만 재전송을 요청합니다. 이때, 송신자는 요청된 데이터 블록만 다시 전송하며, 이전에 보낸 데이터 블록들은 전송하지 않습니다.</p>
<ul>
<li>특징: 개별적인 패킷 전송 / 빠른 재전송 / 슬라이딩 윈도우 방식</li>
<li>장점: 대역폭 이용 효율성 증가 / 처리 속도 개선</li>
<li>단점: 구현의 어려움, 오버헤드, 오류처리의 어려움</li>
</ul>
<hr>
<blockquote>
<p>어려웠던 점, 반성하고 싶은 점 / 개선할 방법</p>
</blockquote>
<p>어려웠던 점</p>
<ul>
<li>레퍼런스를 이것저것 찾아봤으나, 남에게 설명할 수 있을 정도로 이해되지 않았다.</li>
</ul>
<p>개선할 방법</p>
<ul>
<li>원리를 이해하고, 한 번에 이해한다기보다 나중에도 다시 봄으로써 이해해야겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트 - JS] 빈출 개념 정리 (알고리즘 X)]]></title>
            <link>https://velog.io/@nochik_k/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-JS-%EB%B9%88%EC%B6%9C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-X</link>
            <guid>https://velog.io/@nochik_k/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-JS-%EB%B9%88%EC%B6%9C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-X</guid>
            <pubDate>Fri, 21 Apr 2023 01:22:02 GMT</pubDate>
            <description><![CDATA[<h2 id="built-in-object">Built-in Object</h2>
<h3 id="eval">eval()</h3>
<p>문자열로 나타낸 자바스크립트의 명령문 또는 연산식 실행</p>
<pre><code>console.log(eval(&#39;100 + 100&#39;)); // 200</code></pre><h3 id="parseint">parseInt()</h3>
<p>문자열을 해당 진수(10진수, 16진수 등)의 정수로 반환
parseInt(문자열, 진수)</p>
<pre><code>console.log(parseInt(&#39;100, 16&#39;)); // 256
console.log(parseInt(&#39;100, 2&#39;)); // 4</code></pre><h2 id="array">Array</h2>
<h3 id="concat">concat()</h3>
<p>문자열로 나타낸 자바스크립트의 명령문 또는 연산식 실행</p>
<pre><code>let arr = [&#39;apple&#39;, &#39;pear&#39;];
let arr1 = [&#39;banana&#39;, &#39;peach&#39;, &#39;pineapple&#39;]

console.log(arr.concat(arr1));</code></pre><h3 id="splice">splice()</h3>
<p>요소를 삭제하거나 교체
splice(인덱스, 0(해당 자리에 다음 문자열을 위치)or 1(해당 자리에 기존 문자열을 삭제하고 넣음), 문자열)</p>
<pre><code>let arr = [&#39;apple&#39;, &#39;pear&#39;, &#39;banana&#39;];

console.log(arr.splice(1, 1, &#39;peach&#39;); // pear =&gt; peach
console.log(arr); // [&#39;apple&#39;, &#39;peach&#39;, &#39;banana&#39;];

console.log(arr.splice(1, 0, &#39;pineapple&#39;);
console.log(arr); // [&#39;apple&#39;, &#39;pineapple&#39;, &#39;peach&#39;, &#39;banana&#39;]
</code></pre><h3 id="slice">slice()</h3>
<p>요소를 인덱스 기준으로 잘라냄
slice(시작 인덱스, 종료+1 인덱스)</p>
<pre><code>let arr = [3, 4, 2, 6, 9, 1];

console.log(arr.slice(2,6)); // 2~5번 인덱스 [2, 6, 9, 1]</code></pre><h3 id="map">map()</h3>
<p>배열을 순회하며 함수를 실행한 결과로 새로운 배열을 만들어 반환</p>
<pre><code>let arr = [3, 4, 2, 6, 9, 1];
let arr1 = [&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;]

function multiply(x){
    return x**2;
}
console.log(arr.map(multiply)); // [9, 16, 4, 36, 81, 1]
console.log(arr.map(x =&gt; parseInt(x, 10))); // [1, 2, 3, 4, 5]</code></pre><h3 id="sort">sort()</h3>
<p>배열을 정렬 후 그 배열을 반환</p>
<pre><code>let arr = [1, 100, 10 ,22, 4, 2];

console.log(arr.sort()); // [1, 2, 4, 10, 22, 100]

let score = [30, 70, 65, 80, 87, 82];

score.sort((a, b) =&gt; {
    return b - a;
});

console.log(score); // [87, 82, 80, 70, 65, 30]
// 오름차순의 경우 return a - b</code></pre><h3 id="reverse">reverse()</h3>
<p>배열을 역순으로 정렬한 후 그 배열을 반환</p>
<pre><code>let arr = [1, 2, 3, 4, 5];

console.log(arr.reverse()); [5, 4, 3, 2, 1]</code></pre><h2 id="set-중복값을-제외한-유일한-값-저장">Set: 중복값을 제외한 유일한 값 저장</h2>
<pre><code>let arr = [1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5];
let s = new Set(arr);

console.log(s); // {1, 2, 3, 4, 5}
console.log(s.size); // 5
console.log(s.lenght); // undefined

let m = new Map();
m.set(&#39;수학점수&#39;, 90);

// has(): 객체 내 주어진 키의 값이 있는지 확인하고 Boolean 값 반환
console.log(m.has(&#39;수학점수&#39;)); // true
console.log(m.has(90)); // false</code></pre><h2 id="string">String</h2>
<pre><code>\n: 개행
\t: 탭
\&#39;: 작은따옴표
\&quot;: 큰따옴표
\\: 역슬래시</code></pre><h3 id="includes">includes</h3>
<p>문자열이 특정 문자열을 포함하는지 확인
string.includes( searchString, length )</p>
<ul>
<li>searchString : 검색할 문자열로 필수 요소이다. 대소문자를 구분한다.</li>
<li>length : 검색을 시작할 위치이다. 선택 요소로, 값이 없으면 전체 문자열을 대상으로 한다.</li>
</ul>
<pre><code>let str = &#39;abc abcde abcd ab cde ef&#39;;

console.log(str.includes(&#39;abc&#39;)); // true
console.log(str.inclues(&#39;bcd&#39;)); // false</code></pre><h3 id="split">split()</h3>
<p>문자열을 지정된 구분자로 나눈 후 배열로 반환</p>
<pre><code>let str = &#39;동해물과 백두산이 마르고 닳도록&#39;;

console.log(str.split(&#39; &#39;)); // [&#39;동해물과&#39;, &#39;백두산이&#39;, &#39;마르고&#39;, &#39;닳도록&#39;]</code></pre><h3 id="replace">replace()</h3>
<p>특정 패턴에 일치하는 문자열을 교체</p>
<pre><code>let str = &#39;abc abcde abcd ab cde ef&#39;;

console.log(str.replace(&#39;ab&#39;, &#39;!&#39;)); // abc abcde abcd ! cde ef</code></pre><h3 id="indexof">indexOf()</h3>
<p>문자열에서 정규식과 매치되는 부분을 검색하고 배열로 반환</p>
<pre><code>let str = &#39;동해물과 백두산이 마르고 닳도록&#39;;

console.log(str.indexOf(&#39;백두산이&#39;)); // 5</code></pre><h3 id="match">match()</h3>
<p>주어진 문자열과 첫번째로 만나는 문자열의 인덱스 반환</p>
<pre><code>let str = &#39;abc abcd abcde ab cd def ABC&#39;;
let regEx = /abc/gi // 전역에서 대소문자 구별 없이 찾기

console.log(str.match(regEx)); //[&quot;abc&quot;, &quot;abc&quot;, &quot;abc&quot;, &quot;ABC&quot;];</code></pre><h2 id="math-메서드">Math 메서드</h2>
<pre><code>Math.abs(): 절대값 반환
Math.ceil(): 올림
Math.floor(): 내림
Math.round(): 반올림
Math.max(): 가장 큰 수 반환
Math.min(): 가장 작은 수 반환
Math.pow(x, y): x의 y 제곱근 반환 // Math.pow(3, 2) = 9</code></pre><h2 id="정규-표현식">정규 표현식</h2>
<p>문자열의 일정한 패턴을 표현하는 일종의 형식 언어</p>
<pre><code>\d // 숫자 하나
\w // 문자 하나
/.../ // 문자 3개
\d+ // 하나 이상의 연결된 숫자 
{n, m} // 앞에 나오는 문자 패턴이 최소 n, 최대 m번 반복
[1-9]\d* // 0으로 시작하지 않는 연속된 숫자들
\d{2,3}[ -]?\d{3,4}[ -]?\d{4} // 전화번호 (2~3자리)-(3~4자리)-(4자리)
[a-z]+ // 연속된 소문자
[가-힣]+ // 한글 연속된 문자
\s // 공백 문자(스페이스, 탭, 뉴라인)
\S // 공백 문자를 제외한 문자
\D // 숫자를 제외한 문자
\W // 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)
/조건/ // 조건에 일치하는 결과 하나만 검색
/조건/g // 조건에 일치하는 결과 모두 검색
/조건/i // 대소문자를 구별하지 않고 검색
/조건/m // 문자열의 행이 바뀌더라도 계속 검색
^ // 문자열 시작 또는 줄의 시작부분에 대응
[^] // 대괄호 안에서 사용하면 뒤에 나오는 표현식으로 시작하지 않는다는 것을 의미 
$ // 문자열 끝 또는 줄의 끝부분에 대응</code></pre><h2 id="ascii-코드표">ASCII 코드표</h2>
<p>&quot;문자열&quot;.charCodeAt(인덱스)</p>
<blockquote>
<p>65: &quot;A&quot;
90: &quot;Z&quot;
97: &quot;a&quot;
122: &quot;z&quot;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 2회차] HTTP, HTTPS, DNS 정리]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-2%ED%9A%8C%EC%B0%A8-HTTP-HTTPS-DNS-%EC%A0%95%EB%A6%AC%EC%8B%AC%ED%99%94-%EB%82%B4%EC%9A%A9%EC%9D%80-%EC%B6%94%ED%9B%84-%EB%B3%B4%EC%99%84-%EC%98%88%EC%A0%95</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-2%ED%9A%8C%EC%B0%A8-HTTP-HTTPS-DNS-%EC%A0%95%EB%A6%AC%EC%8B%AC%ED%99%94-%EB%82%B4%EC%9A%A9%EC%9D%80-%EC%B6%94%ED%9B%84-%EB%B3%B4%EC%99%84-%EC%98%88%EC%A0%95</guid>
            <pubDate>Sun, 16 Apr 2023 10:30:42 GMT</pubDate>
            <description><![CDATA[<h2 id="http">HTTP</h2>
<h3 id="http-프로토콜이-무엇인가요">HTTP 프로토콜이 무엇인가요?</h3>
<blockquote>
<p>HTTP는 Hyper Text Transfer Protocol의 약자로,  인터넷에서 데이터를 주고 받을 수 있는 절차와 형식을 규정한 프로토콜</p>
</blockquote>
<ul>
<li><p>웹브라우저와 웹서버 애플리케이션은 HTTP를 이용해 웹페이지 파일을 전송한다.</p>
</li>
<li><p>HTTP 파일 전송은 반드시 웹 브라우저의 요청과 이에 대한 웹서버 애플리케이션의 응답으로 이뤄진다.</p>
</li>
<li><p>HTTP는 HTML 파일뿐만 아니라, 다양한 종류(JPEG, PNG 등의 이미지 파일, PDF, 워드, 엑셀 등)의 파일을 전송하는 범용적인 프로토콜로도 이용할 수 있다.</p>
</li>
<li><p>HTTP는 트랜스포트 층의 프로토콜로서 TCP를 이용하기에, 통신 전에 TCP 커넥션을 맺는다.</p>
</li>
</ul>
<h3 id="http의-요청응답-모델에-대해-설명해주세요-예시는-하단-헤더-부분-참고">HTTP의 요청/응답 모델에 대해 설명해주세요. (예시는 하단 <strong>헤더</strong> 부분 참고)</h3>
<blockquote>
<p>HTTP의 통신 원리는 웹브라우저(클라이언트)가 웹서버 애플리케이션(서버)에 HTTP 요청 메시지를 보내면, 웹서버 애플리케이션이 HTTP 응답 메시지를 보내는 것이다.</p>
</blockquote>
<h4 id="http-요청">HTTP 요청</h4>
<p>HTTP 요청의 형식은 리퀘스트 라인, 메시지 헤더, 엔티티 바디로 이루어진다.</p>
<ul>
<li>리퀘스트 라인은 HTTP 리퀘스트의 첫 줄로, 웹서버에 대한 실제 처리 요청을 전달하며, 메소드, URI 버전으로 구성된다.</li>
<li>메시지 헤더는 리퀘스트 라인에 이어지는 여러줄의 텍스트로, 웹브라우저의 종류와 버전, 대응하는 데이터 형식 등의 정보를 기술한다. </li>
<li>엔티티 바디는 메시지 헤더와 뒤이어 나오는 공백 라인 이후 나오는 부분으로, POST 메소드로 웹브라우저에 데이터를 보낼 떄 사용된다.</li>
</ul>
<h4 id="http-응답">HTTP 응답</h4>
<p>HTTP 응답의 형식은 리스폰스 라인, 메시지 헤더, 엔티티 바디로 이루어진다.</p>
<ul>
<li>리스폰스 라인은 HTTP 리스폰스 첫 줄로, 웹브라우저의 요청에 대한 응답을 전달하며, HTTP 버전과 상태코드, 설명문으로 구성된다.</li>
<li>메시지 헤더는 리스폰스 라인에 이어지는 여러줄의 텍스트로, 요청에 대한 추가 정보를 제공하거나, 응답과 관련된 메타데이터를 포함한다.</li>
<li>엔티티 바디는 메시지 헤더와 뒤이어 나오는 공백 라인 이후 나오는 부분으로, 요청된 리소스의 내용이나 추가 데이터를 포함한다.</li>
</ul>
<h3 id="http-메서드">HTTP 메서드</h3>
<blockquote>
<p>웹 브라우저(클라이언트)가 웹서버 애플리케이션(서버)에 수행하길 원하는 동작을 나타낸다.
각 메서드는 다른 용도와 특징을 가지고 있기에, 차이를 이해하고 적절한 상황에서 사용하는 것이 중요하다.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="left"><center>메서드</center></th>
<th align="right"><center>의미</center></th>
</tr>
</thead>
<tbody><tr>
<td align="left"><center>GET</center></td>
<td align="right"><center>서버가 클라이언트에서 지정된 리소스를 검색한다.</center></td>
</tr>
<tr>
<td align="left"><center>POST</center></td>
<td align="right"><center>클라이언트가 서버에 데이터를 전송하여 새 리소스를 생성하거나, 서버의 상태를 변경하도록 요청한다.</center></td>
</tr>
<tr>
<td align="left"><center>PUT</center></td>
<td align="right"><center>지정된 리소스를 클라이언트가 제공한 데이터로 완전히 대체한다. 만약 지정된 리소스가 없다면 새로 생성할 수 있다.</center></td>
</tr>
<tr>
<td align="left"><center>PATCH</center></td>
<td align="right"><center>리소스의 일부분만 수정하고자 할 때 사용한다.</center></td>
</tr>
<tr>
<td align="left"><center>DELETE</center></td>
<td align="right"><center>지정된 리소스를 삭제한다.</center></td>
</tr>
<tr>
<td align="left"><center>HEAD</center></td>
<td align="right"><center>지정된 리소스의 헤더만 가져온다. </center></td>
</tr>
<tr>
<td align="left"><center>OPTIONS</center></td>
<td align="right"><center>해당 리소스에서 사용가능한 HTTP메서드를 나열한다.</center></td>
</tr>
<tr>
<td align="left"><center>CONNECT</center></td>
<td align="right"><center>네트워크 연결을 설정하기 위해 사용한다.</center></td>
</tr>
<tr>
<td align="left"><center>TRACE</center></td>
<td align="right"><center>요청과 응답 메시지를 디버깅하기 위해 사용한다.</center></td>
</tr>
</tbody></table>
<h4 id="http-메서드중-get과-post의-차이점은-뭔가요">HTTP 메서드중 GET과 POST의 차이점은 뭔가요?</h4>
<ul>
<li><strong>목적</strong>: GET 메서드는 서버에서 정보를 조회하기 위해 사용되며, POST 메서드는 서버에 새로운 리소스를 생성하거나 서버의 상태를 변경하기 위해 사용한다.</li>
<li><strong>멱등성</strong>: GET 메서드는 같은 요청을 여러 번 보내도 동일한 결과를 얻는다. 반면에 POST 메서드는 같은 요청을 여러 번 보낼 경우, 여러 개의 리소스가 생성되거나 상태 변경이 반복될 수 있다.</li>
<li><strong>캐싱</strong>: GET 메서드는 캐시될 수 있다. 이는 웹 브라우저나 프록시 서버에서 자주 요청되는 데이터를 저장하고 빠르게 제공하기 위한 기능이다. POST 메서드는 캐시되지 않는다.</li>
<li><strong>URL에 데이터 포함</strong>: GET 메서드는 데이터를 URL의 쿼리 파라미터에 포함시킨다. POST 메서드는 데이터를 요청 본문에 포함시키며, URL에는 나타나지 않는다.</li>
<li><strong>데이터 크기</strong>: GET 메서드는 URL에 데이터를 포함시키기 때문에, 데이터 크기에 제한이 있다. POST 메서드는 요청 본문에 데이터를 포함시키므로, 상대적으로 더 큰 데이터를 전송할 수 있다.</li>
</ul>
<h4 id="put과-patch의-차이점은-뭘까요">PUT과 PATCH의 차이점은 뭘까요?</h4>
<ul>
<li><strong>리소스 수정 방식</strong>: PUT 메서드는 전체 리소스를 클라이언트가 제공한 데이터로 완전히 대체한다. 반면 PATCH 메서드는 리소스의 일부분만 수정하는 데 사용한다.</li>
<li><strong>멱등성</strong>: PUT 메서드는 같은 요청을 여러 번 보내도 동일한 결과를 얻는다. 반면 PATCH 메서드는 같은 요청을 여러 번 보낼 경우, 부분 수정이 반복될 수 있다.</li>
<li><strong>효율성</strong>: PUT 메서드는 전체 리소스를 대체하기 때문에, 수정할 부분이 작더라도 전체 데이터를 전송해야 합니다. 반면 PATCH 메서드는 수정하려는 부분의 데이터만 전송하므로, 네트워크 효율성이 높습니다.</li>
</ul>
<h3 id="http-상태-코드가-뭔가요-알고-있는-상태-코드-몇가지-알려주세요">HTTP 상태 코드가 뭔가요? 알고 있는 상태 코드 몇가지 알려주세요.</h3>
<blockquote>
<p>HTTP 상태 코드는 서버가 클라이언트에게 응답의 상태를 알려주는 3자리 숫자다.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="left"><center>상태 코드</center></th>
<th align="right"><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td align="left"><center><strong>1xx (정보)</strong></center></td>
<td align="right"><center><strong>요청이 수신되어 처리 중임을 나타낸다.</strong></center></td>
</tr>
<tr>
<td align="left"><center>100 Continue</center></td>
<td align="right"><center>클라이언트는 요청을 계속하거나 무시할 수 있다. 서버는 이 요청에 응답할 준비가 되었음을 알린다.</center></td>
</tr>
<tr>
<td align="left"><center><strong>2xx (성공)</strong></center></td>
<td align="right"><center><strong>요청이 성공적으로 수신, 이해 및 처리되었음을 나타낸다.</strong></center></td>
</tr>
<tr>
<td align="left"><center>200 OK</center></td>
<td align="right"><center>요청이 성공적으로 처리된 경우이며, 응답은 메서드에 따라 다른 정보를 포함한다.</center></td>
</tr>
<tr>
<td align="left"><center>201 Created</center></td>
<td align="right"><center>요청이 성공적으로 처리되었고, 새로운 리소스가 생성된다.</center></td>
</tr>
<tr>
<td align="left"><center>204 No Content</center></td>
<td align="right"><center>요청이 성공적으로 처리되었지만, 응답 본문에 보낼 데이터가 없다. </center></td>
</tr>
<tr>
<td align="left"><center><strong>3xx (리다이렉션)</strong></center></td>
<td align="right"><center><strong>해당 리소스에서 사용가능한 HTTP메서드를 나열한다.</strong></center></td>
</tr>
<tr>
<td align="left"><center>301 Moved Permanently</center></td>
<td align="right"><center>네트워크 연결을 설정하기 위해 사용한다.</center></td>
</tr>
<tr>
<td align="left"><center>302 Found</center></td>
<td align="right"><center>요청한 리소스가 일시적으로 다른 위치로 이동한다. 새로운 URL은 응답 내 Location 헤더에 제공된다.</center></td>
</tr>
<tr>
<td align="left"><center><strong>4xx (클라이언트 오류)</strong></center></td>
<td align="right"><center><strong>클라이언트의 요청이 잘못된 형식이거나 처리할 수 없음을 나타낸다.</strong></center></td>
</tr>
<tr>
<td align="left"><center>400 Bad Request</center></td>
<td align="right"><center>클라이언트의 요청이 잘못된 경우로, 서버가 요청을 이해할 수 없다.</center></td>
</tr>
<tr>
<td align="left"><center>401 Unauthorized</center></td>
<td align="right"><center>클라이언트는 요청한 리소스에 대한 인증이 필요하다.</center></td>
</tr>
<tr>
<td align="left"><center>403 Forbidden</center></td>
<td align="right"><center>클라이언트는 요청한 리소스에 대한 권한이 없는 경우로, 인증과는 별개로, 리소스에 대한 접근이 거부된다.</center></td>
</tr>
<tr>
<td align="left"><center>404 Not Found</center></td>
<td align="right"><center>    요청한 리소스를 찾을 수 없는 경우로, 주소가 잘못되었거나, 리소스가 삭제되었을 수 있다.</center></td>
</tr>
<tr>
<td align="left"><center><strong>5xx (서버 오류)</strong></center></td>
<td align="right"><center><strong>서버가 요청을 처리하는 데 실패했음을 나타낸다.</strong> </center></td>
</tr>
<tr>
<td align="left"><center>500 Internal Server Error</center></td>
<td align="right"><center>서버에 오류가 발생하여 요청을 처리할 수 없다.</center></td>
</tr>
<tr>
<td align="left"><center>502 Bad Gateway</center></td>
<td align="right"><center>서버가 게이트웨이로부터 잘못된 응답을 수신했음을 의미합니다. 인터넷상의 서버가 다른 서버로부터 유효하지 않은 응답을 받은 경우 발생한다.</center></td>
</tr>
<tr>
<td align="left"><center>503 Service Unavailable</center></td>
<td align="right"><center>서버가 일시적으로 요청을 처리할 수 없는 경우로, 일반적으로 서버 과부하나 일시적인 유지보수로 인해 발생한다.</center></td>
</tr>
<tr>
<td align="left"><center>504 Gateway Timeout</center></td>
<td align="right"><center>웹페이지를 로드하거나 브라우저에서 다른 요청을 채우려는 동안 한 서버가 액세스하고 있는 다른 서버에서 적시에 응답을 받지 못했음을 의미한다.</center></td>
</tr>
</tbody></table>
<h3 id="http-헤더가-뭘까요-알고-있는-헤더-몇-가지-설명해주세요">HTTP 헤더가 뭘까요? 알고 있는 헤더 몇 가지 설명해주세요.</h3>
<blockquote>
<p>HTTP 헤더는 클라이언트와 서버 간의 통신에서 추가 정보를 교환하는데 사용되며, 다양한 목적과 기능을 가지고 있다.</p>
</blockquote>
<h4 id="http-요청-헤더">HTTP 요청 헤더</h4>
<pre><code>// 리퀘스트 라인
POST /search HTTP/1.1
// 메시지 헤더
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

// 엔티티 바디(POST 메서드가 아닌 경우 공백)
q=HTTP%20POST%20%EA%B8%B0%EB%B2%95</code></pre><p><strong>리퀘스트 라인</strong></p>
<ul>
<li>HTTP 메서드: POST</li>
<li>요청 대상(URI): /search 
요청 대상은 서버에서 요청을 처리하기 위해 필요한 리소스의 위치를 나타내며, 이 경우에는 /search라는 경로에 요청을 보낸다.</li>
<li>HTTP 버전: HTTP/1.1
HTTP 프로토콜 버전을 나타내며, 여기서는 HTTP/1.1 버전을 사용하고 있다. <br></li>
</ul>
<p>*<em>주요 메시지 헤더 *</em></p>
<ul>
<li><strong>Accept: 클라이언트가 이해할 수 있는 컨텐츠 타입을 나열한다.</strong></li>
<li>Accept-Encoding: 클라이언트가 지원하는 인코딩 방식을 나열한다.</li>
<li>Accept-Language: 클라이언트가 선호하는 언어를 나열한다.</li>
<li><strong>Authorization: 클라이언트의 인증 정보를 포함한다.</strong></li>
<li>Cache-Control: 캐싱 동작을 지정한다.</li>
<li>Connection: 네트워크 연결의 관리 방식을 나타낸다.</li>
<li>Content-Length: 요청 본문의 크기를 바이트 단위로 나타낸다.</li>
<li><strong>Content-Type: 요청 본문의 미디어 타입을 나타낸다.</strong></li>
<li><strong>Cookie: 서버에 저장된 쿠키를 전송한다.</strong></li>
<li>Host: 요청이 전송되는 서버의 도메인 이름과 포트 번호를 나타낸다.</li>
<li>Referer: 현재 요청을 발생시킨 웹 페이지의 주소를 나타낸다.</li>
<li><strong>User-Agent: 클라이언트의 소프트웨어(웹 브라우저)에 대한 정보를 나타낸다.</strong></li>
</ul>
<p>*<em>엔티티 바디 *</em></p>
<ul>
<li>q: 검색어를 나타내는 파라미터로 q는 query(질의)의 약자</li>
<li>HTTP%20POST%20%EA%B8%B0%EB%B2%95: URL 인코딩된 검색어로 URL 인코딩은 특수 문자나 공백 등을 안전하게 전송하기 위해 사용되는 인코딩 방식이다. 이 경우, %20은 공백을 나타내고 %EA%B8%B0%EB%B2%95은 한글 &quot;기법&quot;을 URL 인코딩한 것이다.
=&gt; 이를 디코딩한 원래 검색어: &#39;HTTP POST 기법&#39;</li>
</ul>
<h4 id="http-응답-헤더">HTTP 응답 헤더</h4>
<pre><code>// 리스폰스 라인
HTTP/1.1 200 OK
// 메시지 헤더
Date: Sun, 16 Apr 2023 12:28:53 GMT
Server: gws
Content-Type: text/html; charset=UTF-8
Content-Length: 3000

// 엔티티 바디
(검색 결과를 포함한 HTML 문서 내용)</code></pre><p><strong>리스폰스 라인</strong></p>
<ul>
<li>HTTP 버전: HTTP/1.1</li>
<li>상태 코드: 200</li>
<li>상태 메시지: OK
상태 코드를 설명하는 짧은 텍스트 메시지</li>
</ul>
<p>상태 메시지는 상태 코드를 설명하는 짧은 텍스트 메시지입니다. 200 상태 코드의 경우, 상태 메시지는 &#39;OK&#39;입니다. 이 메시지는 상태 코드에 대한 추가적인 설명을 제공합니다.<br>
*<em>주요 메시지 헤더 *</em></p>
<ul>
<li><strong>Access-Control-Allow-Origin: 자원에 접근할 수 있는 도메인을 지정한다.</strong></li>
<li><strong>Cache-Control: 캐싱 동작을 지정한다.</strong></li>
<li><strong>Content-Disposition: 응답 본문을 처리하는 방식을 제안한다. (예: 파일 다운로드)</strong></li>
<li><strong>Content-Encoding: 응답 본문의 인코딩 방식을 나타낸다.</strong></li>
<li><strong>Content-Length: 응답 본문의 크기를 바이트 단위로 나타낸다.</strong></li>
<li><strong>Content-Type: 응답 본문의 미디어 타입이다.**</strong></li>
</ul>
<hr>
<h3 id="심화">심화</h3>
<h3 id="http의-무상태성stateless에-대해서-설명해주세요">HTTP의 무상태성(Stateless)에 대해서 설명해주세요.</h3>
<blockquote>
<p>클라이언트와 서버 간의 통신에서 상태 정보를 유지하지 않는 것을 의미</p>
</blockquote>
<p>특징</p>
<ul>
<li>서버의 부하를 줄일 수 있다.(클라이언트에 대한 상태정보를 유지하지 않기에)</li>
<li>캐시를 이용하여 성능을 개선할 수 있다.(같은 리소스 다시 요청시 캐시에서 데이터를 가져옴)</li>
<li>일부 웹앱에서 문제 발생가능성이 있다.(이는 쿠키나 세션방식으로 해결)<h3 id="http-keep-alive에-대해서-설명해주세요">HTTP Keep-Alive에 대해서 설명해주세요.</h3>
<blockquote>
<p>클라이언트와 서버 간에 연결을 끊지 않고 유지하는 것을 의미</p>
</blockquote>
</li>
</ul>
<p>특징</p>
<ul>
<li>연결을 유지하므로, 처리속도가 개선된다.</li>
<li>연결을 다시 설정하는데 필요한 오버헤드를 줄여, 서버의 부하를 감소시킨다.</li>
<li>HTTP/1.0부터 사용 가능하며, HTTP/1.1에서는 기본적으로 활성화되어 있습니다. 그러나 모든 클라이언트와 서버가 HTTP Keep-Alive를 지원하는 것은 아니기 때문에, 일부 상황에서는 적용되지 않을 수 있다.</li>
</ul>
<h3 id="http-파이프라이닝에-대해서-설명해주세요">HTTP 파이프라이닝에 대해서 설명해주세요.</h3>
<blockquote>
<p>HTTP(Hypertext Transfer Protocol)에서 요청과 응답을 처리하는 방식 중 하나로, 연속된 요청을 일괄적으로 보내고 응답을 일괄적으로 받는 방식</p>
</blockquote>
<p>특징</p>
<ul>
<li>연속된 요청 처리가 가능하다</li>
<li>대역폭을 효율적으로 사용할 수 있다</li>
<li>몇 가지 제약사항이 있다(서버는 요청을 순서대로 처리하지 않고, 동시에 처리해야 하므로, 요청의 순서가 중요한 경우에는 사용하지 않을 것 / HTTP 파이프라이닝을 지원하지 않는 서버도 있음)</li>
</ul>
<h3 id="http11-http2-http3-각각의-특징에-대해-설명해주세요">HTTP/1.1, HTTP/2, HTTP/3 각각의 특징에 대해 설명해주세요.</h3>
<p>HTTP/1.1</p>
<ul>
<li>연결마다 하나의 요청과 응답만 처리 가능하고, 여러 연결을 사용하여 병렬로 처리한다.</li>
<li>Keep-Alive 기능을 사용하여 연결을 재활용할 수 있다.</li>
<li>브라우저와 서버 간의 통신에서 오버헤드가 크다.</li>
</ul>
<p>HTTP/2</p>
<ul>
<li>하나의 연결에서 여러 요청과 응답을 처리할 수 있다.</li>
<li>요청과 응답을 이진 데이터로 전송하여 처리 속도를 개선한다.</li>
<li>헤더 압축 기능을 사용하여 오버헤드를 줄인다.</li>
<li>서버 푸시 기능을 지원하여 필요한 데이터를 미리 전송할 수 있다.</li>
</ul>
<p>HTTP/3</p>
<ul>
<li>UDP(User Datagram Protocol)를 기반으로 한 새로운 프로토콜인 QUIC(Quick UDP Internet Connection)을 사용한다.</li>
<li>연결마다 하나 이상의 요청과 응답을 처리할 수 있다.</li>
<li>헤더 압축과 요청과 응답의 다중화를 지원하여 처리 속도를 개선한다.</li>
<li>HTTP/2에서는 필요한 데이터를 서버에서 클라이언트로 푸시할 수 있었지만, HTTP/3에서는 클라이언트가 필요한 데이터를 요청하고 서버가 응답을 보내는 방식으로 동작한다.</li>
</ul>
<h3 id="http에서-캐싱을-구현하는-방법에는-어떤-것들이-있나요">HTTP에서 캐싱을 구현하는 방법에는 어떤 것들이 있나요?</h3>
<ul>
<li><p>웹 브라우저 캐시: 브라우저는 사용자가 방문한 웹 페이지의 캐시를 유지합니다. 사용자가 같은 페이지에 다시 방문할 경우, 캐시에서 데이터를 가져오므로 서버로부터 데이터를 다시 받아올 필요가 없어 처리 속도가 빨라집니다.</p>
</li>
<li><p>프록시 캐시: 프록시 서버는 클라이언트의 요청을 받아서 서버로 전달하고, 서버로부터 받은 응답을 클라이언트에게 전달합니다. 이때 프록시 서버는 응답을 캐싱하여, 이후에 같은 요청이 들어올 경우 캐시된 응답을 전달합니다.</p>
</li>
<li><p>게이트웨이 캐시: 게이트웨이는 클라이언트와 서버 간에 위치하여, 서버의 역할을 대신합니다. 이때 게이트웨이는 서버로부터 받은 응답을 캐싱하여, 이후에 같은 요청이 들어올 경우 캐시된 응답을 전달합니다.</p>
</li>
<li><p>CDNs(Content Delivery Networks) 캐시: CDN은 전세계에 분산된 서버를 통해 컨텐츠를 제공하는 서비스입니다. 이때 각각의 서버는 자체적으로 캐시를 유지하므로, 같은 컨텐츠를 요청하는 클라이언트에게 캐시된 컨텐츠를 전달하여 처리 속도를 빠르게 합니다.</p>
</li>
</ul>
<hr>
<h2 id="https">HTTPS</h2>
<h3 id="https에-대해서-설명해주세요">HTTPS에 대해서 설명해주세요.</h3>
<blockquote>
<p>HTTPS (Hyper Text Transfer Protocol Secure)는 기본 HTTP 프로토콜에 보안 기능이 추가된 버전이다.</p>
</blockquote>
<p>HTTPS는 데이터를 암호화하여 클라이언트와 서버 간에 전송되는 정보를 보호한다. 
이를 통해 중간자 공격(Man-in-the-middle attack)과 같은 공격을 방지하고, 개인 정보와 같은 민감한 데이터의 안전성을 높인다. HTTPS는 주로 웹사이트, 웹 애플리케이션 및 API 등에서 사용된다.</p>
<h3 id="ssltls이-뭔가요">SSL/TLS이 뭔가요?</h3>
<blockquote>
<p>HTTPS에 필요한 보안 기능을 제공하는 암호화 프로토콜</p>
</blockquote>
<ul>
<li><p>SSL (Secure Socket Layer): SSL은 넷스케이프(Netscape)에서 개발한 인터넷 보안 프로토콜이다. SSL은 클라이언트와 서버 간의 통신에 암호화를 적용하여 데이터의 기밀성과 무결성을 보장한다.</p>
</li>
<li><p>TLS (Transport Layer Security): TLS는 SSL의 후속 버전으로, 인터넷 엔지니어링 작업 그룹(IETF)에 의해 표준화되었다. TLS는 SSL의 기반 위에서 발전되어 더 강력한 암호화 알고리즘과 기능을 제공한다. TLS는 현재 인터넷 보안의 기본 프로토콜로 사용되고 있다.</p>
</li>
</ul>
<hr>
<h3 id="심화-1">심화</h3>
<h3 id="https-암호화-과정에-대해-설명해주세요-ssl-핸드셰이크에-대해-설명해주세요">HTTPS 암호화 과정에 대해 설명해주세요. (SSL 핸드셰이크에 대해 설명해주세요.)</h3>
<p> <img src="https://velog.velcdn.com/images/nochik_k/post/838d220b-0ac7-4fb2-a25f-f876092247ea/image.png" alt=""></p>
<pre><code>// 사진 출처: https://hanjungv.github.io/2017-11-07-1_CS_SSL/</code></pre><ol>
<li>Client Hello</li>
</ol>
<ul>
<li>클라이언트가 SSL 버전 정보, 지원하는 암호화 방식, 무작위 바이트 문자열을 포함하여 서버에게 전송합니다.</li>
<li>이미 SSL 핸드셰이크를 했다면 세션을 재사용할 수 있습니다.</li>
</ul>
<ol start="2">
<li>Server Hello</li>
</ol>
<ul>
<li>서버는 클라이언트의 정보를 받고, 사용할 암호화 방식, 세션 ID, 서버측에서 생성한 무작위 바이트 문자열을 전송합니다.</li>
<li>클라이언트에서 인증서를 요구하면 SSL 인증서를 전송합니다.</li>
<li>인증서를 받은 클라이언트는 인증서의 신뢰성을 검증하여 공개키를 얻습니다.</li>
</ul>
<ol start="3">
<li>Client Key Exchange</li>
</ol>
<ul>
<li>클라이언트는 자신이 만든 무작위 바이트 문자열과 서버측에서 전송된 무작위 바이트 문자열을 조합하여 pre master secret 키를 생성합니다.</li>
<li>pre master secret 키를 공개키 방식으로 암호화하여 서버로 전송합니다.</li>
</ul>
<ol start="4">
<li>Server Key Exchange (optional)</li>
</ol>
<ul>
<li>서버가 클라이언트로부터 받은 pre master secret 키를 비밀키를 이용하여 복호화하여 master key를 생성합니다.</li>
</ul>
<ol start="5">
<li>Certificate Verify (optional)</li>
</ol>
<ul>
<li>클라이언트는 서버로부터 받은 인증서를 검증하여 신뢰성을 확인합니다.</li>
<li>클라이언트는 서버에 대한 신뢰성을 증명하기 위해 서명을 생성하고, 이를 서버로 전송합니다.</li>
</ul>
<ol start="6">
<li>Change Cipher Spec</li>
</ol>
<ul>
<li>클라이언트와 서버는 이제부터 생성된 master key를 사용하여 암호화된 통신을 시작합니다.</li>
</ul>
<ol start="7">
<li>Finished</li>
</ol>
<ul>
<li>클라이언트와 서버는 생성된 세션 키를 사용하여 데이터를 주고 받습니다.</li>
<li>통신이 끝나면 세션 키를 폐기합니다.</li>
</ul>
<hr>
<h2 id="dns">DNS</h2>
<h3 id="dns가-뭔가요">DNS가 뭔가요?</h3>
<blockquote>
<p>DNS (Domain Name System)은 인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템이다.</p>
</blockquote>
<p> DNS는 전화번호부와 비슷한 역할을 하며, 사용자가 웹 사이트의 도메인 이름을 입력하면 해당하는 IP 주소로 연결해준다. 인터넷 상에서 각 컴퓨터와 장치는 고유한 IP 주소를 가지고 있는데, DNS는 기억하기 쉬운 도메인 이름을 IP 주소와 매핑하여 사용자들이 쉽게 웹 사이트에 접속할 수 있도록 도와준다.</p>
<h4 id="dns의-구성요소">DNS의 구성요소</h4>
<ul>
<li>도메인 네임 스페이스(Domain Name Space): DNS가 저장, 관리하는 계층적 구조</li>
<li>DNS 서버(=네임 서버): 숫자로 표현된 ip주소로 변환시켜주기 위해서는 도메인 네임 스페이스의 트리 구조에 대한 정보를 가짐.</li>
<li>해석기(리졸버): DNS 클라이언트의 요청을 네임 서버에 전달하고, 네임 서버로부터 정보를 받아 클라이언트에게 제공하는 기능을 수행</li>
<li>DNS 레코드: 도메인 이름과 IP 주소의 매핑 정보를 담고 있는 데이터이다. 주로 A 레코드 (IPv4 주소), AAAA 레코드 (IPv6 주소), CNAME 레코드 (다른 도메인에 대한 별칭), MX 레코드 (메일 서버 정보) 등이 있다.</li>
<li>DNS 캐싱: 최근에 조회한 도메인 이름과 IP 주소의 매핑 정보를 일시적으로 저장하는 기능이다. DNS 캐싱을 통해 동일한 도메인에 대한 반복적인 요청시간을 줄이고, DNS 서버의 부하를 감소시킨다. </li>
</ul>
<h3 id="dns-작동-방식에-대해-설명해주세요">DNS 작동 방식에 대해 설명해주세요.</h3>
<p>사용자가 웹 브라우저에 도메인 이름을 입력할 시, 해당 도메인 이름에 대한 IP 주소를 찾아 연결하는 과정으로 이루어진다.</p>
<ol>
<li>사용자가 웹 브라우저에 도메인 이름(예: <a href="http://www.google.com)%EC%9D%84">www.google.com)을</a> 입력한다.</li>
<li>브라우저는 먼저 로컬 DNS 캐시에서 해당 도메인 이름에 대한 IP 주소를 찾는다. 로컬 DNS 캐시는 최근에 방문한 웹사이트의 도메인 이름과 IP 주소를 일시적으로 저장한 공간이다. 만약 로컬 DNS 캐시에 해당 정보가 있다면, 바로 IP 주소를 반환하고 과정을 종료한다.</li>
<li>로컬 DNS 캐시에 해당 도메인 이름에 대한 정보가 없다면, 브라우저는 설정된 DNS 서버(주로 인터넷 서비스 제공자(ISP)의 DNS 서버)에 IP 주소를 요청한다.</li>
<li>DNS 서버는 먼저 자신의 캐시에서 해당 도메인의 IP 주소를 찾는다. 있다면 해당 IP 주소를 반환하고 과정을 종료한다.</li>
<li>해당 도메인의 IP 주소가 DNS 서버의 캐시에도 없다면, DNS 서버는 루트(root) DNS 서버로 요청을 전달한다.</li>
<li>루트 DNS 서버는 최상위 도메인(TLD, Top-Level Domain)에 대한 정보를 가지고 있으며, 이 경우 &quot;.com&quot;에 해당하는 TLD DNS 서버의 주소를 반환한다.</li>
<li>DNS 서버는 이어서 TLD DNS 서버에 도메인 이름에 대한 IP 주소를 요청한다. TLD DNS 서버는 &quot;google.com&quot;에 해당하는 권한있는(Authoritative) DNS 서버의 주소를 반환한다.</li>
<li>마지막으로 DNS 서버는 권한있는 DNS 서버에게 해당 도메인 이름에 대한 IP 주소를 요청한다. 권한있는 DNS 서버는 해당 도메인에 대한 IP 주소 정보를 가지고 있어 이를 반환한다.</li>
<li>DNS 서버는 받은 IP 주소를 웹 브라우저에 전달하고, 웹 브라우저는 해당 IP 주소의 서버와 연결하여 웹 페이지를 요청하게 된다.</li>
<li>DNS 서버는 또한 이 IP 주소를 일정 시간동안 캐시에 저장한다. 이로 인해 동일한 도메인에 대한 후속 요청을 더 빠르게 처리할 수 있다.</li>
</ol>
<hr>
<h3 id="심화-2">심화</h3>
<h3 id="dns-질의-종류에-대해-설명해주세요">DNS 질의 종류에 대해 설명해주세요.</h3>
<ol>
<li>재귀 질의(Recursive Query)</li>
</ol>
<ul>
<li>클라이언트가 DNS 서버에게 질의를 보내면, DNS 서버는 질의를 처리할 수 없으면 다른 DNS 서버에게 요청합니다.</li>
<li>다른 DNS 서버가 요청을 처리할 수 있으면, 처리 결과를 받아 클라이언트에게 전달합니다.</li>
</ul>
<ol start="2">
<li>반복 질의(Iterative Query)</li>
</ol>
<ul>
<li>클라이언트가 DNS 서버에게 질의를 보내면, DNS 서버는 직접 질의를 처리할 수 없으면 다른 DNS 서버의 주소를 반환합니다.</li>
<li>클라이언트는 반환된 주소를 통해 다른 DNS 서버에게 질의를 보내고, 이 과정을 반복하여 질의 결과를 찾습니다.</li>
</ul>
<hr>
<blockquote>
<p>어려웠던 점, 반성하고 싶은 점 / 개선할 방법</p>
</blockquote>
<p>어려웠던 점</p>
<ul>
<li>기본적인 질문에 치중하니, 심화 질문을 다룰 시간이 부족헸다.</li>
</ul>
<p>개선할 방법</p>
<ul>
<li>구체적으로 다루는 것에 초점을 맞추기보다, 핵심적인 내용에 초점을 둬야겠다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network 스터디 1회차] 컴퓨터 네트워크, 프로토콜, OSI 7 Layer, TCP/IP 정리]]></title>
            <link>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-1%ED%9A%8C%EC%B0%A8-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-OSI-7-Layer-TCPIP-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@nochik_k/Network-%EC%8A%A4%ED%84%B0%EB%94%94-1%ED%9A%8C%EC%B0%A8-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-OSI-7-Layer-TCPIP-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 14 Apr 2023 09:32:32 GMT</pubDate>
            <description><![CDATA[<h2 id="컴퓨터-네트워크network란">컴퓨터 네트워크(Network)란?</h2>
<blockquote>
<h4 id="net그물--work일의-합성어로-컴퓨터들이-통신망을-통해-그물처럼-연결된-체계를-말한다">Net(그물) + Work(일)의 합성어로, 컴퓨터들이 통신망을 통해 그물처럼 연결된 체계를 말한다.</h4>
</blockquote>
<h4 id="컴퓨터들이-그물처럼-엮여서-일을-하는-것">&#39;컴퓨터들이 그물처럼 엮여서 일을 하는 것&#39;</h4>
<p>오늘날 우리는 인터넷(전 세계의 네트워크를 연결해놓은 거대한 네트워크 통신망)으로 어디서든 원하는 정보를 월드 와이드 웹(World Wide Web = www = 웹 , 인터넷에서 연결된 사용자들이 만나 정보를 주고받을 수 있는 정보공간)을 통해 실시간으로 주고 받고 할 수 있다. 
흔히, 웹과 인터넷을 동의어로 혼동하는 경우가 있는데 인터넷은 컴퓨터와 컴퓨터를 연결해주는 인프라이고, 웹은 인터넷 연결 후 제공되는 서비스중 하나이다. <strong>인터넷 &gt; 웹</strong> </p>
<p>//  국제 전기 전자 공학회 IEEE(Institute of Electrical and Electornics Engineers)에서 말하는 네트워크 : &quot;<strong>몇 개의 독립적인 장치가 적절한 영역 내에서 적당히 빠른 속도로 물리적 통신 채널을 통하여 서로가 직접 통신할 수 있도록 지원해주는 데이터 통신 체계</strong>&quot; </p>
<p><strong>라우터(Router)</strong>
이름 그대로 네트워크와 네트워크 간의 경로(Route)를 설정하고 가장 빠른 길로 트래픽을 이끌어주는 네트워크 장비다.</p>
<p><strong>호스트(Host)</strong>
네트워크에 연결되어 네트워크 주소가 할당된 컴퓨터(및 기타 장치)이다.</p>
<p><strong>IP 주소(IP Address)</strong>
컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 주소이다.</p>
<p><strong>스위치(Switch)</strong>
네트워크 상의 통신을 중계하는 장치로, 데이터 패킷을 받아 목적지로 전송하는 역할을 수행한다.</p>
<p><strong>스위칭(switching)</strong>
네트워크에서 데이터를 전달하는 과정으로, 데이터 패킷을 받아 목적지로 전송하는 역할을 한다. 스위칭은 회선 교환과 패킷 교환 두 가지 방식이 있다. 
회선 교환은 통신 경로를 미리 확보한 후 데이터를 전송하는 방식이고,
패킷 교환은 데이터를 여러 패킷으로 나누어 각각 독립적으로 전송한 후, 목적지에서 다시 조립하는 방식이다. 
인터넷에서는 주로 패킷 교환 방식이 사용되며, 이를 통해 효율적인 통신이 가능하다.</p>
<pre><code>
#### TIP
#### 1단계: 웹, WWW, 인터넷
#### 2단계: 라우터, 호스트, 클라이언트, 서버, IP 주소, 스위치, 스위칭
#### 3단계: 회선교환방식, 패킷교환방식</code></pre><h2 id="프로토콜이란">프로토콜이란?</h2>
<blockquote>
<h4 id="컴퓨터-내부-또는-컴퓨터-사이에서-데이터의-교환-방식을-정의하는-규칙-체계-본래-의미는-외교에서의-의정서">컴퓨터 내부 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계. 본래 의미는 외교에서의 의정서.</h4>
</blockquote>
<h4 id="데이터를-주고-받기-위해-정의된-통신-규약-및-약속-ex-http-ftp">&#39;데이터를 주고 받기 위해 정의된 통신 규약 및 약속&#39; (ex: http, ftp)</h4>
<p> 네트워크 상에서 데이터의 교환, 전송 및 처리 방법을 정의하며, 각 기기들이 서로 이해할 수 있는 공통의 언어와 방식을 제공.</p>
<p> 특징: </p>
<ul>
<li><strong>모듈화</strong>
복잡한 시스템을 기능에 따라 모듈이라는 작은 단위로 분할하여 설계하는 것을 말한다. (프로토콜은 전송오류율, 데이터 전달 경로, 전송 속도 등 외부 요인에 영향을 받기에, 한 곳에서 처리하지 않음)
이를 통해, 기능별로 간단하게 재구성하고, 독립적으로 작동하지만 서로 상호 유기적인 관계를 가지며, 오류 처리가 용이하다.</li>
</ul>
<ul>
<li><p><strong>계층화</strong>
분할된 모듈을 계층적 구조로 배열하는 것을 말한다.</p>
</li>
<li><p><strong>추상화</strong>
네트워크 시스템을 모듈화와 계층화를 거쳐 핵심적인 기능들을 단순화시키는 방법을 말한다.</p>
</li>
</ul>
<p>// 프로토콜 스택: 데이터 통신에 활용되는 프로토콜의 구조에 관한 개념으로, 계층화된 구조(스택 구조)로 모여 있는 프로토콜의 집합</p>
<pre><code>#### TIP
#### 1단계: 통신약속, 통신규약 
#### 2단계: OSI_7_Layer, TCP_IP, 네트워크 레이어
#### 3단계: 모듈화, 추상화, 오버헤드, 복잡성</code></pre><h2 id="osi-7-layer란">OSI 7 Layer란?</h2>
<blockquote>
<h4 id="osiopen-systems-interconnection의-약자">OSI(Open Systems Interconnection)의 약자</h4>
</blockquote>
<h4 id="isointernational-organization-for-standardization-국제표준화기구에서-네트워크-프로토콜이-통신하는-구조를-7개의-계층으로-분리하여-각-계층간-상호-작동하는-방식을-정해-놓은-것">ISO(International Organization for Standardization, 국제표준화기구)에서 네트워크 프로토콜이 통신하는 구조를 7개의 계층으로 분리하여, 각 계층간 상호 작동하는 방식을 정해 놓은 것</h4>
<p><img src="https://velog.velcdn.com/images/nochik_k/post/5361ce80-91b7-40b5-9ee7-9b16b02c80c8/image.webp" alt=""></p>
<pre><code>사진 출처: https://mangkyu.tistory.com/15</code></pre><h3 id="osi-7-layer">OSI 7 Layer</h3>
<ul>
<li><p><strong>응용 계층(Application)</strong>: 최상위 계층으로 사용자가 네트워크 자원에 접근하는 방법 제공</p>
<ul>
<li>HTTP(HyperText Transfer Protocol): WWW(World Wide Web) 상에서 정보를 주고 받을 수 있는 프로토콜  </li>
<li>SMTP(Simple Mail Transfer Protocol): 인터넷에서 이메일을 보내고 받기 위해 이용되는 프로토콜</li>
<li>FTP(File Transfer Protocol): 컴퓨터 간 파일을 전송하는데 사용되는 프로토콜</li>
<li>Telnet: 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 프로토콜
But, 보안문제로 사용이 감소하고 있으며, 원격제어를 위해 SSH로 대체되고 있음.
&nbsp;</li>
</ul>
</li>
<li><p><strong>표현 계층(Presentation)</strong>: 응용계층으로부터 전달받은 데이터를 읽을 수 있는 형식으로 변환 </p>
<ul>
<li>ASCII: 7비트 인코딩, 33개의 출력 불가능한 제어 문자와 공백을 포함한 95개의 출력가능한 문자로 구성되며, 문자를 사용하는 많은 장치에서 주로 쓰임.</li>
<li>SSL(Secure Sockey Layer): 네트워크 레이어의 암호화 방식으로, HTTP, FTP 등에 사용. 인증, 암호화, 무결성을 보장함
&nbsp;</li>
</ul>
</li>
<li><p><strong>세션 계층(Session)</strong>: 두 컴퓨터 간의 대화나 세션을 관리. 포트 연결이라고도 함    </p>
<ul>
<li>NetBIOS: 네트워크의 기본적인 입출력을 정의한 규약</li>
<li>RPC(Remote Procedure Call): Windows 운영체제에서 사용하는 원격 프로시저 호출 프로토콜</li>
<li>SDP(Session Description Protocol): 스트리밍 미디어에 적용되는 IETF(Internet Enginerring Task Force) 표준으로, 멀티미디어 통신을 설명하기 위해 다양한 태그를 사용</li>
<li>NWLink(Netware Link): 인터 네트워크를 통한 전송 프로토콜 패킷 라우팅 역할. 사용자가 네트워크 데이터에 액세스하지 못하도록 함.</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>전송 계층 (Transport)</strong>: 하위 계층에 신뢰할 수 있는 데이터 전송 서비스를 제공</p>
<ul>
<li>TCP(Transmission Control Protocol): 전송을 제어하는 프로토콜로, 네트워크의 기본적인 입출력을 정의한 규약</li>
<li>UDP(User Datagram Protocol): 데이터를 데이터그램 단위로 처리하는 프로토콜로, 독립적으로 데이터를 다른 경로로 처리함
&nbsp;</li>
</ul>
</li>
<li><p><strong>네트워크 계층 (Network)</strong>: 실제 네트워크 간에 데이터 라우팅을 담당</p>
<ul>
<li>IP(Internet Protocol): 패킷 교환 네트워크에서 정보를 주고받을때 사용하는 정보 위주의 규약<ul>
<li>IPX(Internetwrok Packet Exchange): TCP/IP처럼 라우티드 프로토콜로 주로 내부 네트워크에서 사용됨</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>** 데이터 링크 계층 (Data Link)**: 물리적인 네트워크를 통해 송수신되는 데이터의 오류와 흐름 관리, 재전송, 프레임 동기화하는 역할<ul>
<li>Ethernet : 네트워크를 구성하는 하나의 방식이며, 주로 LAN(근거리 통신망)환경에서 유선 인터넷으로 사용됨 <ul>
<li>PPP(Point to Point): 이름 그대로 연결 양끝 노드 간 직렬 링크를 구성하여 데이터를 전달</li>
<li>ARP(Address Resolution Protocol): IP 주소를 상응하는 MAC주소로 변환</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>// MAC(Media Access Control) 주소:인터넷에 연결된 모든 장치들이 가지고 있는 물리적인 주소로, 48비트의 숫자로 이루어져 있으며, 6개의 16진수 쌍으로 구성됨. ex: 00:1A:2B:3C:4D:5E
// IEEE 802.3 : 연결된 이더넷에서 물리 계층, 데이터 링크 계층의 매체 접근 제어를 정의하는 표준
// IEEE 802.11 : 유선 LAN 형태의 이더넷을 보완하기 위해, 무선 근거리 통신망을 위한 컴퓨터 무선 네트워크 기술(Wi-Fi)</code></pre><ul>
<li><strong>물리(Physical) 계층</strong> : 네트워크 데이터가 전송되는 물리적인 매체로, 데이터는 0과 1의 비트열로 On, Off의 전기적 신호 상태로 이루어짐. 하드웨어와 연결되어 통신자원을 분배해주는 역할 (ex: 허브, 리피터)</li>
</ul>
<p>특징 :</p>
<ul>
<li>각 계층은 하위 계층의 기능만을 이용하고, 상위 계층에 기능을 제공</li>
<li>통신이 일어나는 과정을 단계별로 파악할 수 있으며, 각 계층은 독립적으로 역할을 수행</li>
<li>특정 계층 이상시, 다른 단계의 장비나 소프트웨어에 영향없이 이상이 생긴 부분만 고칠 수 있음</li>
</ul>
<p>역할:</p>
<ul>
<li>캡슐화: 데이터를 상/하위 특정 계층으로 보낼 때, 헤더를 붙이는 것</li>
<li>역캡슐화: 캡슐화의 반대로, 헤더를 제거하는 것
=&gt; 하위 계층으로 이동시 헤더가 추가되고, 반대로 상위 계층으로 이동시 헤더가 제거되며 정보를 얻을 수 있음
// 헤더: 프로토콜 오버헤드라고도 부르며, 올바른 대상에 도달하기 위해 필요한 정보(출발지 및 목적지 정보, 에러 체크 등)를 말함</li>
</ul>
<pre><code>#### TIP
#### 1단계: 국제표준, 프로토콜스택, 네트워크레이어, 캡슐화, 비캡슐화  
#### 2단계: 애플레이케이션 계층, 프레젠테이션 계층, 세션 계층, 트랜스포트 계층, 네트워크 계층, 데이터링크 계층, 물리 계층
#### 3단계: HTTP, SSL, Socket, TCP, UDP, IP, MAC, IEEEE802.3, IEEE802.11</code></pre><h2 id="tcpip란">TCP/IP란?</h2>
<blockquote>
<p>  인터넷 프로토콜 슈트(IP suite) 중 하나로, 인터넷 상에서 컴퓨터들이 통신할 수 있도록 하는 표준 프로토콜 집합이다. TCP/IP는 Transmission Control Protocol(TCP)와 Internet Protocol(IP)의 약어로, TCP는 데이터를 안정적으로 전송하는 프로토콜이고, IP는 인터넷상에서 데이터를 라우팅하는 프로토콜이다.</p>
</blockquote>
<h4 id="데이터가-의도한-목적지로-갈-수-있도록-정해놓은-틀">&#39;데이터가 의도한 목적지로 갈 수 있도록 정해놓은 틀&#39;</h4>
<pre><code>// 인터넷 프로토콜 스위트(Internet Protocol Suite): 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 통신규약(프로토콜)의 모음</code></pre><p><img src="https://velog.velcdn.com/images/nochik_k/post/e90cc284-bb92-47ae-9dbd-5e8562e6dfa3/image.jpeg" alt=""></p>
<h3 id="tcpip-4-layer">TCP/IP 4 Layer</h3>
<p>TCP/IP 프로토콜 통신 과정에 중점을 둬, OSI 7 계층을 좀 더 단순화</p>
<ul>
<li><strong>애플리케이션 계층 (Application)</strong>: 사용자와 가장 가까운 계층으로, 사용자 - 소프트웨어 간 소통을 담당하며, 애플리케이션을 실행하기 위한 데이터 형식이 작성됨<ul>
<li><strong>전송 계층 (Transport)</strong>: 통신 노드 간 안전하게 데이터를 전송할 수 있도록 하는 계층</li>
<li><strong>인터넷 계층 (Internet)</strong>: 패킷을 최종 목적지까지 라우팅하는 계층</li>
<li><strong>네트워크 액세스 계층 (Network Access / Network Interface)</strong>: 데이터를 전기신호로 변환한 뒤, 물리적 주소인 MAC 주소를 사용해, 알맞은 기기로 데이터를 전송하는 계층
&nbsp;</li>
</ul>
</li>
</ul>
<pre><code>#### TIP
#### 1단계: 실제표준, 프로토콜스택, 네트워크레이어  
#### 2단계: 애플리케이션 계층, 트랜스포트 계층, 인터넷 계층, 링크 계층
#### 3단계: HTTP, TCP, UDP, IP, IEEE802.3, IEEE802.11</code></pre><blockquote>
<p>어려웠던 점, 반성하고 싶은 점 / 개선할 방법</p>
</blockquote>
<p>어려웠던 점</p>
<ul>
<li>네트워크를 제대로 공부하는 것은 처음인데, 용어에 대한 이해가 부족해서 설명이 부족함을 느낌</li>
<li>나 자신만의 언어로 바꿔 설명하는 것에 어려움을 느낌</li>
</ul>
<p>개선할 방법</p>
<ul>
<li>최대한 원리를 이해한 후, 다른 사람들의 표현과는 조금 다르게 표현해보기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[
[노마드코더/2주 챌린지] IT 5분 잡학사전 - 13일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-13%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-13%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 01 Mar 2023 00:46:14 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>인공지능, 머신러닝, 딥러닝의 구분</li>
<li>REST API / 도커 / 하이브리드 앱</li>
<li>암호화폐 / NFT / 바이러스</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.03.01</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 39. 인공지능, 머신러닝, 딥러닝, 아직도 구분하기 힘들다고? ~ 에피소드 45. 함수형 프로그래밍이 뭐죠?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>딥러닝은 엄청나게 많은 층으로 구성되어 있는 머신러닝의 한 종류이다.</li>
<li>이해하기 쉽고 확장성이 좋은 REST API</li>
<li>도커는 원하는 개발 환경을 도커 파일에 저장하여 준비해준다.</li>
<li>이론상 안전한 코인을 골라라</li>
<li>멀웨어: 컴퓨터를 감시하거나 파괴하는 소프트웨어
웜은 미사일을 통해 컴퓨터 내부에 침투하고, 페이로드를 배포하여 컴퓨터를 파괴한다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>최근 공부하면서 도커를 처음으로 사용해봤는데, 운영체제가 다른 환경에서 이런 식으로 일할 수 있구나 싶었다.</li>
<li>프론트를 공부하고 있지만,  API 설계는 어떻게 하는지 배울 필요성을 느끼는 요즘이다.</li>
<li>리액트 네이티브로 껍데기를 만들고 내부는 웹페이지 형식의 앱을 만들 계획인데, 이게 최선일지 고민이다.</li>
<li>스턱스넷의 사례만 보더라도, 보안의 취약점은 생각지 못했던 곳에서 일어날 수 있기에, 늘 신경써야겠다.</li>
</ul>
<h3 id="-it-5분-잡학사전-완독을-마치며">+ IT 5분 잡학사전 완독을 마치며</h3>
<ul>
<li>IT 관련 기본적인 내용을 쉽게 풀어쓴 책이었다.
프로그래머로서의 길을 선택한지 얼마되지 않았지만, 공부할 게 산더미인 게 너무나 느껴진다.
조바심이 드는 것은 사실인데, 지금 배우고 있는 것들의 원리를 최대한 깨달으면서
공부해가면 쌓이고 쌓여서 빛을 발하는 날이 오지 않을까 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 12일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 28 Feb 2023 14:28:37 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>비밀번호 저장방법</li>
<li>객체지향 프로그래밍의 클래스와 상속</li>
<li>함수형 프로그래밍<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
</li>
<li>23.02.28<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
</li>
<li>에피소드 35. 비밀번호는 어떻게 저장될까 ~ 에피소드 38. 함수형 프로그래밍이 뭐죠?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>비밀번호 저장방법은 솔트를 사용하자.</li>
<li>객체지향 프로그래밍으로 기존보다 코드의 양이 훨씬 줄고, 의미도 명확해진다.</li>
<li>모든 선언형 프로그래밍은 명령형 프로그래밍 위에 쓰는 것이라 할 수 있다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>비밀번호 저장방식으로 솔트를 배운 기억이 있는데, 다시 한번 중요성을 깨닫는다.</li>
<li>객체 지향 언어를 제대로 공부해본 경험이 없었는데 클래스와 상속에 대한 개념만 잠깐 보았는데도, 간결함이 느껴진다. 향후, 숙련도가 쌓이고 배워봐야겠다.</li>
<li>자바스크립트를 공부하면서, 습관적으로 선언형으로 적고 있는데,
명령형으로 적으면 오류가 날 확률이 높겠다 라는 사실을 이제서야 깨닫는다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 10일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 26 Feb 2023 04:18:48 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>프로그램 관리의 중요성</li>
<li>SQL / NoSQL </li>
<li>깃 &amp; 깃허브 / 버전 표기 방법</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li><p>23.02.26</p>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
</li>
<li><p>에피소드 30. 코로나가 준 레거시 시스템의 교훈 ~ 에피소드 34. 버전을 표기하는 방법도 있어요?</p>
</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>프로그램은 책임 있게 만들어야 하며, 끊임없이 관리해야 한다.</li>
<li>기술에는 좋고 나쁨이 없다. 용도에 맞게 쓰면 되니, 비교하며 우위를 따지는 실수를 하지 말자.</li>
<li>깃은 파일 이력을 관리하는 프로그램, 깃허브는 파일과 깃으로 관리한 이력을 저장하고 공유하는 공간</li>
<li>시맨틱 버저닝으로 버전을 표기하는 것이 가장 널리 쓰이는 방식</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>당장 어떤 기술이 우리가 만들어야하는 프로덕트에 적합한지 판단할 실력이 안된다고 스스로 느낀다.
하지만, 프로그램을 만들면 계속 업데이트하고 관리하면 되는 부분이니, 하나하나 제대로 배우고 발전시켜야겠다.</li>
<li>시맨틱 버저닝의 느낌만 알고 있었는데, 이제서야 제대로 이해하고 넘어가는 것 같다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 9일차
]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 25 Feb 2023 07:20:28 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>정렬 알고리즘 </li>
<li>스택, 큐의 개념, 해시테이블</li>
<li>클린 코드를 위한 5가지 팁</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.02.25</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 26. 정렬 알고리즘이 뭐죠? ~ 에피소드 29. 개발자 필수 교양, 클린 코드!</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>버블, 선택, 삽입정렬이 시간 복잡도가 같은 것은 단순히 측정했을 때 그렇다는 뜻이다.</li>
<li>스택과 큐는 추상자료구조(ADT, Abstract Data Type)이다.</li>
<li>스택은 LIFO, 늦게 구워 맨 위에 있는 팬케이크 / 뒤로가기, ctrl+z
큐는 FIFO, 줄 선 순서대로 탑승을 하는 버스정류장 / 쇼핑몰 주문처리 시스템</li>
<li>해시테이블의 시간복잡도는 O(1)로 배열의 형태라 빠르나, 해시 충돌시 추가로 다른 정렬을 이용하여 O(1)</li>
<li>변수는 의미있게, 함수는 동사로 작명, 매개변수는 최소로(많다면 컨피겨레이션 오브젝트), 불린값은 인자로 보내지 않기, 축약어 사용하지 않기</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>기능을 구현할 때, 스택과 큐, 알고리즘에 대한 진지한 고민이 필요할 것 같다.</li>
<li>추가로 클린 코드를 위한 팁들을 습관들일 수 있도록 노력해야겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 7일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 22 Feb 2023 23:43:52 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>서버리스의 개념</li>
<li>자료구조, 알고리즘의 중요성 + 검색 알고리즘</li>
<li>배열의 원리(시간 복잡도 및 Big-O표기법)<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
</li>
<li>23.02.23</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 21. 서버리스는 서버가 없다는 뜻~ 에피소드 20. 검색 알고리즘이 뭐죠?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>서버리스는 서버 제공자에게 지나치게 의존해야한다.</li>
<li>결국에는 자료구조와 알고리즘을 공부하고, 자신의 코드에 적용할 수 있어야 한다.</li>
<li>시간 복잡도는 프로그램의 작업 속도가 얼마나 빠른지 측정하는 방법이다.</li>
<li>알고리즘은 선형 검색과 이진 검색으로, 이진 검색 알고리즘은 항상 정렬되어있어야 하며, 거대한 배열을 다룰 때 효과적이다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>당장 MVP를 만드는 과정에 있어서는, 서버리스를 시도해보겠지만 향후 프로덕트가 커진다면, 다른 방법도 고민해봐야겠다.</li>
<li>프론트 공부를 하면서 자료구조를 몰라서 종종 발견하는 에러들이 있는데, 자료구조를 공부하는 별도의 시간을 가져야겠다.</li>
<li>알고리즘도 중요성은 알고 있었지만, 당장의 우선순위에서 미뤄뒀었는데, 훗날 프로덕트에서 효율성과 사용자들의 UX를 고려한다면, 조금씩이라도 공부해두는 습관을 가져야겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 6일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-6%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-6%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 22 Feb 2023 14:15:40 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>인터넷 익스플로러가 사라진 이유</li>
<li>쿠키, 서버의 개념</li>
<li>프런트 vs 백엔드 / 풀스택?</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.02.22</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 16. 인터넷 익스플로러가 사라진 이유와 브라우저 엔진~ 에피소드 20. 슈퍼 개발자만 할 수 있다, 풀스택?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>점유율만 믿고 게으름을 피운 인터넷 익스플로러</li>
<li>서버는 항상 켜져 있는 컴퓨터이면서 인터넷에 연결되어 있고 접속 요청에 응답하는 컴퓨터다.</li>
<li>풀스택 개발자는 무조건 모든 영역을 다 개발해야 한다고 생각하는데, 할 수 있는 것과 하는 것은 엄연히 다르다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>인터넷 익스플로러가 사라진 이유는 이번에 처음 알았는데, 익스플로러처럼 도태되지 않으려면, 부단히 노력해야되는 것을 새삼 깨닫게 된다.</li>
<li>최근 로그인과 토큰, 세션에 대한 개념을 공부하면서 느끼는데, 토큰은 보안에 큰 영향을 줄 수 있기에 신경써야할 부분이 많은 것 같다.</li>
<li>당장은 프론트엔드 개발자로서의 공부를 하고 있지만, C레벨로 성장하기 위해, 백엔드와 데브옵스도 언제가는 섭렵하고 싶다. 그런 능력을 갖춘 날이 어서 다가오기를 상상하며, 내일도 설레는 마음으로 공부해야겠다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 5일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-5%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-5%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 21 Feb 2023 13:42:19 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>라이브러리 / 프레임워크 / JQuery / API의 개념</li>
<li>도메인은 왜 돈을 주고 사야할까?</li>
<li>플래시의 종말</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.02.21</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 11. 라이브러리와 프레임워크, 비슷한 거 아냐?~ 에피소드 15. 플래시의 서비스 종료와 스티브 잡스<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
제이쿼리는 정말로 필요할 때에만 배워라!
API 작동 방식의 특징은 사용하는 사람은 알 수 없다는 것
도메인을 만드는 건 레지스트리다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>JQuery를 소문으로만 들었지, 사실 이용해본 적이 없는 것 같은데, 여유가 생기면 왜 유명한지 파헤쳐봐야겠다.</li>
<li>공부하고, 기능구현만 생각해서 다른 사람이 만든 API만 사용하기 급급한데, 기회가 된다면 API를 직접 만들어보는 것도 좋을 것 같다.</li>
<li>플래시가 서비스를 종료한 것은 익히 알고 있었지만, 그 내막에 스티브 잡스가 있는 것은 이번에 처음 알아서 굉장히 신선했다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 3일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 19 Feb 2023 00:44:44 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>오류를 만났을 때의 대처법</li>
<li>인터프리트 언어 vs 컴파일 언어</li>
<li>파이썬 및 자바스크립트의 다양한 용도 / 코틀린의 탄생 비화 및 장점</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.02.19</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 6. 왜 나만 오류가 자주 생길까?~ 에피소드 10. 코틀린은 정말로 자바와 100% 호환될까?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>오류를 고치기 전에 오류가 왜 생겼는지를 알아야 한다.</li>
<li>자신의 힘으로 프로그램을 만들어야 한다.</li>
<li>인터프리트 언어는 오류를 제때 알기 힘들다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li><p>개발 공부를 시작하고, 예시를 기반으로 연습하고 있지만, 이게 내가 정말 알고 있는 것인가라는 의문이 들곤 했다. 이런 의구심이 들지 않기 위해서, 배운 즉시 나만의 프로젝트에 응용해서 적어봄으로써, 내 것으로 만들어야겠다. </p>
</li>
<li><p>자바스크립트의 다양한 용도는 알고 있었지만, 아이오닉으로 하이브리드 앱을 만들 수 있다거나, 게임, 인공지능도 만들 수 있다는 사실을 이번에 처음 알았다. 자바에 관한 지식이 전무했는데, 어떤 식으로 컴파일하는지,  코틀린이라는 언어가 얼마나 매력적인지를 알고나니 호기심이 생긴다.
지금 관심을 가지고 공부하는 것은 자바스크립트 류가 전부이지만(Next.js, Node.js, React-Native),  향후 네이티브 앱을 개발하고 싶은 마음도 있기에 코틀린에 대해서도 좀더 자세히 알아봐야겠다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 2일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 18 Feb 2023 11:25:26 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-til-3줄-요약">오늘 TIL 3줄 요약</h3>
<ul>
<li>사용목적에 따라 달라지는 컴퓨터 언어</li>
<li>새 프로그래밍 언어를 쉽고 빠르게 공부하는 방법</li>
<li>컴퓨터 언어 이름의 유래 / C 언어 시리즈의 각기 다른 용도 및 특징</li>
</ul>
<h3 id="til-today-i-learned-날짜">TIL (Today I Learned) 날짜</h3>
<ul>
<li>23.02.18</li>
</ul>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<ul>
<li>에피소드 1. 개발자에 대한 오해 5가지 ~ 에피소드 5. C, C++, C#은 이름처럼 비슷할까?</li>
</ul>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ul>
<li>개발에서는 재능이 아니라 포기하지 않음이 더 중요하다는 것.</li>
<li>챗봇을 만든 경험이 전혀 없는데 새 언어로 챗봇을 만들겠다고 거창한 목표를 세우는 것은 잘못된 방법이다.</li>
</ul>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>아직 코드끈은 짧지만, 컴퓨터는 배우면 배울수록 배울게 훨씬 많고, 코딩은 재능의 영역이 아닐까라는 고민을 종종하곤 했다. 
하지만, 포기하지 않는 끈기와 꾸준함이 중요하다는 것을 다시 한번 책을 읽으며 깨닫는다.
그리고 새로운 언어를 배우는 것에 대한 부담이 있었는데, 부담을 한시름 덜게 되었다.
그 밖에, C언어 시리즈에 대해서는 지식이 전무했는데, 이번에 차이점을 처음 알게되어 흥미로웠다.</li>
</ul>
<ul>
<li>오늘의 결론: 의심하지 말고 꾸준히 하자.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더/2주 챌린지] IT 5분 잡학사전 - 1일차]]></title>
            <link>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@nochik_k/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%942%EC%A3%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 17 Feb 2023 07:31:08 GMT</pubDate>
            <description><![CDATA[<p>IT 5분 잡학사전 완독을 위한 챌린지 1일차</p>
<p>오늘은 구매인증!</p>
<p>꾸준하게 읽고 정리하는 습관을 들여보자.</p>
<p><img src="https://velog.velcdn.com/images/nochik_k/post/52fbc524-f365-42a1-8b9c-af1a9f785822/image.png" alt=""></p>
<p>#코딩 #개발자 #노마드북클럽 #노개북</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git 배포해보기]]></title>
            <link>https://velog.io/@nochik_k/git-%EB%B0%B0%ED%8F%AC%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@nochik_k/git-%EB%B0%B0%ED%8F%AC%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 20 Sep 2022 13:14:50 GMT</pubDate>
            <description><![CDATA[<p>순서대로 입력!</p>
<pre><code>--git
git init
git add .
git commit -m &#39;Initial Commit&#39;
git remote rm origin
git remote add origin 저장소주소
git remote -v
git push origin main
//git branch -M main</code></pre>]]></description>
        </item>
    </channel>
</rss>