<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>young_01.log</title>
        <link>https://velog.io/</link>
        <description>ฅʕ•̫͡•ʔฅ</description>
        <lastBuildDate>Sat, 12 Apr 2025 06:26:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. young_01.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/young_01" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JsonInclude]]></title>
            <link>https://velog.io/@young_01/JsonInclude</link>
            <guid>https://velog.io/@young_01/JsonInclude</guid>
            <pubDate>Sat, 12 Apr 2025 06:26:11 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[EC2 EBS 볼륨 및 파티션 설정]]></title>
            <link>https://velog.io/@young_01/EC2-EBS-%EB%B3%BC%EB%A5%A8-%EB%B0%8F-%ED%8C%8C%ED%8B%B0%EC%85%98-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@young_01/EC2-EBS-%EB%B3%BC%EB%A5%A8-%EB%B0%8F-%ED%8C%8C%ED%8B%B0%EC%85%98-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 12 Mar 2025 14:25:18 GMT</pubDate>
            <description><![CDATA[<h1 id="ec2">EC2</h1>
<p>프리티어를 사용하다 보면, 용량으로 인해서 느려지거나 자주 멈추는 현상이 발생하는데 프리티어로서 해결할 방법은 EBS 볼륨 설정 </p>
<h2 id="ebs-볼륨-생성">EBS 볼륨 생성</h2>
<p><img src="https://velog.velcdn.com/images/young_01/post/6ca1ce8b-7cf8-4ac1-ad5d-b7ed5ab3774c/image.png" alt="">
AWS 메뉴에 보면, Elastic Block Store 가 존재한다.
거기서 볼륨 새로 생성!
그 후 EC2와 연결해주면 끝</p>
<h3 id="관리자-권한으로-전환sudo">관리자 권한으로 전환(sudo)</h3>
<ol>
<li><p>console 실행</p>
</li>
<li><p>root 계정 비번 설정</p>
<p> <code>sudo passwd root</code></p>
</li>
<li><p>sudo 적용</p>
<p> <code>su</code></p>
</li>
</ol>
<p>취소하려면 <code>exit</code> (root 계정 나가고 일반 계정으로 돌아온다.)</p>
<h2 id="하드디스크-목록-확인하드-이름-확인">하드디스크 목록 확인(하드 이름 확인)</h2>
<p><code>fdisk -l</code>
<code>lsblk</code>
<code>df -h</code>
해당 명령어들을 입력하면, 내가 연결한 EBS 볼륨명이 보일 것이다.
입력할 때, 자신의 볼륨명으로 입력할 것 - !!
<code>fdisk /dev/자신의볼륨명</code></p>
<h2 id="파티션-연결">파티션 연결</h2>
<pre><code>fdisk /dev/자신의볼륨명
n
p
1
enter(기본값으로 설정)
enter(기본값으로 설정)
p
w
reboot</code></pre><pre><code>ubuntu@ip-172:~$ sudo fdisk /dev/xvdbb

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xd2607b1c.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): 

Created a new partition 1 of type &#39;Linux&#39; and of size 20 GiB.

Command (m for help): p
Disk /dev/xvdbb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd2607b1c

Device      Boot Start      End  Sectors Size Id Type
/dev/xvdbb1       2048 41943039 41940992  20G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.</code></pre><p>이후 reboot 하기 ~</p>
<p>sudo mkfs -t ext4 /dev/xvdbb</p>
<h2 id="마운트">마운트</h2>
<pre><code>mkdir /disk01                   // 메모리 할당 디렉토리 생성
chmod 777 /disk01               // 디렉토리에 모든 권한 부여
mount /dev/xvd*1 /disk01        // 파티션 마운트


#마운트 영구 적용
vi /etc/fstab                                                   // 설정 파일 편집
/dev/xvd*1 /    /disk01    ext4    defaults    1 2              // 공백은 TAB
</code></pre><p>마운트 영구 적용 입력 시
<img src="https://velog.velcdn.com/images/young_01/post/8d4d3a0e-a342-4324-8b5a-c4cf4bd1e566/image.png" alt=""></p>
<pre><code>mount -a</code></pre><p><img src="https://velog.velcdn.com/images/young_01/post/ae500677-de51-4df8-9283-6cb623e48b93/image.png" alt="">
이렇게 적용된 걸 볼 수 있다 ~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] git pull 3가지 옵션 ]]></title>
            <link>https://velog.io/@young_01/Git-git-pull-3%EA%B0%80%EC%A7%80-%EC%98%B5%EC%85%98</link>
            <guid>https://velog.io/@young_01/Git-git-pull-3%EA%B0%80%EC%A7%80-%EC%98%B5%EC%85%98</guid>
            <pubDate>Sun, 23 Feb 2025 09:44:31 GMT</pubDate>
            <description><![CDATA[<p>github를 통해 개발을 하다 보면, 특정 브랜치를 pull 받아야할 때가 있다.
하지만 내가 작업하던 브랜치와 pull 받는 브랜치의 상태가 다르면, pull option을 지정해준 후에, add -&gt; commit -&gt; push 과정을 따라야 한다.
<img src="https://velog.velcdn.com/images/young_01/post/7192002a-d264-41c9-94db-3ed3b33151f7/image.png" alt=""></p>
<pre><code>git config pull.rebase false
git config pull.rebase true
git config pull.ff only</code></pre><p>3가지의 상황을 알아보자.</p>
<pre><code>git config pull.rebase false</code></pre><p>옵션을 선택한 후 다시 </p>
<pre><code>git pull origin [pull 받을 브랜치명]
</code></pre><p>입력 시, 충돌이 발생한다.</p>
<pre><code>자동 병합: src/main/resources/application.yml
충돌 (내용): src/main/resources/application.yml에 병합 충돌
CONFLICT (modify/delete): src/main/resources/templates/index.html deleted in 296a219e4c55ea4a642546d2fc91faa33654e9a8 and modified in HEAD.  Version HEAD of src/main/resources/templates/index.html left in tree.
CONFLICT (modify/delete): src/main/resources/templates/login.html deleted in 296a219e4c55ea4a642546d2fc91faa33654e9a8 and modified in HEAD.  Version HEAD of src/main/resources/templates/login.html left in tree.
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.</code></pre><pre><code>git status</code></pre><p>충돌을 바로잡고, 한 번 더 git 상태를 확인해본 후에</p>
<pre><code>git add ~
git commit -m &quot;커밋메세지&quot;
git push origin [브랜치명]</code></pre><p>입력하면, pull 받았던 커밋 1개
방금 과정에서 진행한 커밋 1개로, 총 2개의 커밋이 생성된다.</p>
<blockquote>
<p>참고
<a href="https://kgw7401.tistory.com/103">https://kgw7401.tistory.com/103</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mac M2 Docker 오류]]></title>
            <link>https://velog.io/@young_01/docker-uninstall</link>
            <guid>https://velog.io/@young_01/docker-uninstall</guid>
            <pubDate>Sun, 26 Jan 2025 12:28:09 GMT</pubDate>
            <description><![CDATA[<h2 id="docker-uninstall">Docker Uninstall</h2>
<p>Docker 버전을 봐도, 잘 설치되어있는데,</p>
<pre><code> % docker --version
Docker version 27.4.0, build bde2b89</code></pre><p>갑자기 도커가 실행이 안될 때  만난 에러</p>
<pre><code class="language-cmd">% docker ps -a
Cannot connect to the Docker daemon at unix:///Users/simboyoung/.docker/run/docker.sock. Is the docker daemon running?</code></pre>
<h1 id="docker-uninstall-명령어">Docker Uninstall 명령어</h1>
<pre><code>sudo rm -rf /Applications/Docker.app
# 비밀번호 입력이 나온다 맥 비밀번호 입력할 것
sudo rm -rf /Applications/Docker.app
sudo rm -rf ~/.docker
sudo rm -rf /var/lib/docker
sudo rm -rf /var/run/docker.sock
sudo rm -rf /etc/docker

brew uninstall --cask docker
brew uninstall --formula docker-compose docker-machine

ls /usr/local/bin | grep docker
sudo rm /usr/local/bin/docker
# 비밀번호 입력이 나온다. 맥 비밀번호 입력할 것
sudo rm /usr/local/bin/docker-index
</code></pre><p>이 과정을 완료하면, 도커는 삭제되어있다.</p>
<p>homebrew 를 이용하거나, Docker dmg 파일 이용해서 설치하는 방법이 있다.</p>
<h2 id="docker-install">Docker Install</h2>
<h3 id="1-homebrew-이용하기">1. Homebrew 이용하기</h3>
<p>dmg파일로 설치해서 벌써 재설치가 2    번째라서 이번엔 Homebrew를 이용해서 설치해보려고 한다.</p>
<pre><code>brew update
brew install cask
brew install --cask docker</code></pre><h3 id="2-dmg-파일">2. dmg 파일</h3>
<p><a href="https://www.docker.com/products/docker-desktop/">https://www.docker.com/products/docker-desktop/</a>
각자 해당하는 설치파일 다운로드 받기
<img src="https://velog.velcdn.com/images/young_01/post/e23c638a-ede2-496c-8506-c5a5caa7b2f7/image.png" alt=""></p>
<h2 id="혹시-docker-실행이-오래된-건-아닐까">혹시 docker 실행이 오래된 건 아닐까?</h2>
<pre><code>ps aux | grep -i docker    </code></pre><p>내 로컬에서 돌아가고 있는 docker 항목들 보면,</p>
<pre><code>
40679 100.0  0.0 412141712    240   ??  R    24 225  3716:26.63 /Applications/Docker.app/Contents/MacOS/com.docker.backend run
18438   0.0  0.0 410724112   1488 s000  S+   12:58AM   0:00.01 grep -i docker</code></pre><p>이런 명령어가 뜰 수도 있다.</p>
<pre><code>kill -9 [pid] 
$ kill -9 40679</code></pre><p>해당 명령어로 실행을 종료시키고,</p>
<pre><code>ps aux | grep -i docker    </code></pre><p>한 번 더 확인해주고,
도커를 열어주면 열린다..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JWT 인증 로그인 시 응답 헤더 ]]></title>
            <link>https://velog.io/@young_01/jwt-%EB%A1%9C%EA%B7%B8%EC%9D%B8</link>
            <guid>https://velog.io/@young_01/jwt-%EB%A1%9C%EA%B7%B8%EC%9D%B8</guid>
            <pubDate>Fri, 17 Jan 2025 16:03:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/young_01/post/c1f8c754-85cd-48cd-835d-4c41a788023c/image.png" alt="">
jwt 인증 전 로그인 시도의 응답 Header</p>
<p><img src="https://velog.velcdn.com/images/young_01/post/2faad8f5-f3ee-4312-b442-c0fedeef55af/image.png" alt="">
jwt를 포함한 로그인 시도의 응답 header
Authorization이 포함된 걸 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/young_01/post/06cd16c1-42a3-42a0-80e2-74565127b35d/image.png" alt="">
200 OK 확인</p>
<p><img src="https://velog.velcdn.com/images/young_01/post/a92c2b49-01cb-484d-9aad-28e9fe90343c/image.png" alt=""></p>
<h3 id="로그인-시-jwt-토큰-발급-후-admin-page-접속-요청-시-토큰-검증-성공">로그인 시 JWT 토큰 발급 후 admin page 접속 요청 시 토큰 검증 성공</h3>
<pre><code>2024-12-13T23:45:45.657+09:00  INFO 37638 --- [nio-8080-exec-2] org.pra.ylog.jwt.JWTFilter               : JWT Authorization : null
2024-12-13T23:45:45.657+09:00  INFO 37638 --- [nio-8080-exec-2] org.pra.ylog.jwt.JWTFilter               : token null
2024-12-13T23:45:45.777+09:00  INFO 37638 --- [nio-8080-exec-2] o.p.y.u.service.CustomUserDetailService  : 로그인 시도: test@test.com
2024-12-13T23:45:45.797+09:00  INFO 37638 --- [nio-8080-exec-2] o.p.y.u.service.CustomUserDetailService  : 로그인 성공: test@test.com
2024-12-13T23:46:10.506+09:00  INFO 37638 --- [nio-8080-exec-3] org.pra.ylog.jwt.JWTFilter               : JWT Authorization : Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRlc3RAdGVzdC5jb20iLCJyb2xlIjoiUk9MRV9BRE1JTiIsImlhdCI6MTczNDEwMTE0NSwiZXhwIjoxNzM0MTAxMTgxfQ.vXEKIvMayzxhtg3ACZ8sQHkEjXNevdNgUzq_peZBZUg
2024-12-13T23:46:10.507+09:00  INFO 37638 --- [nio-8080-exec-3] org.pra.ylog.jwt.JWTFilter               : authorization now
2024-12-13T23:46:10.546+09:00  INFO 37638 --- [nio-8080-exec-3] o.p.y.u.service.CustomUserDetailService  : 로그인 시도: test@test.com
2024-12-13T23:46:10.548+09:00  INFO 37638 --- [nio-8080-exec-3] o.p.y.u.service.CustomUserDetailService  : 로그인 성공: test@test.com
›</code></pre><p><img src="https://velog.velcdn.com/images/young_01/post/fc3e8178-7d22-4d9f-b3c1-2724f09972f2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[@Value 어노테이션의 2가지 사용법]]></title>
            <link>https://velog.io/@young_01/Value-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%98-2%EA%B0%80%EC%A7%80-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@young_01/Value-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%98-2%EA%B0%80%EC%A7%80-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Fri, 13 Dec 2024 13:11:35 GMT</pubDate>
            <description><![CDATA[<h2 id="상황">상황</h2>
<p>JWT를 공부하고 구현하는 과정에서, JWT의 Secret key 값을 받아와야하는 상황이 생겼다.
해당 어노테이션을 사용하기 위해서 import 해주는 과정에서, 자동완성 import로 lombok에서 제공하는 @Value 어노테이션을 사용하자 값을 받아오지 못하는 오류가 발생했다.</p>
<p>lombok에서 제공하는 @Value</p>
<pre><code class="language-java">import lombok.Value;</code></pre>
<p>jwt에서 사용하는 @Value </p>
<pre><code class="language-java">import org.springframework.beans.factory.annotation.Value;</code></pre>
<p>이 두 어노테이션의 차이는 무엇일까?</p>
<h3 id="lombok에서의-value">lombok에서의 @Value</h3>
<p>lombok.Value는 lombok에서 제공하는 어노테이션으로 불변한 클래스를 만들기 위한 어노테이션</p>
<p>[ 특징 ]</p>
<ul>
<li>불변 객체를 생성한다
  모든 필드는 final로 선언된다.
  클래스는 final로 선언된다 =&gt; 상속이 불가능하다</li>
<li>Getter 메서드가 자동으로 생성된다.</li>
<li>불변성을 유지하기 위해 Setter 메서드는 생성되지 않는다</li>
<li>생성자가 자동으로 생성된다.</li>
</ul>
<p>[ 왜 사용할까? ]</p>
<ol>
<li>데이터 무결성과 동시성 문제를 해결하기 위해 불변의 객체를 생성하기 위해서</li>
<li>코드 간결성을 높이고, 불변 객체를 쉽게 만들기 위해서 </li>
</ol>
<p>[ 예시 코드 ]</p>
<pre><code class="language-java">import lombok.Value;

@Value
public class User{
    String name;
    int age;
}</code></pre>
<ul>
<li>private final String name;</li>
<li>private final int age;</li>
<li>모든 필드에 대한 Getter </li>
<li>모든 필드를 초기화하는 생성자</li>
</ul>
<p>등을 자동으로 생성한다.</p>
<h3 id="spring의-value">Spring의 @Value</h3>
<p>annotation.Value는 Spring Framework에서 제공하는 어노테이션으로, 설정 값 또는 환경 변수 값을 주입하기 위해 사용됨</p>
<p>[ 특징 ]</p>
<ul>
<li>application.properties 또는 application.yml에 정의된 값을 Java 객체에 주입</li>
<li>환경 변수 등의 표현식을 통해 값을 주입할 수 있음</li>
</ul>
<p>[ 사용하는 이유 ]</p>
<ol>
<li>외부 설정 값을 유연하게 주입하기 위해서</li>
<li>환경에 따다 각 다른 값을 주입하거나 설정을 외부화하여 코드와 설정을 분리하기 위해 사용함</li>
</ol>
<p>[ 예시 코드 ]</p>
<pre><code class="language-java">import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.stereotype.Component;

@Component
public class AppConfig{

    @Value(&quot;${jwt.secret}&quot;)
    private String secretKey;
}</code></pre>
<pre><code class="language-yml"># application.yml

jwt:
    secret: abcdefghijklmnop</code></pre>
<p>application.yml 파일에 해당 secret key 값이 작성되어있어야 사용할 수 있음</p>
<h2 id="결론">결론</h2>
<h4 id="lombok의-value">Lombok의 @Value</h4>
<p>-&gt; 객체를 불변하게 만들 때 사용한다. 주로 데이터 클래스나 DTO, Entity 정의 시 사용</p>
<h4 id="spring의-value-1">Spring의 @Value</h4>
<p>-&gt;  외부 설정 값을 주입할 때 사용 됨. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringSecurity Session login/logout : POSTMAN으로 테스트하는 방법]]></title>
            <link>https://velog.io/@young_01/springsecurity-session-loginlogout</link>
            <guid>https://velog.io/@young_01/springsecurity-session-loginlogout</guid>
            <pubDate>Mon, 09 Dec 2024 15:48:31 GMT</pubDate>
            <description><![CDATA[<p>Postman을 사용하여 Spring Security에서 구현한 세션 기반 로그인 및 로그아웃 기능을 테스트</p>
<h2 id="로그인-테스트">로그인 테스트</h2>
<p>요청 구성</p>
<ul>
<li>URL: <a href="http://localhost:%7Bport%7D/login">http://localhost:{port}/login</a>
  (기본적으로 Spring Security는 /login 엔드포인트를 처리합니다.)</li>
<li>Method: POST</li>
<li>Headers:Content-Type: application/x-www-form-urlencoded (기본 로그인 폼 방식)</li>
<li>Body:
  : x-www-form-urlencoded 옵션으로 아래 값 추가:
  : username: 사용자의 이메일 또는 아이디 (Spring Security 설정에 따라)
  :password: 사용자의 비밀번호</li>
</ul>
<p>로그인 요청 예시</p>
<pre><code>POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080</code></pre><p>응답 결과</p>
<ul>
<li>성공 시<pre><code class="language-json">HTTP 상태 코드: 200 OK
Response Body: 없음 (Spring Security 기본 설정)
Response Headers:
Set-Cookie: JSESSIONID=&lt;세션ID&gt; (Postman에서 자동으로 쿠키를 저장)</code></pre>
</li>
<li>실패 시<pre><code class="language-json">HTTP 상태 코드: 401 Unauthorized
Response Body: 로그인 실패 메시지</code></pre>
<h2 id="로그아웃-테스트">로그아웃 테스트</h2>
요청 구성</li>
<li>URL: <a href="http://localhost:%7Bport%7D/logout">http://localhost:{port}/logout</a></li>
<li>Method: POST</li>
<li>Headers:</li>
<li>Cookie: JSESSIONID=&lt;로그인 성공 시 받은 세션 ID&gt;
Postman에서 자동으로 쿠키를 저장했을 경우, 이를 포함해 요청이 이루어짐.</li>
</ul>
<p>로그아웃 요청 예시</p>
<pre><code class="language-json">POST /logout HTTP/1.1
Host: localhost:8080
Cookie: JSESSIONID=&lt;로그인 성공 시 받은 세션 ID&gt;</code></pre>
<p>응답 결과</p>
<ul>
<li>성공 시<pre><code class="language-json">HTTP 상태 코드: 302 Found (기본 설정에 따라 리다이렉션)
Redirect Location: /login (기본 로그아웃 성공 후 리다이렉트 경로)</code></pre>
</li>
<li>실패 시<pre><code class="language-json">HTTP 상태 코드: 403 Forbidden (로그아웃 시 인증 정보가 없는 경우)</code></pre>
</li>
</ul>
<h3 id="login-요청-시-header">Login 요청 시, header</h3>
<pre><code class="language-http">GET /login HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=D389FD339E34A9DA00174898FF5930C6
Host: localhost:8080
... </code></pre>
<ul>
<li>Cookie에 JSESSIONID가 포함되어 로그인을 요청하는 것을 볼 수 있다.<h3 id="login-응답-시-header">Login 응답 시, header</h3>
<pre><code class="language-http">HTTP/1.1 200
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Length: 1408
Date: Mon, 09 Dec 2024 15:46:29 GMT
Keep-Alive: timeout=60
Connection: keep-alive</code></pre>
</li>
<li>http 200인 성공 코드가 반환된 걸 확인할 수 있다.</li>
</ul>
<h3 id="logout-요청-헤더">Logout 요청 헤더</h3>
<pre><code class="language-http">GET /logout HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=F39DF6E54346B57C53EE911B292480FA
Host: localhost:8080
... </code></pre>
<ul>
<li>JSESSIONID 값과 함께 로그아웃을 요청한 것을 확인할 수 있다.<h3 id="login-응답-헤더">Login 응답 헤더</h3>
<pre><code class="language-http">HTTP/1.1 302
Set-Cookie: JSESSIONID=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:10 GMT; Path=/
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://localhost:8080/home
Content-Length: 0
Date: Mon, 09 Dec 2024 15:46:29 GMT
Keep-Alive: timeout=60
Connection: keep-alive</code></pre>
</li>
<li>로그아웃과 동시에, JSESSIONID가 만료되고, 리다이렉트를 표현하는 302코드를 반환한 것을 확인할 수 있다.</li>
<li>SecurityConfig에서 logout.redirectUrl을 지정해둔 url로 리다이렉트되었다.</li>
</ul>
<hr>
<h3 id="결론">결론</h3>
<ol>
<li>로그아웃이 성공적으로 처리되어, 세션이 종료되었다.</li>
<li>JSESSIONID 쿠키가 삭제되었기 때문에, 이후 인증이 필요한 페이지에 접근할 때 로그인 없이 접근할 수 없게 된다.</li>
</ol>
<blockquote>
<p>참고
<a href="https://hokyun1.tistory.com/46">https://hokyun1.tistory.com/46</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MAC] Port 8080 was already in use]]></title>
            <link>https://velog.io/@young_01/MAC-Port-8080-was-already-in-use</link>
            <guid>https://velog.io/@young_01/MAC-Port-8080-was-already-in-use</guid>
            <pubDate>Mon, 02 Dec 2024 14:47:04 GMT</pubDate>
            <description><![CDATA[<p>Springboot로 서버를 구성하다보면, 8080포트가 이미 사용중이라는 메세지를 자주 접하게 된다.</p>
<p>맥 버전의 task kill 명령어를 확인해보자</p>
<pre><code class="language-terminal">lsof -i tcp:8080</code></pre>
<p>저렇게 작성하면 사용중이라는 PID 번호가 나올 것이다.</p>
<pre><code>sudo kill -9 PID번호</code></pre><p>엔터를 치면,</p>
<pre><code>Password: </code></pre><p>가 출력될 텐데, 그때는 mac 비밀번호를 입력하면 된다(기본적으로 mac에 로그인하는 PIN)</p>
<p>참고용 Terminal </p>
<pre><code>Last login: Mon Dec  2 23:12:09 on ttys000
user@Mac-Pro ~ % lsof -i tcp:8080
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    19601 user   88u  IPv6 0xa3241c1b6cc7d33a      0t0  TCP *:http-alt (LISTEN)
user@Mac-Pro ~ % sudo kill -9 19601
Password:
user@Mac-Pro ~ % lsof -i tcp:8080  
user@Mac-Pro ~ %  </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Mac M2 docker redis 설치 및 설정]]></title>
            <link>https://velog.io/@young_01/mac-docker-redis</link>
            <guid>https://velog.io/@young_01/mac-docker-redis</guid>
            <pubDate>Tue, 05 Nov 2024 08:00:58 GMT</pubDate>
            <description><![CDATA[<h2 id="docker-설치">Docker 설치</h2>
<p><a href="https://docs.docker.com/desktop/setup/install/mac-install/">https://docs.docker.com/desktop/setup/install/mac-install/</a></p>
<p>해당하는 os에 맞게 dmg 파일 설치</p>
<h3 id="설치-확인">설치 확인</h3>
<pre><code>docker </code></pre><pre><code># 결과
Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Authenticate to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information
...</code></pre><pre><code>docker --version</code></pre><pre><code># 결과
Docker version 27.4.0, build bde2b89</code></pre><h2 id="redis-설치">Redis 설치</h2>
<pre><code>docker pull redis</code></pre><pre><code># 결과
.
.
.
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest</code></pre><pre><code>docker images</code></pre><p><img src="https://velog.velcdn.com/images/young_01/post/2dd808f4-811c-4207-a109-f87428927269/image.png" alt=""></p>
<h2 id="redis-시작">redis 시작</h2>
<pre><code>docker run --name ylog-redis -p 6379:6379 -d redis</code></pre><p>-&gt; docker run --name [원하는 컨테이너명] -p [포트]:[포트] -d redis</p>
<pre><code>docker ps</code></pre><p>-&gt; 현재 작동 중인 컨테이너 리스트 출력</p>
<h2 id="redis-접속">redis 접속</h2>
<ol>
<li>명령어 입력<pre><code>docker exec -it ylog-redis /bin/bash</code></pre></li>
<li>접속된 화면<pre><code>root@f3537a492dc9:/data#</code></pre></li>
<li>cli     접속 명령어<pre><code>redis-cli</code></pre></li>
<li>해당하는 포트의 접속 완료
<del>~</del></li>
<li>0.0.1:6379&gt; <pre><code></code></pre></li>
</ol>
<blockquote>
<p>💡 참고
<a href="https://velog.io/@coastby/redis-docker%EB%A1%9C-redis-%EB%9D%84%EC%9A%B0%EA%B8%B0">https://velog.io/@coastby/redis-docker%EB%A1%9C-redis-%EB%9D%84%EC%9A%B0%EA%B8%B0</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redis ]]></title>
            <link>https://velog.io/@young_01/Redis</link>
            <guid>https://velog.io/@young_01/Redis</guid>
            <pubDate>Tue, 29 Oct 2024 14:16:52 GMT</pubDate>
            <description><![CDATA[<h1 id="redis란">Redis란?</h1>
<p>[<a href="https://redis.io/">레디스 공식 사이트</a>]</p>
<blockquote>
<p>Remote Dictionary Server 약자로서, &quot; 키 - 값 &quot; 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템(DBMS)
[위키백과]</p>
</blockquote>
<ul>
<li>고성능 Key-Value 구조의 저장소</li>
<li>비정형 데이터를 저장,관리하기 위한 오픈소스 기반의 NoSQL</li>
<li>In-Memory 데이터 구조를 가진 저장소</li>
<li>DB, Cache, Message Queue, SharedMemory 용도로 사용됨<blockquote>
<p>✓ In-Memory 
컴퓨터의 주기억장치인 RAM에 데이터를 올려서 사용하는 방법
RAM에 데이터를 저장하게 되면 메모리 내부에서 처리가 되므로 
데이터를 저장/조회할 때 하드디스크를 오고 가는 과정을 거치지 않아도 되어 속도가 빠름</p>
</blockquote>
주의) 서버의 메모리 용량을 초과하는 데이터를 처리하는 경우, RAM의 특성인 휘발성에 따라 데이터가 유실될 수 있음</li>
</ul>
<h2 id="사용하는-이유">사용하는 이유?</h2>
<p>데이터베이스(DB)는 데이터를 디스크에 직접 저장하기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않음
하지만, 매번 디스크에 접근해야하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있기에 캐시 서버 도입하여 사용
🤜 캐시 서버로 이용할 수 있는 것이 바로 Redis</p>
<p>같은 요청이 여러 번 들어올 때 Redis를 사용함으로써 캐시서버에서 저장해놨던 값을 바로 가져와 DB 부하를 줄이고, 서비스의 속도도 느려지지 않게 할 수 있음</p>
<h2 id="특징">특징</h2>
<ol>
<li>key-Value 구조</li>
<li>빠른 처리 속도</li>
<li>DataType(Collection) 지원 -&gt; 개발 편의/생산성 향상</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[시간복잡도]]></title>
            <link>https://velog.io/@young_01/%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84</link>
            <guid>https://velog.io/@young_01/%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84</guid>
            <pubDate>Mon, 14 Oct 2024 07:50:13 GMT</pubDate>
            <description><![CDATA[<h1 id="시간복잡도">시간복잡도</h1>
<p>입력되는 데이터의 증가에 따른 성능의 변화를 의미</p>
<h2 id="빅오-표기법-_-on">빅오 표기법 _ O(n)</h2>
<p>: 어떤 알고리즘에 n개의 데이터가 들어갔을 때 n개 대비 얼마나 많은 연산을 수행하는가</p>
<h3 id="o1">O(1)</h3>
<pre><code class="language-java">int func1(int[] n){
    if(n.length &lt;3 )
    return 0;

   int a = n[0];
   a += n[1];
   a += n[2];

   return a;
}</code></pre>
<p>n개의 배열이 존재한다
배열이 1개여도, 100개여도 수행할, 처리해야할 연산의 양은 고정되어있으므로 O(1)로 표기</p>
<h3 id="on">O(n)</h3>
<pre><code class="language-java">int sum(int[] n){
    int s = 0;
    for(int i : n) {
      s += 1;
    }
    return s;
}</code></pre>
<p>배열이 n개일 경우 수행해야할 반복문도 동일하게 수행되어야 하므로, O(n)로 표기
<img src="https://velog.velcdn.com/images/young_01/post/654bd953-aadc-4c20-81d8-1b2ea568088f/image.png" alt=""></p>
<h3 id="on2">O(n^2)</h3>
<pre><code class="language-java">void bubbleSort(int[] n){
    for (int i=0; i&lt;n.length; i++){
        for (int j=0; j&lt;n.length; j++){
          if(n[i] &lt; n[j]) {
            int temp = n[i];
            n[j]= n[i];
            n[i] = temp;
          }
        }
    }
}   </code></pre>
<p>n이 증가할수록 수행되는 연산의 횟수도 증가하고 있으므로 O(n^2)로 표기
<img src="https://velog.velcdn.com/images/young_01/post/4630f293-53b0-4d9c-b4f2-0ccfa61c23cd/image.png" alt=""></p>
<h3 id="olongn">O(longn)</h3>
<pre><code class="language-java">int sum(int[] n){
    int sum = 0;
    int max = n.length;
    while (max &gt; 0) {
      sim += n[max-1];
      max /= 2;
    }
    return sum;
}</code></pre>
<p>n을 넣으면, max 변수에 n이 포함되어있는 걸 확인되는데, max 변수는 연산을 실행할수록 줄어들고 있다.
동작을 하면 할수록 취급하는 범위가 점점 절반씩 줄어들고 있기 때문에 O(logn)로 표기 !
<a href="https://velog.velcdn.com/images/young_01/post/3593d481-11f5-4995-a5b2-059129151be5/image.png"></a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩테스트 파이썬 문법 모음집 (1)]]></title>
            <link>https://velog.io/@young_01/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@young_01/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 06 Oct 2024 13:39:36 GMT</pubDate>
            <description><![CDATA[<h3 id="빠른-입출력">빠른 입출력</h3>
<pre><code class="language-python">import sys
S = sys.stdin.readline().rstrip()
N = int(sys.stdin.readline().rstrip())

sys.stdout.write(S+&quot;\n&quot;) #개행 문자가 없으므로 유의

input = sys.stdin.readline
print = sys.stdout.write
S = input().rstrip()
N = int(input().rstrip())

print(S+&quot;\n&quot;)
print(str(N) + &quot;\n&quot;)</code></pre>
<h3 id="filter-함수">filter 함수</h3>
<pre><code class="language-python">nums=[3,5,4,8,9]
nums= list(filter(lambda n: n%2 != 0, nums))
print(nums) 
# [3, 5, 9]</code></pre>
<h3 id="list-comprehension-사용">List Comprehension 사용</h3>
<pre><code class="language-python">nums = [3,5,4,8,9]
nums = [ n for n in nums if n%2 != 0]
print(nums)
# [3, 5, 9]</code></pre>
<h3 id="enumerate">enumerate</h3>
<pre><code class="language-python">for i, c in enumerate(&quot;abcd&quot;):
    print(f&#39;{i}. {c}&#39;)
# 0. a
# 1. b
---</code></pre>
<h2 id="문자열과-숫자">문자열과 숫자</h2>
<h3 id="숫자-각-자리의-합">숫자 각 자리의 합</h3>
<pre><code class="language-python">I = 245
ans = sum(map(int, str(I)))
print(ans)</code></pre>
<h3 id="입력이-문자인지-숫자인지-확인">입력이 문자인지 숫자인지 확인</h3>
<pre><code class="language-python">S = input()
print(S.isdigit())</code></pre>
<h2 id="배열">배열</h2>
<h3 id="배열-정렬-여부-확인">배열 정렬 여부 확인</h3>
<pre><code class="language-python">L == L.sorted()</code></pre>
<h3 id="배열-뒤집기">배열 뒤집기</h3>
<pre><code class="language-python">L = L[::-1]</code></pre>
<h3 id="배열-정렬">배열 정렬</h3>
<pre><code class="language-python"># sort() : 원본 배열 변경
L = [3, 2, 4, 5]
L.sort()
print(L) # [2, 3, 4, 5]

L = [3, 2, 4, 5]
L.sort(reverse=True)
print(L) # [5, 4, 3, 2]

# sorted() : 원본 배열 변경 X
L = [3, 2, 4, 5]
L = sorted(L)
print(L) # [2, 3, 4, 5]

L = [3, 2, 4, 5]
L = sorted(L, reverse=True)
print(L) # [5, 4, 3, 2]</code></pre>
<h3 id="배열---문자열-변환">배열 -&gt; 문자열 변환</h3>
<p>: 구분자.join(리스트)</p>
<pre><code class="language-python">L = [5, 3, 1, 7]
print(&quot; &quot;, join(L)) # &#39;5 3 1 7&#39;
print(&quot;,&quot;, join(L)) # &#39;5,3,1,7&#39;</code></pre>
<h3 id="배열에서-특정한-원소들만-제거">배열에서 특정한 원소들만 제거</h3>
<pre><code class="language-python">L = [1, 2, 3, 4, 5, 4, 3, 2, 1]
remove_set =  {2, 4}
L = [n for n in L if n not in remove_set]
print(L)
# [1, 3, 5, 3, 1]</code></pre>
<h3 id="배열-원소의-합">배열 원소의 합</h3>
<ul>
<li>sum()<pre><code class="language-python">L = [2,4,6]
print(sum(L))  # 12</code></pre>
</li>
<li>zip()<pre><code class="language-python">A = [1, 2, 3, 4]
B = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]
print(list(zip(A, B))) # [(1, &#39;a&#39;), (2, &#39;b&#39;), (3, &#39;c&#39;), (4, &#39;d&#39;)]</code></pre>
<h2 id="딕셔너리">딕셔너리</h2>
<h3 id="key로-value-조회">key로 value 조회</h3>
<pre><code class="language-python">D = dict({5: 1, 3: 3, 4: 2})
print(D.get(5)) #1
print(D.get(999, 0)) #0 ==&gt; 찾으려는 값이 없을 때는 2번째 값 출력</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[POSTMAN Collection 사용법]]></title>
            <link>https://velog.io/@young_01/Postman-Collection%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@young_01/Postman-Collection%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Fri, 27 Sep 2024 11:55:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/young_01/post/349b233d-b377-47f4-a600-8adb830f383b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young_01/post/3d4aa10a-811d-4e0d-a58b-130238aa18c7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young_01/post/033f274b-acaa-488e-a253-b5a349f97a40/image.png" alt=""></p>
<p>테스트하기 위한 문서들 폴더로 정리 - 선호에 따라서 선택 
<img src="https://velog.velcdn.com/images/young_01/post/0833643c-6e51-4ed1-a2f0-a910464fc299/image.png" alt=""></p>
<p>원하는 폴더명으로 생성
<img src="https://velog.velcdn.com/images/young_01/post/e54e27bc-9747-4a22-9413-7bb8c2152f70/image.png" alt=""></p>
<p>api 생성 - ADD REQUEST
<img src="https://velog.velcdn.com/images/young_01/post/3b776ad7-4f05-4e75-b09f-486fb68134bf/image.png" alt=""></p>
<p>필요한 정보 작성
1 : 기능면
2 : TEST 하고자하는 API 주소 
<img src="https://velog.velcdn.com/images/young_01/post/a11e7f2a-5d40-4724-9815-bcdd7822ce4d/image.png" alt=""></p>
<p>api를 입력하고, save를 해야 왼쪽에 보이는 표식이 적용된다
( 위 이미지 경우 save를 하기 전이므로 처음 지정된 get으로 보임)</p>
<p><img src="https://velog.velcdn.com/images/young_01/post/e926d19c-0fd7-44d8-bf4e-9c98da774c57/image.png" alt=""></p>
<p>send를 통해 api test를 시작하면 끝!</p>
<blockquote>
</blockquote>
<p><a href="https://inpa.tistory.com/entry/POSTMAN-%F0%9F%92%BD-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EC%82%AC%EC%9A%A9%EB%B2%95-API-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B3%A0%EA%B8%89-%ED%99%9C%EC%9A%A9%EA%B9%8C%EC%A7%80">참고
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS S3 bucket 생성 및 정책]]></title>
            <link>https://velog.io/@young_01/s3-bucket-%EC%A0%95%EC%B1%85</link>
            <guid>https://velog.io/@young_01/s3-bucket-%EC%A0%95%EC%B1%85</guid>
            <pubDate>Fri, 06 Sep 2024 07:28:13 GMT</pubDate>
            <description><![CDATA[<h1 id="s3-bucket-생성하기">S3 Bucket 생성하기</h1>
<p><img src="https://velog.velcdn.com/images/young_01/post/d47dd3c5-90b4-4e69-b362-4cf7dbfcad57/image.png" alt=""></p>
<h3 id="1-버킷-만들기">1. 버킷 만들기</h3>
<ul>
<li>버킷명은 전세계 유일해야하는 것 주의!
<img src="https://velog.velcdn.com/images/young_01/post/c8373166-be57-480f-a218-8a4da83b2df3/image.png" alt=""></li>
</ul>
<h3 id="2-퍼블릿-엑세스-차단-설정">2. 퍼블릿 엑세스 차단 설정</h3>
<ul>
<li>모든 퍼블릭 엑세스 차단 체크 해제 
<img src="https://velog.velcdn.com/images/young_01/post/a9d243c4-b21e-4fd1-a51e-52e4d0e0b950/image.png" alt=""></li>
</ul>
<p>그 후, 생성 버튼 클릭</p>
<h2 id="s3-버킷-정책-편집">S3 버킷 정책 편집</h2>
<p><img src="https://velog.velcdn.com/images/young_01/post/0eae436a-8167-44ef-b305-37263d4be767/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young_01/post/7c76b432-e5b5-4deb-9d49-02561346d9f2/image.png" alt="">
<img src="https://velog.velcdn.com/images/young_01/post/dfcac4f7-619f-4156-bf95-9ee7a47b87a5/image.png" alt="">
<img src="https://velog.velcdn.com/images/young_01/post/e8f9881e-4937-44c4-ac43-2b5e66a209ac/image.png" alt="">
<img src="https://velog.velcdn.com/images/young_01/post/776a9ff6-3b9b-49b5-9f97-359a7e3e2fba/image.png" alt=""></p>
<h2 id="버킷-편집-메뉴">버킷 편집 메뉴</h2>
<p><img src="https://velog.velcdn.com/images/young_01/post/8229207a-8c50-4ba9-893b-e67ffd00263c/image.png" alt=""></p>
<ul>
<li>편집을 클릭하여 방금  페이지에서 복사해 온 내용을 작성해줍니다.
<img src="https://velog.velcdn.com/images/young_01/post/dcb04c5f-9e68-4108-ab0b-1aca5de2a163/image.png" alt=""></li>
</ul>
<pre><code>{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Id&quot;: &quot;Policy1725607524026&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Sid&quot;: &quot;Stmt1725607521486&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: &quot;*&quot;,
            &quot;Action&quot;: [
                &quot;s3:GetObject&quot;,
                &quot;s3:PutObject&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:s3:::orderflow-bk/*&quot;
        }
    ]
}</code></pre><h2 id="생성-후">생성 후</h2>
<p><img src="https://velog.velcdn.com/images/young_01/post/e96250dd-c112-455f-a50c-ac92dccee7b4/image.png" alt=""></p>
<p>계정에 관한 이슈로 확인됨
AWS IAM으로 이동
<img src="https://velog.velcdn.com/images/young_01/post/dba9d35b-7799-4259-a056-4d482f85baa0/image.png" alt="">
<img src="https://velog.velcdn.com/images/young_01/post/c2a912dc-66c5-415d-be04-e13ca2060630/image.png" alt="">
<img src="https://velog.velcdn.com/images/young_01/post/7d777cc8-f72f-4913-88a0-e71690ef181c/image.png" alt=""></p>
<p>외부와 S3 연결을 위하여 액세스 키 생성
<img src="https://velog.velcdn.com/images/young_01/post/7677c7ca-cdb1-4ac5-bade-29deb1f8a57f/image.png" alt=""></p>
<ul>
<li>외부에서 실행되는 애플리케이션으로 선택
<img src="https://velog.velcdn.com/images/young_01/post/854e4ef3-7987-4457-8a40-5426822b83e6/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS VPC 생성 및 라우팅테이블 연결]]></title>
            <link>https://velog.io/@young_01/aws</link>
            <guid>https://velog.io/@young_01/aws</guid>
            <pubDate>Thu, 05 Sep 2024 14:31:16 GMT</pubDate>
            <description><![CDATA[<h1 id="네트워크-구성하기">네트워크 구성하기</h1>
<h2 id="vpc-생성">VPC 생성</h2>
<h3 id="1-vpc-생성-클릭">1. VPC 생성 클릭</h3>
<h3 id="2-vpc-설정에서-vpc-등--선택">2. VPC 설정에서, VPC 등  선택</h3>
<ul>
<li>CIDR 블록은 기본 값인 10.0.0.0/16 설정
<img src="https://velog.velcdn.com/images/young_01/post/5b0c0f03-24d7-411f-8485-36658e75b876/image.png" alt=""></li>
</ul>
<h3 id="3-가용-영역az--1개-선택">3. 가용 영역(AZ)  1개 선택</h3>
<ul>
<li>가용 영역은 ap-northeast-2a 선택
: 해당 가용 영역은 아까 설정한 VPC의 부분 집합<h3 id="4-퍼블릭-서브넷-및-프라이빗-서브넷-설정">4. 퍼블릭 서브넷 및 프라이빗 서브넷 설정</h3>
&lt;퍼블릭&gt;</li>
<li>1개로 선택</li>
<li>CIDR 블록은 기본 값인 10.0.10.0/24 설정
&lt;프라이빗&gt;</li>
<li>생성하지 않을 것이므로 0개로 선택
<img src="https://velog.velcdn.com/images/young_01/post/c6ad5c4e-dc04-4408-adbc-de1f75a4a29b/image.png" alt=""></li>
</ul>
<blockquote>
<p>VPC IPv4 CIDR 블록 값을 지정할 때에는 향후 직접 연결할 가능성이 있는 네트워크와 주소가 중복되지 않도록 할당하는 것이 중요
-향후 확장을 고려하여 충분히 큰 주소를 할당하기</p>
</blockquote>
<p>생성하기 클릭 </p>
<h3 id="5-생성된-vpc-확인">5. 생성된 VPC 확인</h3>
<p><img src="https://velog.velcdn.com/images/young_01/post/57d6c050-8ab3-4d66-bedd-28c32e006945/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young_01/post/dbecd99d-fb3a-4629-9204-ef06dcc298eb/image.png" alt=""></p>
<h2 id="추가-서브넷-생성하기">추가 서브넷 생성하기</h2>
<p>-&gt; 고가용성을 확보하기 위해 다중 가용 영역에 서비스를 배포하는 것이 중요함
앞서 생성한 서브넷이 위치한 가용 영역 A 외에 다른 가용 영역 C 에 서브넷 생성</p>
<h3 id="1-서브넷-생성">1. 서브넷 생성</h3>
<p>VPC ID는 이미 생성되어 있는(앞서 생성한) VPC 선택
<img src="https://velog.velcdn.com/images/young_01/post/a1f2bde6-6770-4eca-a212-11dd93f68ce3/image.png" alt=""></p>
<h3 id="2-서브넷-설정">2. 서브넷 설정</h3>
<p><img src="https://velog.velcdn.com/images/young_01/post/e17036f3-8962-4bf1-9d84-5b61ac6e1e1a/image.png" alt=""></p>
<p>생성하기 클릭</p>
<h3 id="3-생성된-서브넷-확인">3. 생성된 서브넷 확인</h3>
<h2 id="라우팅-테이블-연결하기">라우팅 테이블 연결하기</h2>
<p>: 서브넷 또는 게이트 웨이의 네트워크 트래픽이 전송되는 위치를 결정하는 . 데사용되는 &#39;라우팅&#39; 규칙 집합 포함되어있음</p>
<ul>
<li>기본 라우팅 테이블 : VPC와 함게 자동으로 생성되는 라우팅 테이블로, 다른 라우팅 테이블과 명시적으로 연결되지 않은 모든 서브넷의 라우팅을 제어하는 역할</li>
<li>사용자 지정 라우팅 테이블 : 기본 라우팅 테이블 외에 사용자가 생성한 라우팅 테이블</li>
</ul>
<h3 id="1-라우팅-테이블-연결-편집">1. 라우팅 테이블 연결 편집</h3>
<p><img src="https://velog.velcdn.com/images/young_01/post/22803e27-7260-4d7f-9fa8-486a8fad7909/image.png" alt=""></p>
<ul>
<li>라우팅 테이블ID에는 기본 라우팅 테이블이 아닌 다른 라우팅 테이블을 선택한 후, 저장</li>
<li>선택한 라우팅 테이블에 인터넷으로 향하는 경로가 있는지 확인!
<img src="https://velog.velcdn.com/images/young_01/post/bca37522-22a3-4724-97ff-eee7269a784d/image.png" alt=""></li>
</ul>
<h3 id="2-라우팅-정보-확인">2. 라우팅 정보 확인</h3>
<ul>
<li>설정한 서브넷 선택 후, 세부 정보 탭에서 변경된 라우팅 테이블 하이퍼 링크 클릭 시, 라우팅 정보 확인할 수 있음</li>
</ul>
<h2 id="보안-그룹-생성">보안 그룹 생성</h2>
<h3 id="보안그룹">보안그룹</h3>
<p>: 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할</p>
<h3 id="1-보안-그룹-생성">1. 보안 그룹 생성</h3>
<ul>
<li>VPC 메뉴에서 보안 그룹 메뉴 클릭 후, 보안 그룹 생성 버튼 클릭</li>
</ul>
<ol>
<li>보안 그룹 이름 작성</li>
<li>VPC는 전에 생성해둔 것으로 선택
<img src="https://velog.velcdn.com/images/young_01/post/2298bb00-e073-4394-a87e-7644b7f24918/image.png" alt=""></li>
</ol>
<h3 id="2-인바운드-규칙-편집">2. 인바운드 규칙 편집</h3>
<p>인바운드 규칙에 규칙 부여</p>
<blockquote>
<p>SSH - 내 IP
HTTP - 내 IP
<img src="https://velog.velcdn.com/images/young_01/post/dad3978f-8985-49eb-b8d8-237a19114b58/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[🤔 CSRF가 필요한 이유가 뭘까?]]></title>
            <link>https://velog.io/@young_01/CSRF-%ED%86%A0%ED%81%B0</link>
            <guid>https://velog.io/@young_01/CSRF-%ED%86%A0%ED%81%B0</guid>
            <pubDate>Sun, 25 Aug 2024 12:52:06 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-상황">문제 상황</h1>
<ul>
<li>Electron 기반으로 프로그램이 결과 데이터를 Spring 서버로 전송하는 과정에서 CSRF 토큰을 요구하는 문제에 직면하게 됨</li>
<li>CSRF 토큰이 없을 경우 서버에서 요청을 차단하여, 이로 인해 정상적인 데이터 전송이 불가능한 상황이 발생</li>
</ul>
<p>이 문제를 해결하기 위한 개발 과정과 방법 기록</p>
<h2 id="csrfcross-site-request-forgery">CSRF(Cross-Site Request Forgery)</h2>
<p>개념</p>
<ul>
<li>공격자 요청이 사용자의 요청인 것처럼 속이는 공격 방식</li>
<li>사용자가 특정 사이트에 로그인한 상태로 악의적인 웹 사이트에 방문하여 로그인하여 특정 사이트에 악성 요청을 보내도록 유도</li>
<li>사용자가 인증한 세션에서 웹 어플리케이션이 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용</li>
</ul>
<h3 id="csrf-보호가-필요한-이유">CSRF 보호가 필요한 이유</h3>
<ul>
<li><p>사용자가 특정 사이트에 로그인되어 있을 때, 공격자가 악성 웹사이트에 사용자를 유도하고 그 사이트에서 해당 사용자의 권한으로 로그인된 웹 애플리케이션에 요청을 보낼 수 있다.
&quot; 예를 들어, CSRF 공격은 사용자가 은행 웹사이트에 로그인되어 있을 때 공격자가 악성 요청을 보내 사용자의 계좌에서 자금을 이체하는 등의 동작을 실행할 수 있음.&quot;</p>
</li>
<li><p>CSRF는 특히 사용자에게 보이지 않는 요청을 통해 이루어지기 때문에, 사용자가 이러한 공격을 알아차리지 못할 가능성이 크다.</p>
</li>
</ul>
<h2 id="spring에서-csrf-보호-방식">Spring에서 CSRF 보호 방식</h2>
<p>Spring Security는 CSRF 공격을 방지하기 위해 기본적으로 CSRF 보호를 활성화</p>
<h4 id="동작-방식">동작 방식</h4>
<ol>
<li>CSRF 토큰 발급</li>
</ol>
<ul>
<li>사용자가 웹 애플리케이션에 접근할 때 서버는 CSRF 토큰을 발급하여 사용자에게 전달(서버가 생성한 임의의 값)</li>
<li>이 토큰은 사용자가 상태 변경 요청(POST, PUT, DELETE 등)을 보낼 때마다 함께 전송되어야 하며, HTML 폼이나 AJAX 요청의 헤더에 포함될 수 있음</li>
</ul>
<ol start="2">
<li>CSRF 토큰 검증</li>
</ol>
<ul>
<li>서버는 요청 시 전달된 CSRF 토큰이 세션에서 관리되는 토큰과 일치하는지 확인</li>
<li>일치하지 않으면 서버는 요청을 거부하고, 이를 통해 CSRF 공격을 방지할 수 있음</li>
</ul>
<h3 id="3-csrf-방어-전략">3. CSRF 방어 전략</h3>
<p>Spring Security에서 제공하는 기본적인 CSRF 보호 외에도 추가적인 방어 전략을 사용 가능</p>
<ol>
<li>쿠키 SameSite 속성: CSRF 공격을 방지하는 한 가지 방법은 쿠키에 SameSite 속성을 설정하여 해당 쿠키가 동일한 사이트에서만 전송되도록 제한하는 것</li>
<li>CORS(Cross-Origin Resource Sharing) 설정: 서버가 외부 도메인에서 온 요청을 허용하지 않도록 CORS 정책을 강력하게 설정할 수 있음.</li>
</ol>
<h2 id="문제-해결-과정">문제 해결 과정</h2>
<p>&quot; Electron 에서 서버로 데이터 전송 시 CSRF 토큰 적용 &quot;
-&gt; Spring 서버에 요청을 보내기 위해서는 CSRF 토큰을 헤더에 포함해야 하는데, 이때 기존의 인증 쿠키와 함께 전송해보자 </p>
<pre><code>const headers = {
  &#39;Cookie&#39;: cookieHeader,            // 인증 쿠키를 헤더에 포함
  &#39;Content-Type&#39;: &#39;application/json&#39;,
  [csrfHeader]: csrfToken // CSRF 토큰을 헤더에 포함
};
</code></pre><pre><code>const response = await axios.post(&#39;http://localhost: ~ &#39;, {
  status: status,
  result: message
}, { headers });</code></pre><ul>
<li>CSRF 토큰을 서버에서 발급받고, 클라이언트는 이를 헤더에 포함하여 서버로 전송.</li>
<li>CSRF 헤더 처리 : 서버로 데이터를 전송할 때 CSRF 토큰과 함께 적절한 CSRF 헤더를 설정하여 요청을 정상적으로 처리</li>
</ul>
<p>결과 : CSRF 토큰이 올바르게 전송되어 서버가 요청을 허용하고, 결과를 정상적으로 처리할 수 있음</p>
<blockquote>
</blockquote>
<p>CSRF 보호를 포함한 보안 관련 작업에서, 서버와 클라이언트 간의 인증 및 보안 절차의 중요성을 알게 된 이슈였다.
특히 CSRF와 같은 보안 위협을 방지하기 위해서는 서버에서 발급된 토큰을 적절하게 처리하고, 이를 클라이언트에서 정확히 전송하는 것이 필수로 생각하기 !</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Electron]]></title>
            <link>https://velog.io/@young_01/Electron</link>
            <guid>https://velog.io/@young_01/Electron</guid>
            <pubDate>Mon, 05 Aug 2024 08:23:09 GMT</pubDate>
            <description><![CDATA[<p>모든 설치 과정은 </p>
<h1 id="electron-이란-">Electron 이란 ?</h1>
<p>Chromium과 Node.js를 사용하여 JavaScript, HTML, CSS를 이용하여 윈도우 또는 Mac, 리눅스에서 직접 설치하여 사용할 수 있는 애플리케이션을 개발 할 수 있다. </p>
<h3 id="node-설치-확인">node 설치 확인</h3>
<p>Electron을 사용하기 위해서는 node.js가 필요하다.
-&gt; node 버전 검색을 통해 설치되어 있는 지 확인</p>
<pre><code>node -v
v20.15.0

npm -v
10.7.0</code></pre><h3 id="electron-시작하기">Electron 시작하기</h3>
<pre><code>npx create-electron-app &quot;auto&quot;</code></pre><pre><code>PS C:\Users\workspace&gt; mkdir electron-app

    Directory: C:\Users\workspace

Mode                 LastWriteTime         Length Name
d----          2024-08-06  9:02 AM                electron-app     

PS C:\Users\workspace&gt; cd electron-app
PS C:\Users\workspace\electron-app&gt; npm init
This utility will walk you through creating a package.json file.   
It only covers the most common items, and tries to guess sensible defaultefaults.

See `npm help init` for definitive documentation on these fields   
and exactly what they do.

Use `npm install &lt;pkg&gt;` afterwards to install a package and        
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (electron-app) auto-app</code></pre><p><img src="https://velog.velcdn.com/images/young_01/post/7f6bbf4d-0e25-43c5-81fc-f3648dad526f/image.png" alt=""></p>
<pre><code> npm install electron --save-dev</code></pre><p> index.js 생성</p>
<pre><code> console.log(Hello from Electron)</code></pre><pre><code> npm run start</code></pre><p> <img src="https://velog.velcdn.com/images/young_01/post/e83bf0ca-721b-4eaf-939b-b7dd14bbcdca/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git window<-> mac 차이]]></title>
            <link>https://velog.io/@young_01/Gitconfig</link>
            <guid>https://velog.io/@young_01/Gitconfig</guid>
            <pubDate>Mon, 29 Jul 2024 23:30:04 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-상황">문제 상황</h1>
<p>&quot; Windows 와 Mac, Linux(Unix) 같은 파일 사용 시에 라인 바꿈문자 문제가 생긴다. Window PC 환경과 Mac PC 환경의 차이로 협업 작업 시, 충돌이 발생한다 &quot;</p>
<h3 id="window">Window</h3>
<p>: 라인 바꿈 문자를 CR(Carrage-Return) 과 LF(Line-Feed) 문자 둘다 사용.</p>
<h3 id="maclinux">Mac&amp;Linux</h3>
<p>: 라인 바꿈 문자를 LF 만 사용.</p>
<p>Git 은 commit 시에 자동으로 CRLF -&gt; LF 변환, 반대로 checkout 시에 자동으로 LF -&gt; CRLF 변환.</p>
<pre><code>git config --global core.autocrlf true</code></pre><p>-&gt; 저장소에 커밋할 때는 자동으로 LF 로, 저장소에서 체크아웃 할 때는 자동으로 crlf(윈도우 default 방식) 으로 바꾸게된다
&lt;mac/linux&gt; </p>
<pre><code>git config --global core.autocrlf input</code></pre><p>-&gt; crlf 를 기본으로 사용하지 않으므로, 커밋 시에만 CRLF 를 LF 로 자동으로 바꾸기만 한다 (체크아웃은 LF -&gt; LF 로 변경 X)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] 특정 레포지토리만 다른 Github 계정 사용하기]]></title>
            <link>https://velog.io/@young_01/Git-%ED%8A%B9%EC%A0%95-%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC%EB%A7%8C-%EB%8B%A4%EB%A5%B8-Github-%EA%B3%84%EC%A0%95-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young_01/Git-%ED%8A%B9%EC%A0%95-%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC%EB%A7%8C-%EB%8B%A4%EB%A5%B8-Github-%EA%B3%84%EC%A0%95-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 23 Jul 2024 03:20:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>상황</strong>
회사에서 사용하는 Github계정과 개인 Github 계정을 분리</p>
</blockquote>
<p>보통 개인의 PC에</p>
<pre><code>git config --global user.name &quot;이름&quot;
git config --global user.email &quot;이메일&quot;</code></pre><p>선언을 통해 깃허브 계정을 설정해두는데,</p>
<h2 id="특정-레포지토리에-github-계정을-바꾸기">특정 레포지토리에 Github 계정을 바꾸기</h2>
<pre><code>git config --local user.name &quot;현재 레포에서 사용할 이름&quot;
git config --local user.email &quot;현재 레포에서 사용할 이메일&quot;</code></pre><p>설정 후, Push를 시도하면 -&gt;</p>
<pre><code>remote: Permission to /.git denied to ....
fatal: unable to access &quot; --- &quot; : The requested URL returned error: 403</code></pre><p>출력되면서, Push를 실패한다.</p>
<pre><code>git config --local credential.useHttpPath true
git remote set-url origin 연결하고자 하는 레포지토리 주소</code></pre><p>다시 설정하면, 원하는 계정으로 설정된 것을 알 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mac M2 VSCode <-> Git Terminal 명령어 연동]]></title>
            <link>https://velog.io/@young_01/vscode-git-%EC%97%B0%EA%B2%B0</link>
            <guid>https://velog.io/@young_01/vscode-git-%EC%97%B0%EA%B2%B0</guid>
            <pubDate>Tue, 02 Jul 2024 07:44:18 GMT</pubDate>
            <description><![CDATA[<h3 id="git-추가">Git 추가</h3>
<pre><code>$ git init</code></pre><h3 id="원격-레포지토리와-연결">원격 레포지토리와 연결</h3>
<pre><code>$ git remote add orign 깃허브주소</code></pre><h3 id="브랜치-생성-및-생성한-브랜치로-이동">브랜치 생성 및 생성한 브랜치로 이동</h3>
<pre><code>$ git branch -M main</code></pre><h3 id="현재-깃-상태-확인">현재 깃 상태 확인</h3>
<ul>
<li>현재 위치한 브랜치를 알 수 있음</li>
<li>파일들의 상태 변화 등을 알 수 있음<pre><code>$ git status</code></pre><blockquote>
<p>현재 브랜치 main
아직 커밋이 없습니다
추적하지 않는 파일: ~~</p>
</blockquote>
</li>
</ul>
<h3 id="gitignore-파일-추가">.gitignore 파일 추가</h3>
<pre><code>$ git add .gitignore</code></pre><h3 id="mac---window-충돌예방-autocrlf-설정">Mac &lt;-&gt; Window 충돌예방 autocrlf 설정</h3>
<pre><code>$ git config --global core.autocrlf input</code></pre><blockquote>
<p>&quot; warning: in the working copy of &#39;파일명&#39;, 
CRLF will be replaced by LF the next time Git touches it &quot;
같은 문구가 출력되는 것을 방지</p>
</blockquote>
<h3 id="올리고자-하는-파일-add">올리고자 하는 파일 add</h3>
<ul>
<li>해당 명령어는 모든 파일(.)을 add한다는 의미<pre><code>$ git add . </code></pre><h3 id="add한-파일들-commit">add한 파일들 commit</h3>
<pre><code>$ git commit -m &quot;커밋메세지&quot;</code></pre><h3 id="원격-레포지토리github에-push">원격 레포지토리(github)에 push</h3>
<pre><code>$ git push origin main</code></pre><blockquote>
</blockquote>
오브젝트 나열하는 중: 7, 완료.
오브젝트 개수 세는 중: 100% (7/7), 완료.
Delta compression using up to 10 threads
오브젝트 압축하는 중: 100% (7/7), 완료.
오브젝트 쓰는 중: 100% (7/7), 1.78 KiB | 1.78 MiB/s, 완료.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
To 원격 레포지토리 주소<ul>
<li>[new branch]      main -&gt; main</li>
</ul>
</li>
</ul>
<p>와 같은 문구가 나오면, Github에 업로드 성공</p>
]]></description>
        </item>
    </channel>
</rss>