<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Application Layer on Kelly Dev</title><link>https://kelly-chui.github.io/tags/application-layer/</link><description>Recent content in Application Layer on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Feb 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/application-layer/index.xml" rel="self" type="application/rss+xml"/><item><title>Network. 쿠키, 세션</title><link>https://kelly-chui.github.io/posts/cs-network-cookie-session/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-cookie-session/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;웹 애플리케이션에서 사용자 정보를 저장하고 관리하는 방식, HTTP는 statelessness이기 때문에, 이전 요청에 대한 정보를 기억하지 않는다. 따라서 이 문제를 해결하기 위해 쿠키와 세션이 필요하다.&lt;/p&gt;
&lt;h2 id="쿠키"&gt;쿠키&lt;/h2&gt;
&lt;p&gt;클라이언트에 저장되는 작은 데이터 파일, 서버가 클라이언트에게 데이터를 저장하도록 지시하면, 해당 데이터를 전송하게 됨&lt;/p&gt;
&lt;h3 id="용도"&gt;용도&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;사용자 인증 정보 저장 (로그인 상태 유지)&lt;/li&gt;
&lt;li&gt;웹사이트 설정 저장&lt;/li&gt;
&lt;li&gt;사용자 행동 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="특징"&gt;특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;주기적 전송: 사용자가 특정 사이트에 다시 방문하면 브라우저가 자동으로 쿠키를 서버로 전송함&lt;/li&gt;
&lt;li&gt;수명: 유효 기간을 설정할 수 있고, 만료되면 삭제됨, 유효기간이 없으면 브라우저 세션이 종료될 때 삭제&lt;/li&gt;
&lt;li&gt;용량: 한 도메인당 쿠키는 4KB 정도로 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="보안"&gt;보안&lt;/h3&gt;
&lt;p&gt;사용자의 브라우저에 저장되기 때문에 클라이언트에서 조작할 수 있다. 따라서 민감한 데이터는 쿠키에 저장하면 안됨&lt;/p&gt;</description></item><item><title>Network. DHCP(Dynamic Host Configuration Protocol)</title><link>https://kelly-chui.github.io/posts/cs-network-dhcp/</link><pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-dhcp/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;DHCP: Dynamic Host Configuration Protocol&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;디바이스가 네트워크에 접속하려면 고유한 IP주소가 필요하지만, 수동으로 설정하면 불편하고 충돌이 발생할 가능성이 있음, DHCP 서버는 자동으로 IP 주소와 서브넷 마스크, 게이트웨이와 같은 파라미터를 배정한다.&lt;/p&gt;
&lt;h2 id="동작-방식"&gt;동작 방식&lt;/h2&gt;
&lt;h3 id="dora"&gt;DORA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Discovery
&lt;ul&gt;
&lt;li&gt;클라이언트가 네트워크에 연결되면, IP 주소가 필요하다고 브로드 캐스트 요청을 보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Offer
&lt;ul&gt;
&lt;li&gt;DHCP 서버가 사용 가능한 IP 주소를 찾아서 클라이언트에게 제안&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Request
&lt;ul&gt;
&lt;li&gt;클라이언트가 서버에게 응답함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Acknowledge
&lt;ul&gt;
&lt;li&gt;DHCP 서버가 설정을 최종적으로 승인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="임대"&gt;임대&lt;/h3&gt;
&lt;p&gt;DHCP는 IP 주소를 영구적으로 할당하지 않고 일정 시간 동안 임대(Lease)하는 방식으로 관리한다.&lt;/p&gt;</description></item><item><title>Network. DNS(Domain Name System)</title><link>https://kelly-chui.github.io/posts/cs-network-dns/</link><pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-dns/</guid><description>&lt;h2 id="dns"&gt;DNS&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS: Domain Name System&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;도메인 이름을 IP 주소로 변환하는 시스템, 웹 사이트 주소를 IP주소로 변환해주는 역할&lt;/p&gt;
&lt;h2 id="동작-방식"&gt;동작 방식&lt;/h2&gt;
&lt;p&gt;DNS는 계층 구조를 가지며, 요청을 처리하는 과정에서 필요한 DNS 서버를 순차적으로 탐색한다. 한 번 조회한 결과는 캐시에 저장되어 이후에는 같은 과정을 반복하지 않을 수 있다.&lt;/p&gt;
&lt;p&gt;사용자가 google.com을 입력했다고 하면, 맥이 자동으로 로컬 DNS 서버에 요청을 보냄 → 만약 로컬 DNS 서버가 정보를 가지고 있지 않다면, 상위 DNS 서버로 요청을 보냄&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 맥 → 로컬 캐시 확인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 로컬 DNS 서버(ISP DNS 서버) → 로컬 캐시 확인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 로컬 DNS 서버 → 재귀 DNS 서버에 요청
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 재귀 DNS 서버 → 루트 DNS 서버 → TLD DNS 서버 → 권한 있는 네임서버
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 권한 있는 네임서버 → IP 주소 반환
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 재귀 DNS 서버 → 로컬 DNS 서버 → IP 주소 전달
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7. 로컬 DNS 서버 → 맥에 최종 IP 주소 전달
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8. 맥 → 구글 접속&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;재귀 DNS 서버(Recursive DNS Server)는 클라이언트를 대신하여 필요한 DNS 서버를 차례대로 조회하고 최종 결과를 반환하는 역할을 한다.&lt;/p&gt;</description></item><item><title>Network. REST(Representational State Transfer)</title><link>https://kelly-chui.github.io/posts/cs-network-restful-api/</link><pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-restful-api/</guid><description>&lt;h2 id="rest"&gt;REST&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;REST: Representational State Transfer&lt;/li&gt;
&lt;li&gt;RESTful API: REST를 기반으로 한 API&lt;/li&gt;
&lt;li&gt;REST 아키텍처 스타일의 설계 원칙을 준수하는 API&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note.&lt;/p&gt;
&lt;p&gt;REST는 HTTP와 동일한 개념이 아니다. REST는 웹 API를 설계하기 위한 아키텍처 스타일이며, HTTP는 REST를 구현할 때 가장 많이 사용하는 프로토콜이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="설계-원칙"&gt;설계 원칙&lt;/h2&gt;
&lt;h3 id="uniform-interface"&gt;Uniform interface&lt;/h3&gt;
&lt;p&gt;동일한 리소스에 대한 모든 API 요청은 동일하게 표시되어야 한다(리소스는 단일 URL을 통해 식별할 수 있도록 고유해야 한다). 서버는 표준 형식으로 정보를 전송하고, 형식이 지정된 리소스를 REST에서는 표현(Represent)라고 한다.&lt;/p&gt;</description></item><item><title>Network. URI(Uniform Resource Identifier)</title><link>https://kelly-chui.github.io/posts/cs-network-uri-urn-url/</link><pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-uri-urn-url/</guid><description>&lt;h2 id="uri-uniform-resource-identifier"&gt;URI (Uniform Resource Identifier)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;자원(파일, 웹 페이지, 이메일 주소)등을 식별하는 문자열&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;URI는 URL과 URN을 포함하는 상위 개념이다.&lt;/p&gt;
&lt;h2 id="url-uniform-resource-locator"&gt;URL (Uniform Resource Locator)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;자원의 위치(Location)와 접근 방법을 나타내는 URI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;HTTP, HTTPS, FTP 등의 프로토콜을 포함할 수 있다.&lt;/li&gt;
&lt;li&gt;프로토콜, 호스트, 경로, 쿼리 등을 통해 자원에 접근하는 방법을 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="urn-uniform-resource-name"&gt;URN (Uniform Resource Name)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;자원의 이름(Name)으로 식별하는 URI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;자원의 위치와 관계없이 고유한 이름으로 식별한다.&lt;/li&gt;
&lt;li&gt;대표적으로 ISBN, ISSN 등이 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="관계"&gt;관계&lt;/h2&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;URI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── URL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── URN&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>Network. HTTP(HyperText Transfer Protocol)</title><link>https://kelly-chui.github.io/posts/cs-network-http/</link><pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-network-http/</guid><description>&lt;h2 id="http"&gt;HTTP&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTP: HyperText Transfer Protocol&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;HTTP는 웹에서 클라이언트와 서버가 데이터를 주고받기 위한 애플리케이션 계층 프로토콜이다.&lt;/p&gt;
&lt;p&gt;클라이언트가 요청(Request)을 보내면 서버가 응답(Response)을 반환하는 Request-Response 방식으로 동작한다.&lt;/p&gt;
&lt;h2 id="동작-방식"&gt;동작 방식&lt;/h2&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓ HTTP Request
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓ HTTP Response
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id="특징"&gt;특징&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Request-Response 방식으로 동작한다.&lt;/li&gt;
&lt;li&gt;Stateless를 기본으로 한다.&lt;/li&gt;
&lt;li&gt;HTTP/1.x와 HTTP/2는 TCP를 기반으로 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="버전별-변화"&gt;버전별 변화&lt;/h2&gt;
&lt;h3 id="http10"&gt;HTTP/1.0&lt;/h3&gt;
&lt;p&gt;기본적으로 요청마다 연결을 새로 만드는 방식이 널리 사용됐다. 서버에서 여러 파일을 가져올 때 TCP 연결을 반복해서 설정하면 지연이 커질 수 있다. 다만 HTTP/1.0에서도 &lt;code&gt;Connection: keep-alive&lt;/code&gt;를 확장 기능으로 사용할 수 있었다.&lt;/p&gt;</description></item></channel></rss>