<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sj_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 27 Feb 2023 13:55:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. sj_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sj_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[]]]></title>
            <link>https://velog.io/@sj_/uou0xf6c</link>
            <guid>https://velog.io/@sj_/uou0xf6c</guid>
            <pubDate>Mon, 27 Feb 2023 13:55:11 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[]]]></title>
            <link>https://velog.io/@sj_/y0na0vzr</link>
            <guid>https://velog.io/@sj_/y0na0vzr</guid>
            <pubDate>Mon, 27 Feb 2023 13:55:04 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.06]]]></title>
            <link>https://velog.io/@sj_/2023.01.06</link>
            <guid>https://velog.io/@sj_/2023.01.06</guid>
            <pubDate>Fri, 06 Jan 2023 09:47:59 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.05]]]></title>
            <link>https://velog.io/@sj_/2023.01.05</link>
            <guid>https://velog.io/@sj_/2023.01.05</guid>
            <pubDate>Fri, 06 Jan 2023 09:47:43 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.04]]]></title>
            <link>https://velog.io/@sj_/2023.01.04</link>
            <guid>https://velog.io/@sj_/2023.01.04</guid>
            <pubDate>Fri, 06 Jan 2023 09:47:26 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.03]]]></title>
            <link>https://velog.io/@sj_/2023.01.03</link>
            <guid>https://velog.io/@sj_/2023.01.03</guid>
            <pubDate>Fri, 06 Jan 2023 09:47:12 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.02]]]></title>
            <link>https://velog.io/@sj_/2023.01.02</link>
            <guid>https://velog.io/@sj_/2023.01.02</guid>
            <pubDate>Fri, 06 Jan 2023 09:46:56 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2023.01.01]]]></title>
            <link>https://velog.io/@sj_/2023.01.01</link>
            <guid>https://velog.io/@sj_/2023.01.01</guid>
            <pubDate>Fri, 06 Jan 2023 09:46:40 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.30] 간단한 REST API 게시판 구현 - 3]]></title>
            <link>https://velog.io/@sj_/2022.12.30-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-3</link>
            <guid>https://velog.io/@sj_/2022.12.30-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-3</guid>
            <pubDate>Fri, 06 Jan 2023 09:44:12 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.29] 간단한 REST API 게시판 구현 - 2]]></title>
            <link>https://velog.io/@sj_/2022.12.29-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-2</link>
            <guid>https://velog.io/@sj_/2022.12.29-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-2</guid>
            <pubDate>Fri, 06 Jan 2023 09:43:45 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.28] 간단한 REST API 게시판 구현 - 1]]></title>
            <link>https://velog.io/@sj_/2022.12.28-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-1</link>
            <guid>https://velog.io/@sj_/2022.12.28-%EA%B0%84%EB%8B%A8%ED%95%9C-REST-API-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B5%AC%ED%98%84-1</guid>
            <pubDate>Fri, 06 Jan 2023 09:43:03 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.27] 스프링 MVC 기본 기능]]></title>
            <link>https://velog.io/@sj_/2022.12.27-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@sj_/2022.12.27-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Fri, 06 Jan 2023 09:38:33 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.26] 스프링 MVC 구조]]></title>
            <link>https://velog.io/@sj_/2022.12.26-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@sj_/2022.12.26-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 06 Jan 2023 09:37:59 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.25] ]]></title>
            <link>https://velog.io/@sj_/2022.12.25</link>
            <guid>https://velog.io/@sj_/2022.12.25</guid>
            <pubDate>Fri, 06 Jan 2023 09:37:16 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[HTTP] HTTP Header(2) - 캐시와 조건부 요청]]></title>
            <link>https://velog.io/@sj_/HTTP-HTTP-Header2-%EC%BA%90%EC%8B%9C%EC%99%80-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%9A%94%EC%B2%AD</link>
            <guid>https://velog.io/@sj_/HTTP-HTTP-Header2-%EC%BA%90%EC%8B%9C%EC%99%80-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%9A%94%EC%B2%AD</guid>
            <pubDate>Mon, 26 Dec 2022 01:23:33 GMT</pubDate>
            <description><![CDATA[<h2 id="캐시-기본-동작">캐시 기본 동작</h2>
<h3 id="캐시가-없을-때">캐시가 없을 때</h3>
<ul>
<li>데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다. </li>
<li>인터넷 네트워크는 매우 느리고 비싸다.</li>
<li>브라우저 로딩 속도가 느리다.</li>
<li>느린 사용자 경험</li>
</ul>
<h3 id="캐시-적용">캐시 적용</h3>
<ul>
<li>캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다. </li>
<li>비싼 네트워크 사용량을 줄일 수 있다.</li>
<li>브라우저 로딩 속도가 매우 빠르다.</li>
<li>빠른 사용자 경험</li>
</ul>
<p><code>max-age</code>: 캐시가 유효한 시간(초)</p>
<pre><code>HTTP/1.1 200 OK Content-Type: image/jpeg
cache-control: max-age=60
Content-Length: 34012

lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjkla
slkjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123</code></pre><p>응답 결과를 캐시에 저장</p>
<h3 id="캐시-시간-초과">캐시 시간 초과</h3>
<ul>
<li>캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다. </li>
<li>이때 다시 네트워크 다운로드가 발생한다.</li>
</ul>
<h2 id="검증-헤더와-조건부-요청1">검증 헤더와 조건부 요청1</h2>
<h3 id="검증-헤더-추가">검증 헤더 추가</h3>
<h2 id="검증-헤더와-조건부-요청2">검증 헤더와 조건부 요청2</h2>
<h3 id="검증-헤더-추가-1">검증 헤더 추가</h3>
<h2 id="캐시와-조건부-요청-헤더">캐시와 조건부 요청 헤더</h2>
<h3 id="캐시-제어-헤더">캐시 제어 헤더</h3>
<h2 id="프록시-캐시">프록시 캐시</h2>
<h2 id="캐시-무효화">캐시 무효화</h2>
<h3 id="cache-control">Cache-Control</h3>
<p>캐시 지시어(directives) - 확실한 캐시 무효화</p>
<ul>
<li>Cache-Control: no-cache<ul>
<li>데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용(이름에 주의!) </li>
</ul>
</li>
<li>Cache-Control: no-store<ul>
<li>데이터에 민감한 정보가 있으므로 저장하면 안됨 (메모리에서 사용하고 최대한 빨리 삭제)</li>
</ul>
</li>
<li>Cache-Control: must-revalidate<ul>
<li>캐시 만료후 최초 조회시 원 서버에 검증해야함</li>
<li>원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)</li>
<li>must-revalidate는 캐시 유효 시간이라면 캐시를 사용함</li>
</ul>
</li>
</ul>
<h3 id="no-cache-vs-must-revalidate">no-cache vs. must-revalidate</h3>
<h4 id="no-cache">no-cache</h4>
<ol>
<li>캐시 서버 요청 no-cache + ETag</li>
<li>원 서버에 접근할 수 없는 경우 캐시 서버 설정에 따라서 캐시 데이터를 반환할 수 있음 Error or 200 OK(오류 보다는 오래된 데이터라도 보여주자)</li>
<li>응답 200 OK</li>
</ol>
<h4 id="must-revalidate">must-revalidate</h4>
<ol>
<li>캐시 서버 요청 must-revalidate + ETag</li>
<li>원 서버에 접근할 수 없는 경우, 항상 오류가 발생해야 함 504 Gateway Timeout
(매우 중요한 돈과 관련된 결과로 생각해보자)</li>
<li>응답 504 Gateway Timeout</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTTP] HTTP Header(1) - 일반 헤더]]></title>
            <link>https://velog.io/@sj_/HTTP-HTTP-Header1-%EC%9D%BC%EB%B0%98-%ED%97%A4%EB%8D%94</link>
            <guid>https://velog.io/@sj_/HTTP-HTTP-Header1-%EC%9D%BC%EB%B0%98-%ED%97%A4%EB%8D%94</guid>
            <pubDate>Mon, 26 Dec 2022 01:23:16 GMT</pubDate>
            <description><![CDATA[<h2 id="http-헤더">HTTP 헤더</h2>
<ul>
<li>header-field = field-name &quot;:&quot; OWS field-value OWS (OWS:띄어쓰기 허용)</li>
<li>field-name은 대소문자 구문 없음</li>
</ul>
<h3 id="용도">용도</h3>
<ul>
<li>HTTP 전송에 필요한 모든 부가정보</li>
<li>e.g.) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보</li>
<li>표준 헤더가 너무 많음<ul>
<li><a href="https://en.wikipedia.org/wiki/List_of_HTTP_header_fields">https://en.wikipedia.org/wiki/List_of_HTTP_header_fields</a></li>
</ul>
</li>
<li>필요시 임의의 헤더 추가 가능</li>
</ul>
<h2 id="http-body">HTTP Body</h2>
<ul>
<li>메시지 본문(message body)을 통해 표현 데이터 전달 </li>
<li>메시지 본문 = 페이로드(payload)</li>
<li>표현은 요청이나 응답에서 전달할 실제 데이터</li>
<li>표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공<ul>
<li>데이터 유형(html, json), 데이터 길이, 압축 정보 등등</li>
</ul>
</li>
<li>참고: 표현 헤더는 표현 메타데이터와, 페이로드 메시지를 구분해야 하지만, 여기서는 생략</li>
</ul>
<h2 id="representation">Representation</h2>
<h3 id="content-type">Content-Type</h3>
<p>표현 데이터의 형식 설명</p>
<ul>
<li>미디어 타입, 문자 인코딩 </li>
<li>e.g.)<ul>
<li>text/html; charset=utf-8</li>
<li>application/json</li>
<li>image/png</li>
</ul>
</li>
</ul>
<h3 id="content-encoding">Content-Encoding</h3>
<p>표현 데이터 인코딩</p>
<ul>
<li>표현 데이터를 압축하기 위해 사용</li>
<li>데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가 </li>
<li>데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제</li>
<li>e.g.)<ul>
<li>gzip</li>
<li>deflate</li>
<li>identity</li>
</ul>
</li>
</ul>
<h3 id="content-language">Content-Language</h3>
<p>표현 데이터의 자연 언어</p>
<ul>
<li>표현 데이터의 자연 언어를 표현</li>
<li>e.g.)<ul>
<li>ko</li>
<li>en</li>
<li>en-US</li>
</ul>
</li>
</ul>
<h3 id="content-length">Content-Length</h3>
<p>표현 데이터의 길이</p>
<ul>
<li>바이트 단위</li>
<li>Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안됨</li>
</ul>
<h2 id="content-negotiation">Content Negotiation</h2>
<p>클라이언트가 선호하는 표현 요청</p>
<ul>
<li>협상 헤더는 요청시에만 사용</li>
</ul>
<h3 id="accept">Accept</h3>
<p>클라이언트가 선호하는 미디어 타입 전달</p>
<h3 id="accept-charset">Accept-Charset</h3>
<p>클라이언트가 선호하는 문자 인코딩 </p>
<h3 id="accept-encoding">Accept-Encoding</h3>
<p>클라이언트가 선호하는 압축 인코딩 </p>
<h3 id="accept-language">Accept-Language</h3>
<p>클라이언트가 선호하는 자연 언어</p>
<h3 id="우선-순위">우선 순위</h3>
<ul>
<li>Quality Values(q) 값 사용</li>
<li>0~1, 클수록 높은 우선순위</li>
<li>생략하면 1</li>
<li>Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7<ul>
<li><ol>
<li>ko-KR;q=1 (q생략)</li>
</ol>
</li>
<li><ol start="2">
<li>ko;q=0.9</li>
</ol>
</li>
<li><ol start="3">
<li>en-US;q=0.8 </li>
</ol>
</li>
<li><ol start="4">
<li>en:q=0.7<br></li>
</ol>
</li>
</ul>
</li>
<li>구체적인 것이 우선한다.</li>
<li>Accept: text/*, text/plain, text/plain;format=flowed, <em>/\</em> <ul>
<li><ol>
<li>text/plain;format=flowed</li>
</ol>
</li>
<li><ol start="2">
<li>text/plain</li>
</ol>
</li>
<li><ol start="3">
<li>text/*</li>
</ol>
</li>
<li><ol start="4">
<li><em>/\</em></li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="전송-방식">전송 방식</h2>
<h3 id="단순-전송">단순 전송</h3>
<p><strong>Request</strong></p>
<pre><code>GET /event</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8 
Content-Length: 3423

&lt;html&gt; 
    &lt;body&gt;...&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="압축-전송">압축 전송</h3>
<p><strong>Request</strong></p>
<pre><code>GET /event</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8 
Content-Encoding: gzip Content-Length: 521

lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjkl</code></pre><h3 id="분할-전송">분할 전송</h3>
<p><strong>Request</strong></p>
<pre><code>GET /event</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked

5
Hello
5
World
0
\r\n</code></pre><h3 id="범위-전송">범위 전송</h3>
<p><strong>Request</strong></p>
<pre><code>GET /event
Range: bytes=1001-2000</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK
Content-Type: text/plain 
Content-Range: bytes 1001-2000 / 2000

qweqwe1l2iu3019u2oehj1987askjh3q98y</code></pre><h2 id="일반-정보">일반 정보</h2>
<h3 id="from">From</h3>
<p>유저 에이전트의 이메일 정보</p>
<ul>
<li>일반적으로 잘 사용되지 않음</li>
<li>검색 엔진 같은 곳에서 주로 사용</li>
<li>요청에서 사용</li>
</ul>
<h3 id="referer">Referer</h3>
<p>이전 웹 페이지 주소</p>
<ul>
<li>현재 요청된 페이지의 이전 웹 페이지 주소</li>
<li>A ➞ B로 이동하는 경우 B를 요청할 때 Referer: A 를 포함해서 요청 </li>
<li>Referer를 사용해서 유입 경로 분석 가능</li>
<li>요청에서 사용</li>
<li>참고: referer는 단어 referrer의 오타</li>
</ul>
<h3 id="user-agent">User-Agent</h3>
<p>유저 에이전트 애플리케이션 정보</p>
<ul>
<li>e.g.) user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36</li>
<li>클라이언트의 애플리케이션 정보(웹 브라우저 정보, 등등) </li>
<li>통계 정보</li>
<li>어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능 </li>
<li>요청에서 사용</li>
</ul>
<h3 id="server">Server</h3>
<p>요청을 처리하는 ORIGIN 서버의 소프트웨어 정보</p>
<ul>
<li>e.g.) Server: Apache/2.2.22 (Debian) </li>
<li>e.g.) server: nginx</li>
<li>응답에서 사용</li>
</ul>
<h3 id="date">Date</h3>
<p>메시지가 발생한 날짜와 시간</p>
<ul>
<li>Date: Tue, 15 Nov 1994 08:12:31 GMT</li>
<li>응답에서 사용</li>
</ul>
<h2 id="특별한-정보">특별한 정보</h2>
<h3 id="host">Host</h3>
<p>요청한 호스트 정보(도메인)</p>
<ul>
<li>요청에서 사용</li>
<li>필수</li>
<li>하나의 서버가 여러 도메인을 처리해야 할 때</li>
<li>하나의 IP 주소에 여러 도메인이 적용되어 있을 때</li>
</ul>
<h3 id="location">Location</h3>
<p>페이지 리다이렉션</p>
<ul>
<li>웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)</li>
<li>201 (Created): Location 값은 요청에 의해 생성된 리소스 URI</li>
<li>3xx (Redirection): Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를 가리킴</li>
</ul>
<h3 id="allow">Allow</h3>
<p>허용 가능한 HTTP 메서드</p>
<ul>
<li>405 (Method Not Allowed) 에서 응답에 포함해야함 </li>
<li>Allow: GET, HEAD, PUT</li>
</ul>
<h3 id="retry-after">Retry-After</h3>
<p>유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간</p>
<ul>
<li>503 (Service Unavailable): 서비스가 언제까지 불능인지 알려줄 수 있음 </li>
<li>Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜 표기) </li>
<li>Retry-After: 120 (초단위 표기)</li>
</ul>
<h2 id="인증">인증</h2>
<h3 id="authorization">Authorization</h3>
<p>클라이언트 인증 정보를 서버에 전달</p>
<ul>
<li>Authorization: Basic xxxxxxxxxxxxxxxx</li>
</ul>
<h3 id="www-authenticate">WWW-Authenticate</h3>
<p>리소스 접근시 필요한 인증 방법 정의</p>
<ul>
<li>401 Unauthorized 응답과 함께 사용 </li>
<li>WWW-Authenticate: Newauth realm=&quot;apps&quot;, type=1, title=&quot;Login to &quot;apps&quot;&quot;, Basic realm=&quot;simple&quot;</li>
</ul>
<h2 id="쿠키">쿠키</h2>
<ul>
<li>Set-Cookie: 서버에서 클라이언트로 쿠키 전달(응답)</li>
<li>Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달</li>
</ul>
<h3 id="예시">예시</h3>
<h4 id="로그인">로그인</h4>
<p><strong>Request</strong></p>
<pre><code>POST /login HTTP/1.1 
user=홍길동</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK 
Set-Cookie: user=홍길동

홍길동님이 로그인했습니다.</code></pre><blockquote>
<p>쿠키 저장소에 user=홍길동 저장</p>
</blockquote>
<h4 id="로그인-이후-welcome-페이지-접근">로그인 이후 welcome 페이지 접근</h4>
<p><strong>Request</strong>(쿠키 저장소에서 조회)</p>
<pre><code>GET /welcome HTTP/1.1 
Cookie: user=홍길동</code></pre><p><strong>Response</strong></p>
<pre><code>HTTP/1.1 200 OK 

안녕하세요. 홍길동님</code></pre><h4 id="모든-요청에-쿠키-정보-자동-포함">모든 요청에 쿠키 정보 자동 포함</h4>
<pre><code>GET /welcome HTTP/1.1 
Cookie: user=홍길동</code></pre><pre><code>GET /board HTTP/1.1 
Cookie: user=홍길동</code></pre><pre><code>GET /order HTTP/1.1 
Cookie: user=홍길동</code></pre><h3 id="정리">정리</h3>
<ul>
<li>e.g.) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure </li>
<li>사용처<ul>
<li>사용자 로그인 세션 관리</li>
<li>광고 정보 트래킹</li>
</ul>
</li>
<li>쿠키 정보는 항상 서버에 전송됨<ul>
<li>네트워크 트래픽 추가 유발</li>
<li>최소한의 정보만 사용(세션 id, 인증 토큰)</li>
<li>서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지 (localStorage, sessionStorage) 참고</li>
</ul>
</li>
<li>주의<ul>
<li>보안에 민감한 데이터는 저장하면 안됨(주민번호, 신용카드 번호 등등)</li>
</ul>
</li>
</ul>
<h3 id="생명주기">생명주기</h3>
<p><strong>Expires</strong>, <strong>max-age</strong></p>
<ul>
<li>Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT<ul>
<li>만료일이 되면 쿠키 삭제</li>
</ul>
</li>
<li>Set-Cookie: max-age=3600 (3600초)<ul>
<li>0이나 음수를 지정하면 쿠키 삭제</li>
</ul>
</li>
<li>세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지 </li>
<li>영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지</li>
</ul>
<h3 id="도메인">도메인</h3>
<p><strong>Domain</strong></p>
<ul>
<li>e.g.) domain=example.org</li>
<li>명시: 명시한 문서 기준 도메인 + 서브 도메인 포함</li>
<li>domain=example.org를 지정해서 쿠키 생성<ul>
<li>example.org는 물론이고</li>
<li>dev.example.org도 쿠키 접근 </li>
</ul>
</li>
<li>생략: 현재 문서 기준 도메인만 적용<ul>
<li>example.org 에서 쿠키를 생성하고 domain 지정을 생략<ul>
<li>example.org 에서만 쿠키 접근</li>
<li>dev.example.org는 쿠키 미접근</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="경로">경로</h3>
<p><strong>Path</strong></p>
<ul>
<li>e.g.) path=/home</li>
<li>이 경로를 포함한 하위 경로 페이지만 쿠키 접근</li>
<li>일반적으로 path=/ 루트로 지정 </li>
<li>e.g.)<ul>
<li>path=/home 지정</li>
<li>/home ➞ 가능 </li>
<li>/home/level1 ➞ 가능</li>
<li>/home/level1/level2 ➞ 가능 </li>
<li>/hello ➞ 불가능</li>
</ul>
</li>
</ul>
<h3 id="보안">보안</h3>
<h4 id="secure">Secure</h4>
<ul>
<li>쿠키는 http, https를 구분하지 않고 전송</li>
<li>Secure를 적용하면 https인 경우에만 전송 </li>
</ul>
<h4 id="httponly">HttpOnly</h4>
<ul>
<li>XSS 공격 방지</li>
<li>자바스크립트에서 접근 불가(document.cookie) </li>
<li>HTTP 전송에만 사용</li>
</ul>
<h4 id="samesite">SameSite</h4>
<ul>
<li>XSRF 공격 방지</li>
<li>요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTTP] HTTP Status]]></title>
            <link>https://velog.io/@sj_/HTTP-HTTP-Status</link>
            <guid>https://velog.io/@sj_/HTTP-HTTP-Status</guid>
            <pubDate>Mon, 26 Dec 2022 01:22:17 GMT</pubDate>
            <description><![CDATA[<h2 id="상태-코드">상태 코드</h2>
<p>클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능</p>
<ul>
<li>1xx (Informational): 요청이 수신되어 처리중</li>
<li>2xx (Successful): 요청 정상 처리</li>
<li>3xx (Redirection): 요청을 완료하려면 추가 행동이 필요</li>
<li>4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음 </li>
<li>5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함</li>
</ul>
<h2 id="1xxinformational">1xx(Informational)</h2>
<p>요청이 수신되어 처리중</p>
<ul>
<li>거의 사용하지 않는다.</li>
</ul>
<h2 id="2xxsuccessful">2xx(Successful)</h2>
<p>클라이언트의 요청을 성공적으로 처리</p>
<h3 id="200-ok">200 OK</h3>
<p>요청 성공</p>
<h3 id="201-created">201 Created</h3>
<p>요청 성공해서 새로운 리소스가 생성됨</p>
<h3 id="202-accepted">202 Accepted</h3>
<p>요청이 접수되었으나 처리가 완료되지 않았음</p>
<ul>
<li>배치 처리 같은 곳에서 사용</li>
<li>e.g.) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함</li>
</ul>
<h3 id="204-no-content">204 No Content</h3>
<p>서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음</p>
<ul>
<li>e.g.) 웹 문서 편집기에서 save 버튼</li>
<li>save 버튼의 결과로 아무 내용이 없어도 된다.</li>
<li>save 버튼을 눌러도 같은 화면을 유지해야 한다.</li>
<li>결과 내용이 없어도 204 메시지(2xx)만으로 성공을 인식할 수 있다.</li>
</ul>
<h2 id="3xxredirection">3xx(Redirection)</h2>
<p>요청을 완료하기 위해 유저 에이전트의 추가 조치 필요</p>
<h3 id="리다이렉션">리다이렉션</h3>
<p>웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)</p>
<ol>
<li><p>요청
<code>URL: /event</code></p>
<pre><code>GET /event HTTP/1.1 
Host: localhost:8080</code></pre></li>
<li><p>응답</p>
<pre><code>HTTP/1.1 301 Moved Permanently 
Location: /new-event</code></pre></li>
<li><p>자동 리다이렉트 
<code>URL: /new-event</code></p>
</li>
<li><p>요청</p>
<pre><code>GET /new-event HTTP/1.1 
Host: localhost:8080</code></pre></li>
<li><p>응답</p>
<pre><code>HTTP/1.1 200 OK 
...</code></pre></li>
</ol>
<h3 id="영구-리다이렉션---301-308">영구 리다이렉션 - 301, 308</h3>
<ul>
<li>리소스의 URI가 영구적으로 이동</li>
<li>원래의 URL를 사용하지 않음</li>
<li>검색 엔진 등에서도 변경 인지<br></li>
<li>301 Moved Permanently<ul>
<li>리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY)</li>
</ul>
</li>
<li>308 Permanent Redirect<ul>
<li>301과 기능은 같음</li>
<li>리다이렉트시 요청 메서드와 본문 유지(처음 POST를 보내면 리다이렉트도 POST 유지)</li>
</ul>
</li>
</ul>
<h3 id="일시-리다이렉션">일시 리다이렉션</h3>
<p>주문 완료 후 주문 내역 화면으로 이동</p>
<ul>
<li>리소스의 URI가 일시적으로 변경</li>
<li>따라서 검색 엔진 등에서 URL을 변경하면 안됨<br></li>
<li>302 Found<ul>
<li>리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY)</li>
</ul>
</li>
<li>303 See Other<ul>
<li>302와 기능은 같음</li>
<li>리다이렉트시 요청 메서드가 GET으로 변경</li>
</ul>
</li>
<li>307 Temporary Redirect<ul>
<li>302와 기능은 같음</li>
<li>리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다. MUST NOT) </li>
</ul>
</li>
</ul>
<h4 id="prg-postredirectget">PRG: Post/Redirect/Get</h4>
<ul>
<li>POST로 주문 후에 웹 브라우저를 새로고침하면? <ul>
<li>새로고침은 다시 요청</li>
<li>중복 주문이 될 수 있다.<br></li>
</ul>
</li>
<li>POST로 주문 후에 새로 고침으로 인한 중복 주문 방지 </li>
<li>POST로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트</li>
<li>새로고침해도 결과 화면을 GET으로 조회</li>
<li>중복 주문 대신에 결과 화면만 GET으로 다시 요청<br></li>
<li>PRG 이후 리다이렉트<ul>
<li>URL이 이미 POST ➞ GET으로 리다이렉트 됨</li>
<li>새로 고침 해도 GET으로 결과 화면만 조회</li>
</ul>
</li>
</ul>
<h3 id="302-303-307">302, 303, 307</h3>
<ul>
<li>정리<ul>
<li>302 Found ➞ GET으로 변할 수 있음</li>
<li>303 See Other ➞ 메서드가 GET으로 변경</li>
<li>307 Temporary Redirect ➞ 메서드가 변하면 안됨 </li>
</ul>
</li>
<li>역사<ul>
<li>처음 302 스펙의 의도는 HTTP 메서드를 유지하는 것</li>
<li>그런데 웹 브라우저들이 대부분 GET으로 바꾸어버림(일부는 다르게 동작)</li>
<li>그래서 모호한 302를 대신하는 명확한 303, 307이 등장함(301 대응으로 308도 등장)</li>
</ul>
</li>
<li>현실<ul>
<li>303, 307을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용 </li>
<li>자동 리다이렉션시에 GET으로 변해도 되면 그냥 302를 사용해도 큰 문제 없음</li>
</ul>
</li>
</ul>
<h3 id="기타-리다이렉션">기타 리다이렉션</h3>
<ul>
<li>300 Multiple Choices: 안쓴다. </li>
<li>304 Not Modified<ul>
<li>캐시를 목적으로 사용</li>
<li>클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에
저장된 캐시를 재사용한다. (캐시로 리다이렉트 한다.)</li>
<li>304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)     - 조건부 GET, HEAD 요청시 사용</li>
</ul>
</li>
</ul>
<h2 id="4xxclient-error">4xx(Client Error)</h2>
<ul>
<li>클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행할 수 없음</li>
<li>오류의 원인이 클라이언트에 있음</li>
<li>클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패함</li>
</ul>
<h3 id="400-bad-request">400 Bad Request</h3>
<p>클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음</p>
<ul>
<li>요청 구문, 메시지 등등 오류</li>
<li>클라이언트는 요청 내용을 다시 검토하고, 보내야함</li>
<li>e.g.) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때</li>
</ul>
<h3 id="401-unauthorized">401 Unauthorized</h3>
<p>클라이언트가 해당 리소스에 대한 인증이 필요함</p>
<ul>
<li>인증(Authentication) 되지 않음</li>
<li>401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명 </li>
<li>참고<ul>
<li>인증(Authentication): 본인이 누구인지 확인, (로그인)</li>
<li>인가(Authorization): 권한부여 (ADMIN 권한처럼 특정 리소스에 접근할 수 있는 권한, 인증이 있어야 인가가 있음)</li>
<li>오류 메시지가 Unauthorized 이지만 인증 되지 않음 (이름이 아쉬움)</li>
</ul>
</li>
</ul>
<h3 id="403-forbidden">403 Forbidden</h3>
<p>서버가 요청을 이해했지만 승인을 거부함</p>
<ul>
<li>주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우</li>
<li>e.g.) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우</li>
</ul>
<h3 id="404-not-found">404 Not Found</h3>
<p>요청 리소스를 찾을 수 없음</p>
<ul>
<li>요청 리소스가 서버에 없음</li>
<li>또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때</li>
</ul>
<h2 id="5xxserver-error">5xx(Server Error)</h2>
<ul>
<li>서버 문제로 오류 발생</li>
<li>서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있음(복구가 되거나 등등)</li>
</ul>
<h3 id="500-internal-server-error">500 Internal Server Error</h3>
<p>서버 문제로 오류 발생</p>
<ul>
<li>서버 내부 문제로 오류 발생</li>
<li>애매하면 500 오류</li>
</ul>
<h3 id="503-service-unavailable">503 Service Unavailable</h3>
<p>서비스 이용 불가</p>
<ul>
<li>서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음 </li>
<li>Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2022.12.23] 프론트 컨트롤러 패턴]]></title>
            <link>https://velog.io/@sj_/2022.12.23-%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@sj_/2022.12.23-%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Mon, 26 Dec 2022 01:21:57 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.22] MVC 패턴]]></title>
            <link>https://velog.io/@sj_/2022.12.22-MVC-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@sj_/2022.12.22-MVC-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Mon, 26 Dec 2022 01:21:45 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[2022.12.21] 서블릿]]></title>
            <link>https://velog.io/@sj_/2022.12.21-%EC%84%9C%EB%B8%94%EB%A6%BF</link>
            <guid>https://velog.io/@sj_/2022.12.21-%EC%84%9C%EB%B8%94%EB%A6%BF</guid>
            <pubDate>Mon, 26 Dec 2022 01:21:31 GMT</pubDate>
        </item>
    </channel>
</rss>