<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>HighGarden</title>
    <link>https://generalcoder.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 23:43:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>하이가든</managingEditor>
    <image>
      <title>HighGarden</title>
      <url>https://tistory1.daumcdn.net/tistory/6727196/attach/eee13a9972df47649d65cc4e6dcd9b4a</url>
      <link>https://generalcoder.tistory.com</link>
    </image>
    <item>
      <title>[홈서버]내 서비스 홈서버에 배포하기 -1(통신사 포트포워딩)</title>
      <link>https://generalcoder.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.08.01 - [분류 전체보기] - [홈서버]내 서비스 홈서버에 배포하기 -0(클라우드 대신 홈서버)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723000589974&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[홈서버]내 서비스 홈서버에 배포하기 -0(클라우드 대신 홈서버)&quot; data-og-description=&quot;1. 왜&amp;nbsp; aws 대신 홈서버를 구축하는가?aws ec2를 이용해서 오라클 DB를 팀프로젝트에서 공용으로 사용했던 경험이 있다. 그 중에서도 t2.micro 제품을 사용했었는데 그 이유는 free tier로 1년간 무료로 &quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/28&quot; data-og-url=&quot;https://generalcoder.tistory.com/28&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYPAj5/hyWKIajSj7/hKnEsqkwZ3Xr3jPzkrK2dK/img.png?width=800&amp;amp;height=267&amp;amp;face=0_0_800_267,https://scrap.kakaocdn.net/dn/kO3TN/hyWKvPBHYD/id8Kk6yhAmNyu0KcKqwYk0/img.png?width=800&amp;amp;height=267&amp;amp;face=0_0_800_267,https://scrap.kakaocdn.net/dn/qdyK3/hyWKAQUGmr/ZKN5MfpF1tq4CIbRsKXgtk/img.png?width=1565&amp;amp;height=810&amp;amp;face=0_0_1565_810&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://generalcoder.tistory.com/28&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYPAj5/hyWKIajSj7/hKnEsqkwZ3Xr3jPzkrK2dK/img.png?width=800&amp;amp;height=267&amp;amp;face=0_0_800_267,https://scrap.kakaocdn.net/dn/kO3TN/hyWKvPBHYD/id8Kk6yhAmNyu0KcKqwYk0/img.png?width=800&amp;amp;height=267&amp;amp;face=0_0_800_267,https://scrap.kakaocdn.net/dn/qdyK3/hyWKAQUGmr/ZKN5MfpF1tq4CIbRsKXgtk/img.png?width=1565&amp;amp;height=810&amp;amp;face=0_0_1565_810');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[홈서버]내 서비스 홈서버에 배포하기 -0(클라우드 대신 홈서버)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 왜&amp;nbsp; aws 대신 홈서버를 구축하는가?aws ec2를 이용해서 오라클 DB를 팀프로젝트에서 공용으로 사용했던 경험이 있다. 그 중에서도 t2.micro 제품을 사용했었는데 그 이유는 free tier로 1년간 무료로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;generalcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 포트포워딩이 뭘까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈서버를 구축할 때 가장 먼저 만나는 문제는 바로 포트포워딩 문제다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;포트포워딩(Port Forwarding)&lt;/b&gt;은 네트워크에서 특정 포트로 들어오는 트래픽을 다른 네트워크의 포트나 ip주소로 전달하는 기술이다. 이 기술은 일반적으로 라우터나 방화벽에서 설정된다. &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;쉽게 풀어서 말하자면 특정 ip로 들어오는 요청을 다른 ip로 전달하는 것이 포트포워딩이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그렇다면 홈서버를 구축하는데 왜 포트포워딩이 필요할까?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그 이유는 바로 인터넷제공업체(Internet Service Prorider: ISP)와 관련이 있다. 인터넷제공업체(ISP)는 통신사를 의미하는데 우리가 주로 사용하는 sk, lg, kt등의 인터넷업체들이 바로 ISP라고 할 수 있다. ip주소는 인터넷 상에서 장치나 네트워크를 식별하는데 사용된다. ip주소는 보통 고유한 값을 가지고 있어서 인터넷제공업체에게 인터넷서비스를 구매하게 되면 하나의 ip주소가 배정되게 된다. 이때 배정되는 ip를 `공인ip`라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 우리가 실제로 인터넷을 사용하는 환경은 하나의 인터넷 회선으로 여러 대의 pc 혹은 모바일 기기등에서 인터넷을 사용하는 형태이다. 즉, 하나의 ip주소로 여러대의 pc가 인터넷을 사용하고 있다는 것이다. 어떻게 이것이 가능할까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 설치하게 되면 꼭 따라오는 것이 `공유기`다. 공유기가 하는 일은 공유기와 연결된 장비들에게 가상의 ip를 부여하고 공인ip를 통해 외부와 연결될 수 있도록 도와준다. 이 때 각각의 장비에게 부여되는 가상의 ip를 '사설ip'라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws의 ec2를 사용해보았다면 public ip와 private ip에 대해 들어본적이 있을텐데 원리는 똑같다. 외부에서 접속하려면 공인ip를 통해서 접속했던 것이 기억날 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아돌아 설명했는데 사설ip는 말그대로 실제 ip주소가 아니기 때문에 서버 pc의 ip주소만 가지고는 서비스에 접근 할 수 없다는 뜻이다. 이 때 필요한 것이 공인ip주소(실제 ip)로 들어온 요청을 내 pc의 사설 ip로 연결해주는 포트포워딩이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2. 외부 ip주소와, 내 서버의 가상ip 주소 알아보기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그럼 실제로 공인 ip주소와 내 pc의 ip주소가 다른지 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;#공인 ip주소 알아보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;네이버에서 `내 ip주소` 라고 검색하면 내 공인ip주소가 바로 나온다. 125.xxx..의 형식의 ip주소를 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip1.png&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJVNkS/btsIWuRlis4/6foL6J8wORq8lL4kTkV720/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJVNkS/btsIWuRlis4/6foL6J8wORq8lL4kTkV720/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJVNkS/btsIWuRlis4/6foL6J8wORq8lL4kTkV720/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJVNkS%2FbtsIWuRlis4%2F6foL6J8wORq8lL4kTkV720%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;292&quot; data-filename=&quot;edited_ip1.png&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 보이는 ip가 바로 ISP가 나에게 제공한 ip주소라고 할 수 있다. 외부에서 내 인터넷 네트워크에 접근하려면 이 ip주소가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#내 서버pc의 사설ip주소 알아보기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd 혹은 아무 터미널에서 `ipconfig` 이라고 입력하게 되면 ip구성에 대한 내용이 출력된다. 나같은 경우 wsl환경으로 pc를 사용중이라 두 개가 검색되는데 `이더넷 어댑터 이더넷 2` 가 내 사설 ip라고 보면 된다. IPv4와 IPv6모두 ip주소이지만 아직까지는 IPv4가 널리 쓰이고 익숙하기 때문에 IPv4로 비교하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_ip2.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQdl0I/btsIWfNHU5J/9wqBeNEA4JEBBwuYsbO3i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQdl0I/btsIWfNHU5J/9wqBeNEA4JEBBwuYsbO3i0/img.png&quot; data-alt=&quot;ipconfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQdl0I/btsIWfNHU5J/9wqBeNEA4JEBBwuYsbO3i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQdl0I%2FbtsIWfNHU5J%2F9wqBeNEA4JEBBwuYsbO3i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;491&quot; data-filename=&quot;edited_edited_ip2.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ipconfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.xxx.xxx...로 시작되는 ip주소를 볼 수 있는데 이 주소가 바로 내 pc에 공유기가 배정해 준 사설 ip이다. 같은 공유기 네트워크 안에 속해있다면 사설ip를 가지고 서로 통신이 가능하지만 외부에서는 사설ip를 식별 할 수 없기 때문에 접근이 불가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3. 통신사 포트포워딩 방법(lg u+기준)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인ip와 사설ip를 연결해주는 포트포워딩 방법에 대해서 알아보자. 현재 사용중인 인터넷이 lg u+이기 때문에 그 기준으로 설명은 하지만 다른 통신사공유기도 방법이 비슷하기 때문에 검색을 해보거나 혹은 직접 찾아서 설정을 해주어도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트포워딩을 할 때 주의해야 할 점이 하나있다. 개인이 공유기 설정을 변경하여 포트포워딩을 할 수 있도록 서비스를 제공하기는 하지만 인터넷제공업체에서 포트포워딩을 막아놓은 경우도 존재한다. 나도 kt인터넷을 사용할 때는 포트포워딩이 막혀서 제대로 기능하지 않았지만 u+로 넘어오면서 가능하게 되었다. 만약 포트포워딩을 제대로 설정했는데도 포트가 열리지 않는다면 인터넷 업체에 문의해보도록 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#공유기 설정 진입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 `ipconfig`으로 조회한 ip구성정보 사진을 보면 기본 게이트웨이라고 쓰인 곳에도 192.xx.xxx로 되어있는 것을 볼 수 있다. 나는 `192.168.219.1`인데 이 주소를 브라우저에 입력하게 되면 공유기 설정페이지로 이동한다. 각자 게이트웨이 ip주소가 다를 수 있다. 확인 후 진행하도록 하자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_router1.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch60ov/btsIWVuqJzH/0nn5QK88kCK9olMxrJV6QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch60ov/btsIWVuqJzH/0nn5QK88kCK9olMxrJV6QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch60ov/btsIWVuqJzH/0nn5QK88kCK9olMxrJV6QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch60ov%2FbtsIWVuqJzH%2F0nn5QK88kCK9olMxrJV6QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;468&quot; data-filename=&quot;edited_router1.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 페이지가 나오는데 다른 통신사는 다른 페이지가 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#로그인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유기그림을 눌러 설정페이지로 넘어가려고 하니 로그인 페이지가 나온다. 패스워드를 요구하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;login.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzJmib/btsIVLTLp4n/a6zaHKChi4GGSBKvEiYYE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzJmib/btsIVLTLp4n/a6zaHKChi4GGSBKvEiYYE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzJmib/btsIVLTLp4n/a6zaHKChi4GGSBKvEiYYE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzJmib%2FbtsIVLTLp4n%2Fa6zaHKChi4GGSBKvEiYYE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;555&quot; data-filename=&quot;login.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lg u+기준으로는 패스워드가 공유기 뒷면에 쓰여있다. 우측 아래에 관리자 웹 접속 암호라고 되어있는데 저 문자열을 패스워드에 입력하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20240807_121450728.jpg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4s54N/btsIWbdxEAV/gIp1Py26ghjkl1Ku8zDTE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4s54N/btsIWbdxEAV/gIp1Py26ghjkl1Ku8zDTE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4s54N/btsIWbdxEAV/gIp1Py26ghjkl1Ku8zDTE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4s54N%2FbtsIWbdxEAV%2FgIp1Py26ghjkl1Ku8zDTE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;933&quot; data-filename=&quot;edited_KakaoTalk_20240807_121450728.jpg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인이 성공하면 아래처럼 설정페이지에 진입이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;router2.png&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;1343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CzVvM/btsIWasf4by/ZHURUlqk9nWuE9TR9OQQa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CzVvM/btsIWasf4by/ZHURUlqk9nWuE9TR9OQQa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CzVvM/btsIWasf4by/ZHURUlqk9nWuE9TR9OQQa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCzVvM%2FbtsIWasf4by%2FZHURUlqk9nWuE9TR9OQQa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;599&quot; data-filename=&quot;router2.png&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;1343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#DHCP고정 할당&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트포워딩 전에 먼저 해야할 일이 있다. 앞서 공유기는 각각의 장비에 사설 ip를 배정해 준다고 했다. ip를 하나하나 배정하는 것이 어렵기 때문에 동적으로 ip를 배정하는 DHCP(Dynamic Host Configuration Protocol)를 사용한다. 이 때 항상 고정적으로 같은 장비에 같은 ip가 배정되는 것이 아니기 때문에 ip주소가 변경될 수 있다. 홈서버를 구축하려면 항상 같은 ip를 가지고 있어야 서비스를 안정적으로 운영할 수 있다. 때문에 DHCP를 고정할당하여 항상 같은 ip주소를 갖도록 먼저 설정 해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태정보 &amp;gt; DHCP할당정보&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;router3.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBK4C/btsIWW08vyQ/kQhD2kFkPdcCsbPjxGmRDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBK4C/btsIWW08vyQ/kQhD2kFkPdcCsbPjxGmRDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBK4C/btsIWW08vyQ/kQhD2kFkPdcCsbPjxGmRDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBK4C%2FbtsIWW08vyQ%2FkQhD2kFkPdcCsbPjxGmRDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;197&quot; data-filename=&quot;router3.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; DHCP고정할당&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_router4.png&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CY4Fd/btsIXcCEypg/LJcpE3EVroNgOJhvKHX1Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CY4Fd/btsIXcCEypg/LJcpE3EVroNgOJhvKHX1Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CY4Fd/btsIXcCEypg/LJcpE3EVroNgOJhvKHX1Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCY4Fd%2FbtsIXcCEypg%2FLJcpE3EVroNgOJhvKHX1Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;476&quot; data-filename=&quot;edited_router4.png&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 맥주소 검색 &amp;gt; 현재 pc 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_router5.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lrS2B/btsIU9grzwI/QZJt0K1ky3Zom95Bx9WBBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lrS2B/btsIU9grzwI/QZJt0K1ky3Zom95Bx9WBBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lrS2B/btsIU9grzwI/QZJt0K1ky3Zom95Bx9WBBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlrS2B%2FbtsIU9grzwI%2FQZJt0K1ky3Zom95Bx9WBBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;478&quot; data-filename=&quot;edited_router5.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; DHCP고정할당 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_router6.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btvBKC/btsIVbZB6Ds/WB15zlf9ThJodVhKCH2U11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btvBKC/btsIVbZB6Ds/WB15zlf9ThJodVhKCH2U11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btvBKC/btsIVbZB6Ds/WB15zlf9ThJodVhKCH2U11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtvBKC%2FbtsIVbZB6Ds%2FWB15zlf9ThJodVhKCH2U11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;211&quot; data-filename=&quot;edited_router6.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.xxx.xxx.103 이라는 ip를 나는 항상 배정받도록 설정을 완료했다. 이제 고정적으로 사설ip주소를 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#포트포워딩&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 포트포워딩 설정을 해보도록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크설정 &amp;gt; NAT 설정 &amp;gt; 포트포워딩&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_portforward.png&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLDla4/btsIVL0DJa4/n9KCu0krzsLBMgCKx6TA71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLDla4/btsIVL0DJa4/n9KCu0krzsLBMgCKx6TA71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLDla4/btsIVL0DJa4/n9KCu0krzsLBMgCKx6TA71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLDla4%2FbtsIVL0DJa4%2Fn9KCu0krzsLBMgCKx6TA71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;458&quot; data-filename=&quot;edited_portforward.png&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트포워딩 설정으로 들어오게 되면 다음과 같은 화면을 볼 수있다. 나는 먼저 사용중인 포트포워딩 세팅이 있기 때문에 세 개의 설정이 추가된 상태이다. 처음 포트포워딩을 한다면 아무것도 없을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 포트포워딩 추가버튼&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_portforward2.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXywI/btsIXw80CKY/r48ANKbKerzsyqGp1YPDtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXywI/btsIXw80CKY/r48ANKbKerzsyqGp1YPDtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXywI/btsIXw80CKY/r48ANKbKerzsyqGp1YPDtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXywI%2FbtsIXw80CKY%2Fr48ANKbKerzsyqGp1YPDtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;623&quot; data-filename=&quot;edited_portforward2.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*서비스포트: 외부에서 접속을 위해 사용할 포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*프로토콜 : TCP/IP 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*내부IP주소: 내 서버pc의 사설 ip 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*내부포트: 내 서버 pc에 연결될 포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 내 공인 ip가 125.123.123.123이라고 하고 내 pc에서 구동중인 서비스가 8000번 포트를 사용하고 있다고 가정해보자. 만약 외부에서 내 서비스에 접근할 때 125.123.123.123:9000 이라는 url로 접근을 하도록 하고싶다. 그렇다면 서비스 포트를 9000 내부포트를 8000으로 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정을 저장하면 1분정도 인터넷이 끊기게 된다. 이후 설정이 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#포트확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트가 실제로 열렸는지 확인하는 방법은 아래 사이트를 이용하는 방법이 있다. 실제로 서비스를 띄워서 연결이 되는지를 테스트해 볼수도 있지만 아래 방법을 사용하는 것이 훨씬 간편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.yougetsignal.com/tools/open-ports/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.yougetsignal.com/tools/open-ports/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723005813347&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Open Port Check Tool - Test Port Forwarding on Your Router&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.yougetsignal.com&quot; data-og-source-url=&quot;https://www.yougetsignal.com/tools/open-ports/&quot; data-og-url=&quot;https://www.yougetsignal.com/tools/open-ports/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.yougetsignal.com/tools/open-ports/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.yougetsignal.com/tools/open-ports/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Open Port Check Tool - Test Port Forwarding on Your Router&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.yougetsignal.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_signal.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlNRm/btsIVGd7NFv/wwAdPeAVblCRnLKHFByKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlNRm/btsIVGd7NFv/wwAdPeAVblCRnLKHFByKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlNRm/btsIVGd7NFv/wwAdPeAVblCRnLKHFByKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlNRm%2FbtsIVGd7NFv%2FwwAdPeAVblCRnLKHFByKY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;492&quot; data-filename=&quot;edited_signal.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 포트들을 테스트해 볼 수 있는데 나는 80번 포트를 상시 열어두었기 때문에 80번 port가 열려있다라는 메시지를 받았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 포트포워딩 세팅을 잘 했음에도 포트가 닫혀있다고 나오는 경우가 있다. 그런 경우에는 서버에서 포트를 사용하는 서비스가 리스닝 상태가 아니기 때문에 그렇다. 그런 경우에는 포트를 사용하는 서비스를 구동 시킨 후에 테스트해보도록 하자.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 방화벽 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 모든 방법을 모두 수행하더라도 사실 포트가 닫혀있다고 나올 것이다. 이유는 방화벽 때문이다. 방화벽은 보안을 위해서 사용하지 않는 포트로의 접근은 기본적으로 전부 차단하고 있다. 그래서 포트를 사용하려면 임의적으로 방화벽 설정을 추가해주어야 한다. 운영체제에 따라서 방화벽을 설정방법이 다르다. 나는 윈도우 기준으로 설명하겠다. 리눅스나 맥의 경우에도 검색을 해보면 크게 어렵진 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#인바운드 규칙추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 고급 보안이 포함된 Windows Defender 방화벽 &amp;gt; 인바운드 규칙&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall.png&quot; data-origin-width=&quot;1569&quot; data-origin-height=&quot;1171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIGKnG/btsIX4YvPeB/uWlIkCgfcRfbhddCSohNrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIGKnG/btsIX4YvPeB/uWlIkCgfcRfbhddCSohNrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIGKnG/btsIX4YvPeB/uWlIkCgfcRfbhddCSohNrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIGKnG%2FbtsIX4YvPeB%2FuWlIkCgfcRfbhddCSohNrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;522&quot; data-filename=&quot;firewall.png&quot; data-origin-width=&quot;1569&quot; data-origin-height=&quot;1171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`인바운드`란 내 pc로 들어오는 트래픽을 어떻게 처리할 것인지에 대한것이고 반대로 `아웃바운드`는 나가는 트래픽에 대한 설정이다. 우리는 홈서버로 들어오는 요청에 대한 설정을 할 것이기 때문에 인바운드를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 규칙종류 &amp;gt; 포트선택 &amp;gt; 다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall2.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq02JY/btsIWjbHiMw/BcmcyJThtkAbSYvrshHBH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq02JY/btsIWjbHiMw/BcmcyJThtkAbSYvrshHBH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq02JY/btsIWjbHiMw/BcmcyJThtkAbSYvrshHBH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq02JY%2FbtsIWjbHiMw%2FBcmcyJThtkAbSYvrshHBH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;507&quot; data-filename=&quot;firewall2.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 프로토콜 및 포트 &amp;gt; TCP &amp;gt; 포트번호 기입 &amp;gt; 다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall3.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFLhQ/btsIV8aySkD/fXVLOnIBa9kl0ryBDlK9g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFLhQ/btsIV8aySkD/fXVLOnIBa9kl0ryBDlK9g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFLhQ/btsIV8aySkD/fXVLOnIBa9kl0ryBDlK9g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFLhQ%2FbtsIV8aySkD%2FfXVLOnIBa9kl0ryBDlK9g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;391&quot; data-filename=&quot;firewall3.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 작업 &amp;gt; 연결허용 &amp;gt; 다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall5.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2uETZ/btsIW4LKXtH/2GPoW4cfczVrk9Jhj5KpD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2uETZ/btsIW4LKXtH/2GPoW4cfczVrk9Jhj5KpD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2uETZ/btsIW4LKXtH/2GPoW4cfczVrk9Jhj5KpD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2uETZ%2FbtsIW4LKXtH%2F2GPoW4cfczVrk9Jhj5KpD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;391&quot; data-filename=&quot;firewall5.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;프로필 &amp;gt; 다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall6.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRYhid/btsIWSrdEyB/WaxFjwOWoCMPADlMAKpAS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRYhid/btsIWSrdEyB/WaxFjwOWoCMPADlMAKpAS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRYhid/btsIWSrdEyB/WaxFjwOWoCMPADlMAKpAS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRYhid%2FbtsIWSrdEyB%2FWaxFjwOWoCMPADlMAKpAS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;392&quot; data-filename=&quot;firewall6.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;이름 &amp;gt; 이름, 설명 기입 &amp;gt; 마침버튼클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall7.png&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PlfD7/btsIXcpkgTF/qsLvR4n5YeOCzk43Kc3Ve0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PlfD7/btsIXcpkgTF/qsLvR4n5YeOCzk43Kc3Ve0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PlfD7/btsIXcpkgTF/qsLvR4n5YeOCzk43Kc3Ve0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPlfD7%2FbtsIXcpkgTF%2FqsLvR4n5YeOCzk43Kc3Ve0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;392&quot; data-filename=&quot;firewall7.png&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#인바운드 규칙 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firewall8.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3YTo/btsIVJPt2qe/m4kITKVrUIqSjGDuBkcHq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3YTo/btsIVJPt2qe/m4kITKVrUIqSjGDuBkcHq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3YTo/btsIVJPt2qe/m4kITKVrUIqSjGDuBkcHq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3YTo%2FbtsIVJPt2qe%2Fm4kITKVrUIqSjGDuBkcHq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;194&quot; data-filename=&quot;firewall8.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인바운드 규칙이 생성되면 규칙목록에서 방금 추가한 내용을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈서버 구축을 위한 가장 기초적이면서 귀찮은 부분이 끝났다. 귀찮고 어려운 부분이지만 한 번 익혀두면 네트워크에 대해서 공부할 수 있는 기회가 될 것이다. 다음 포스팅에서는 wsl을 사용해 윈도우에서 리눅스 서버환경을 구축하는 방법에 대해서 알아보도록 하자.&lt;/p&gt;</description>
      <category>만들자/홈서버만들기</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/29</guid>
      <comments>https://generalcoder.tistory.com/29#entry29comment</comments>
      <pubDate>Wed, 7 Aug 2024 14:26:50 +0900</pubDate>
    </item>
    <item>
      <title>[홈서버]내 서비스 홈서버에 배포하기 -0(클라우드 대신 홈서버)</title>
      <link>https://generalcoder.tistory.com/28</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 왜&amp;nbsp; aws 대신 홈서버를 구축하는가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws ec2를 이용해서 오라클 DB를 팀프로젝트에서 공용으로 사용했던 경험이 있다. 그 중에서도 t2.micro 제품을 사용했었는데 그 이유는 free tier로 1년간 무료로 사용 가능한 제품이 t2.micro였기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1771&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cic8c5/btsISHbUoUt/2WkRchTMQqOUXL9k4tSr40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cic8c5/btsISHbUoUt/2WkRchTMQqOUXL9k4tSr40/img.png&quot; data-alt=&quot;aws ec2 요금표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cic8c5/btsISHbUoUt/2WkRchTMQqOUXL9k4tSr40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcic8c5%2FbtsISHbUoUt%2F2WkRchTMQqOUXL9k4tSr40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;234&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1771&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;aws ec2 요금표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하면서 가장 불편했던 점은 2~3일에 한 번 쯤은 ec2서버가 다운되는 문제였다. aws는 모니터링 도구를 제공하기 때문에 문제가 뭔지 살펴볼수 있다. 모니터링에 대해서 잘은 몰랐지만 서버가 다운되는 시점에 cpu사용율이 100%에 가깝게 올라가는 현상을 발견할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진에서도 확인할 수 있다시피 t2.micro의 RAM은 1GB이다. 요즘 평범한 pc들도 RAM이 16GB는 되는데 너무 작은 용량이라 할 수 있다. 당시에는 ec2에 도커를 설치하고 컨테이너를 띄우는것만 해도 나에게는 어려운 일이었기 때문에 실제로 트래픽이나 로그를 분석할수는 없었다. 그렇지만 서버가 다운되는 원인을 예상해보자면 ec2서버를 너무 낮은 등급으로 선택해서 db로 들어오는 트래픽을 감당못하고 서버가 다운되지 않았을까싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 aws로 서비스를 배포하려면 여러개의 ec2 서버를 필요로 한다. 간단하게 생각해도 프론트, 백엔드, db 까지 적어도 3개의 서비스를 실행시킬 ec2 인스턴스가 필요하다. 게다가 t2.micro정도의 성능으로는 실제 서비스를 운용하기는 어렵기 때문에 더 높은 등급을 선택하고 ec2서버를 여러개 운용한다면 고정비용이 만만찮게 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws가 사용한만큼 돈을 지불하는 합리적인 방식을 채택하고 있지만 수익이 발생하는 서비스가 없는 나에게는 그 가격마저도 부담으로 느껴졌다. 그래서 차라리 1년치 aws비용으로 pc를 구입해서 서버를 운용해보자고 결심했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 외에도 홈서버를 구축해보는 이유가 하나 더 있다. aws에서 제공하는 편의 기능들은 사용하기엔 좋지만 기능들이 추상화 되어있어 공부하는 입장에서는 모호한 점이 많다. 때문에 실제 네트워크 설정등의 작업을 좀 더 깊이 공부하고 싶었던 나는 홈서버라는 선택을 하게 되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 어떤 pc를 선택할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버용 pc는 사실 어떤것이든 상관이 없다. 실제 수익이 발생한다면 클라우드방식이나 온프레미스 방식을 고려하여 가장 효율적인 방식을 택하겠지만 공부하는 입장에서는 굴러다니는 pc를 사용하거나 혹은 가성비 좋은 pc를 구입하면 된다. 운이 좋게도 요즘에는 값싼 중국발 mini pc들이 많다. 나도 할인기간을 이용해 n100계열의 mini pc를 구입했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1565&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec0BTS/btsIS7BnV7C/DNvKGKy3RpIyrIKhfTOOb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec0BTS/btsIS7BnV7C/DNvKGKy3RpIyrIKhfTOOb1/img.png&quot; data-alt=&quot;n100 mini firebat t8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec0BTS/btsIS7BnV7C/DNvKGKy3RpIyrIKhfTOOb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec0BTS%2FbtsIS7BnV7C%2FDNvKGKy3RpIyrIKhfTOOb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;362&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1565&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;n100 mini firebat t8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 위 제품을 RAM 16GB와 SSD 512GB 사양으로 구입했는데 알리익스프레스 할인기간을 이용해 14만원 정도에 구입했다. n100 제품은 가성비 좋기로 유명하다. 게다가 저 가격에 정품 윈도우 11인증까지 되어있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중국제라는 것이 마음에 걸리기 때문에 n100 제품을 구매한다면 사용 전 꼭 포맷을 하도록 하자. 포맷 관련 내용은 블로그나 유튜브에 많기 때문에 쉽게 따라할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 홈서버 배포를 위해 앞으로 할 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pc에 서비스를 실행하면 될 것같지만 홈서버를 구축할 때 필요한 것들이 몇 가지 있다. 다음 포스팅부터 아래와 같은 순서로 홈서버 구축을 진행할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1)포트포워딩:&lt;/b&gt; 인터넷 제공업체에서는 실제 ip주소를 제공해주지만 사용자가 인터넷을 사용할 때는 가상ip를 부여받는다. 외부에서는 실제ip로만 접근이 가능한데 가상ip가 부여된 내 pc까지 요청이 도달하려면 `포트포워딩`이라는 작업을 해주어여 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 운영체제선택 및 설치:&lt;/b&gt; 서버pc는 보통 linux운영체제를 선택한다. 오픈소스인데다가 cli방식이라 화면구현에 들어가는 리소스를 절약할 수 있어 효율적이기 때문이다. 하지만 나는 윈도우와 리눅스 환경을 둘 다 사용하고싶어 &lt;span style=&quot;color: #000000;&quot;&gt;WSL&lt;span style=&quot;text-align: left;&quot;&gt;(Windows Subsystem for Linux)로 윈도우환경에서 리눅스를 사용할 예정이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;3) 외부접속:&lt;/b&gt; 외부에서 내 홈서버에 접근할 수 있는 다양한 방식이 있다. 개발 혹은 배포를 위해서 내 서버와 상호작용하는 방법을 알아볼 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 첫번째 과정인 포트포워딩 하는 방법을 다뤄보겠다.&lt;/p&gt;</description>
      <category>만들자/홈서버만들기</category>
      <category>AWS</category>
      <category>n100 mini</category>
      <category>t8 firebat</category>
      <category>온프레미스</category>
      <category>홈서버</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/28</guid>
      <comments>https://generalcoder.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 1 Aug 2024 12:33:06 +0900</pubDate>
    </item>
    <item>
      <title>[springboot]jasypt라이브러리로 민감정보 암호화 하기(빌드, 배포, 도커)-2</title>
      <link>https://generalcoder.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.07.17 - [공부하자/Springboot] - [springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721454906310&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1&quot; data-og-description=&quot;springboot 프로젝트를 진행할 때 각종 설정정보가 저장되는 곳이 application.yml 이다. spring initilizr를 통해서 기본 프로젝트를 생성하면 application.properties로 되어있는 그 파일이다. application.yml을 사용&quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/25&quot; data-og-url=&quot;https://generalcoder.tistory.com/25&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xW6UG/hyWCLqVsM4/immvUW8TAPMZ0sIvG5x7Mk/img.png?width=597&amp;amp;height=365&amp;amp;face=0_0_597_365,https://scrap.kakaocdn.net/dn/bkTlji/hyWCM4rJd0/7JiWubIiMVmOycD6Ro3KrK/img.png?width=597&amp;amp;height=365&amp;amp;face=0_0_597_365,https://scrap.kakaocdn.net/dn/gwymd/hyWzuj2NNO/6TmmW5Z9siW4MKU7DXHn1k/img.png?width=1100&amp;amp;height=883&amp;amp;face=0_0_1100_883&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://generalcoder.tistory.com/25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xW6UG/hyWCLqVsM4/immvUW8TAPMZ0sIvG5x7Mk/img.png?width=597&amp;amp;height=365&amp;amp;face=0_0_597_365,https://scrap.kakaocdn.net/dn/bkTlji/hyWCM4rJd0/7JiWubIiMVmOycD6Ro3KrK/img.png?width=597&amp;amp;height=365&amp;amp;face=0_0_597_365,https://scrap.kakaocdn.net/dn/gwymd/hyWzuj2NNO/6TmmW5Z9siW4MKU7DXHn1k/img.png?width=1100&amp;amp;height=883&amp;amp;face=0_0_1100_883');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;springboot 프로젝트를 진행할 때 각종 설정정보가 저장되는 곳이 application.yml 이다. spring initilizr를 통해서 기본 프로젝트를 생성하면 application.properties로 되어있는 그 파일이다. application.yml을 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;generalcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;**이전글**&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에는 jasypt라이브러리를 사용해서 application.yml 파일에 담긴 민감정보를 암호화하는 방법에 대해서 알아보았다. 오늘은 암호화했던 정보를 스프링이 잘 복호화해주는지 실제 어플리케이션을 구동시켜 보며 테스트해 보고 도커 환경에서 사용하는 방법에 대해서 알아보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DB연동 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#springboot구동&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;1227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpujs2/btsIMuwMhke/HvrMYYdNtwc2dyGmswgLb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpujs2/btsIMuwMhke/HvrMYYdNtwc2dyGmswgLb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpujs2/btsIMuwMhke/HvrMYYdNtwc2dyGmswgLb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpujs2%2FbtsIMuwMhke%2FHvrMYYdNtwc2dyGmswgLb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;458&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;1227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database연동을 위해 암호화한 값들이 잘 복호화가 되었는지 어플리케이션이 성공적으로 작동하는 모습을 확인할 수 있다. 나는 예전에 만들어놓은 게시판 프로젝트를 암호화하여 테스트해보았다. db연동만 되어있는 아무 프로젝트에 테스트해 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버배포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 jasypt를 사용해 빌드한 프로젝트는 어떻게 배포하면 될까? 지금까지의 예제에서는 복호화를 할 수 있는 암호를 인텔리j라는 IDE에 저장해 놓고 사용했지만 서버환경에서는 IDE를 사용하지 않기 때문에 다른 처리가 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#서버에 프로젝트 복사&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpbLPG/btsILiDS2IU/74iGIt3fDw697Ocs6Gmw5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpbLPG/btsILiDS2IU/74iGIt3fDw697Ocs6Gmw5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpbLPG/btsILiDS2IU/74iGIt3fDw697Ocs6Gmw5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpbLPG%2FbtsILiDS2IU%2F74iGIt3fDw697Ocs6Gmw5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;174&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 `springboot-board`라는 프로젝트를 wsl(Ubuntu22.04)로 구동중인 리눅스 서버에 복사했다. 이곳에서 프로젝트 배포를 테스트해 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#build 하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 내부에 빌드관련된 도구들이 있다. 나는 gradle형식으로 빌드하고 있기 때문에 gradle과 gradlew파일이 존재하는 것을 확인할 수 있다. gradle를 실행시키면 현재 서버에 설치된 gradle 버전에 따라 빌드가 실행되고 gradlew를 실행하게 되면 프로젝트할 때 지정된 gradle버전을 자동으로 다운로드하여서 빌드를 하게 되어있다. 때문에 gradlew를 실행하면 버전차이로 인한 의존성문제를 피할 수 있다. 참고로 gradlew의 `w` 는 wrapper의 w이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 빌드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1721810825777&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./gradlew clean build&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;build1.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wV0OP/btsIMciSu5t/KkALysNpPFBpazNaPdDS1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wV0OP/btsIMciSu5t/KkALysNpPFBpazNaPdDS1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wV0OP/btsIMciSu5t/KkALysNpPFBpazNaPdDS1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwV0OP%2FbtsIMciSu5t%2FKkALysNpPFBpazNaPdDS1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;246&quot; data-filename=&quot;build1.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이미 테스트를 하며 빌드가 한번 된 상태이기 때문에 간단하게 빌드작업이 끝났다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;gradlew를 실행하려는데 다음과 같은 메시지가 발생하는 경우가 있을 수 있다.&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721810946549&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-bash: ./gradlew: /bin/sh^M: bad interpreter: No such file or directory ~~~&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위 에러가 발생하며 빌드가 진행되지 않는다면 이는 스크립트 파일이 windows 형식의 줄 바꿈 문자를 포함하기 때문에 발생하는 문제로 Unix계열 시스템에서 사용하는 줄바꿈 문자형식과의 차이때문에 발생한다. 해결방법으로는 dos2unix 패키지를 설치하여 줄바꿈 문자를 변환해 주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1721811169088&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#패키지 설치
sudo apt install dos2unix

#변환
dos2unix gradlew&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업이 완료되면 아마 빌드가 잘 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#build파일 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;build2.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beN9Yr/btsIKcdmizM/4UckfPHPSnEDYvTQSswEnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beN9Yr/btsIKcdmizM/4UckfPHPSnEDYvTQSswEnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beN9Yr/btsIKcdmizM/4UckfPHPSnEDYvTQSswEnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeN9Yr%2FbtsIKcdmizM%2F4UckfPHPSnEDYvTQSswEnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;115&quot; data-filename=&quot;build2.png&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 성공적으로 완료되었다면 프로젝트 내부에 build라는 폴더가 생성되었을 것이다. `/build/libs` 로 파일경로를 이동하면 위처럼 프로젝트명과 일치하는 `SNAPSHOT` 이 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 통해 빌드된 프로젝트를 실행할 수 있다. `springboot-board`는 내 프로젝트명이기 때문에 각자 프로젝트 명에 따라 이름이 다를 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1721811301909&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#프로젝트 구동
java -jar &amp;lt;프로젝트명&amp;gt;-0.0.1-SNAPSHOT.jar

#예시
java -jar springboot-board-0.0.1-SNAPSHOT.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;excute1.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uiyg7/btsIMbdbbpv/HCVDH4tMkdOOGk3KUQPWT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uiyg7/btsIMbdbbpv/HCVDH4tMkdOOGk3KUQPWT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uiyg7/btsIMbdbbpv/HCVDH4tMkdOOGk3KUQPWT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuiyg7%2FbtsIMbdbbpv%2FHCVDH4tMkdOOGk3KUQPWT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;396&quot; data-filename=&quot;excute1.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 잘 구동되는 듯 보이더니 `APPLICATION FAILED...`가 되면서 실행이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;execute2.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOcNQ/btsIKIXl9cM/xacKkxefzER6WLqvEM9Z80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOcNQ/btsIKIXl9cM/xacKkxefzER6WLqvEM9Z80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOcNQ/btsIKIXl9cM/xacKkxefzER6WLqvEM9Z80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOcNQ%2FbtsIKIXl9cM%2FxacKkxefzER6WLqvEM9Z80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;276&quot; data-filename=&quot;execute2.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 에러메시지를 확인해 보니 properties에 값이 없어서 발생하는 문제였다. 인텔리제이에서 실행했을 때는 IDE에서 자동으로 설정값을 넣어줬는데 직접 프로젝트를 실행하려니 그 값이 없어서 에러가 난 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#실행 시 매개변수로 넣어주기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721811807237&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1번 방법
java -jar &amp;lt;your-project-name&amp;gt;-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password

#2번 방법
JASYPT_ENCRYPTOR_PASSWORD=password java -jar &amp;lt;your-project-name&amp;gt;-0.0.1-SNAPSHOT.jar

#예시
JASYPT_ENCRYPTOR_PASSWORD=password java -jar springboot-board-0.0.1-SNAPSHOT.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서에는 두 가지 방식이 있는데 아무거나 적용해도 실행된다. 알맞은 비밀번호를 잘 기입했다면 아래처럼 실행완료 로그를 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;execute3.png&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m80a4/btsIM7uj56i/bmxyuxEMeHaqKD9HLa4BO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m80a4/btsIM7uj56i/bmxyuxEMeHaqKD9HLa4BO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m80a4/btsIM7uj56i/bmxyuxEMeHaqKD9HLa4BO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm80a4%2FbtsIM7uj56i%2FbmxyuxEMeHaqKD9HLa4BO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;253&quot; data-filename=&quot;execute3.png&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker컨테이너에서 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 자체에서 `java -jar...` 명령어를 가지고 프로젝트를 구동하는 경우도 있지만 최근에는 도커로 프로젝트를 배포하는 경우가 많기 때문에 도커에서는 환경변수를 어떻게 넣어줘야 하는지 알아보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#Dockerfile생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 최상위 경로에 Dockerfile을 생성해 준다. Dockerfile은 확장자가 따로 없기 때문에 확장자 없이 생성하면 된다. Dockerfile은 파일이 존재하는 경로를 기준으로 하위경로를 탐색하기 때문에 위치가 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721812818895&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Dockerfile생성
touch Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#Dockerfile내용작성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721812705869&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM openjdk:17-jdk-slim

WORKDIR /app

COPY build/libs/springboot-board-0.0.1-SNAPSHOT.jar /app/springboot-board-0.0.1-SNAPSHOT.jar

CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;springboot-board-0.0.1-SNAPSHOT.jar&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile내용은 가장 기본적인 내용으로 작성하였다. 이 예제는 도커 환경에서 jasypt 암호화를 적용하는 것이기 때문에 Dockerfile의 자세한 내용은 다루지 않는다. 궁금하면 공식문서를 참고하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#Docker image생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile이 생성되었다면 프로젝트를 이미지로 만들어야 한다. 도커는 이미지를 가지고 컨테이너를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1721816279524&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#이미지 빌드
docker build -t &amp;lt;image_name&amp;gt;:&amp;lt;version&amp;gt; .
#예시
docker build -t spring_jasypt:1.0 .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buildImage.png&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;1011&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CnAU6/btsILEmm8Sp/340mrek8WLCzdCdsDpD9tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CnAU6/btsILEmm8Sp/340mrek8WLCzdCdsDpD9tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CnAU6/btsILEmm8Sp/340mrek8WLCzdCdsDpD9tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCnAU6%2FbtsILEmm8Sp%2F340mrek8WLCzdCdsDpD9tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;559&quot; data-filename=&quot;buildImage.png&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;1011&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드과정이 정상적으로 수행되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;createdImage.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/81Blw/btsIKFTSIne/qGctCJ9xkxcmcSAuxunP6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/81Blw/btsIKFTSIne/qGctCJ9xkxcmcSAuxunP6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/81Blw/btsIKFTSIne/qGctCJ9xkxcmcSAuxunP6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F81Blw%2FbtsIKFTSIne%2FqGctCJ9xkxcmcSAuxunP6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;218&quot; data-filename=&quot;createdImage.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`docker images` 명령어를 쳐보면 이미지가 생성된 모습을 확인가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#docker-compose.yml 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지만 가지고도 컨테이너를 실행할 수 있으나 `docker-compose`로 컨테이너를 관리하면 매우 편리하다. 보통 여러 개의 컨테이너를 다룰 때 사용하지만 그 외에 설정도 편하게 할 수 있기 때문에 docker-compose를 사용하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1721816020837&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  spring-boot:
    container_name: gaden_spring
    build:
      context: ~/springboot-board
      dockerfile: Dockerfile
    image: spring_jasypt:1.0
    environment:
      JASYPT_ENCRYPTOR_PASSWORD: &amp;lt;your_password&amp;gt;
    ports:
      - &quot;8080:8080&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`environment`에서 편하게 설정변수를 넣어줄 수 있다. `your_password`라고 쓰여있는 곳에 jasypt 복호화 비밀번호를 적어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#docker-compose 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose.yml 작성이 완료되었다면 이제 docker-compose를 통해 컨테이너를 실행시켜 보자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721816548603&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#docker-compose실행
docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;docker-compose.png&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpvNxR/btsIMaeejbv/HkgMyPHjkKzvb0dddbBXfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpvNxR/btsIMaeejbv/HkgMyPHjkKzvb0dddbBXfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpvNxR/btsIMaeejbv/HkgMyPHjkKzvb0dddbBXfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpvNxR%2FbtsIMaeejbv%2FHkgMyPHjkKzvb0dddbBXfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;330&quot; data-filename=&quot;docker-compose.png&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컴포즈가 관리하는 컨테이너목록이 출력된다. 현재는 하나의 컨테이너만 등록했기 때문에 하나만 보인다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dockerrun.png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmcvH0/btsIJ98Jlz1/ZbqDkG1iZiyJzQOOPILI4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmcvH0/btsIJ98Jlz1/ZbqDkG1iZiyJzQOOPILI4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmcvH0/btsIJ98Jlz1/ZbqDkG1iZiyJzQOOPILI4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmcvH0%2FbtsIJ98Jlz1%2FZbqDkG1iZiyJzQOOPILI4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;155&quot; data-filename=&quot;dockerrun.png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 `docker ps` 명령어로 컨테이너가 실행되는지 확인해 보자. 잘 구동된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jasypt라이브러리를 프로젝트에 반영하여 테스트해보고 그다음에는 서버에서 빌드, 배포해 보았다. 마지막으로는 도커환경에서 어떻게 적용하는지 까지 살펴보았는데 비단 jasypt 라이브러리뿐 만 아니라 다른 환경변수 혹은 설정변수들을 위와 같은 환경에서 어떻게 적용하는지 알 수 있는 기회가 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/Springboot</category>
      <category>build</category>
      <category>Docker</category>
      <category>docker-compose</category>
      <category>jasypt</category>
      <category>환경변수</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/27</guid>
      <comments>https://generalcoder.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 24 Jul 2024 19:30:06 +0900</pubDate>
    </item>
    <item>
      <title>[springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1</title>
      <link>https://generalcoder.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;springboot 프로젝트를 진행할 때 각종 설정정보가 저장되는 곳이 application.yml 이다. spring initilizr를 통해서 기본 프로젝트를 생성하면 application.properties로 되어있는 그 파일이다. application.yml을 사용하던 application.properties를 사용하던 상관은 없다. 데이터 형식만 약간 달라질 뿐 근본은 똑같기 때문이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dwg4n/btsICwIy7Qy/tTp1ECKlN4O4f346vYIhK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dwg4n/btsICwIy7Qy/tTp1ECKlN4O4f346vYIhK1/img.png&quot; data-alt=&quot;application.yml 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dwg4n/btsICwIy7Qy/tTp1ECKlN4O4f346vYIhK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDwg4n%2FbtsICwIy7Qy%2FtTp1ECKlN4O4f346vYIhK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;365&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;application.yml 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일에는 db정보 같은 민감한 내용들이 기입되는데 내용이 db환경과 일치하지 않으면 springboot프로젝트가 구동되지 않는다. 그만큼 중요한 역할을 하는 파일이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;종종 git을 통해 협업을 하다보면 이 파일로 인한 문제가 발생한다. github에 프로젝트를 push 하게 되면 이 파일도 함께 원격저장소에 업로드 되는데 이 것은 공개적으로 민감정보가 웹상에 노출된다는 의미이다. 때문에 이를 해결하기 위한 가장 간단한 방법은 git ignore파일에 해당 application.yml파일을 등록하여 git이 push 할 때 이 파일을 제외하도록 하는 방법이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이 방법은 협업자들이 각자 application.yml파일의 사본을 가지고 있고 나머지 코드만 push하여 application.yml파일은 원격레포지토리에 업로드 되지 않도록 하는 방식이다. 원천적으로 파일을 올리지 않기 때문에 보안상 강력한 방법이다. 또한 설정파일은 프로젝트 초반 세팅시 건드리고 크게 수정할 일이 없을 뿐더러 혹여나 변경사항이 있더라도 그 정도는 감수할 만 하다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;최근 팀 프로젝트를 하나 시작했는데 이번에도 gitignore방식을 채택해서 프로젝트 관리를 하려고 하였으나 생각지도 못한 문제가 발생한다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이번 프로젝트에서는 CI/CD를 도입하여 자동화까지 하려는 것이 목적이었다. jenkins로 github에서 소스코드를 받아와 자동으로 빌드하도록 구성하려니 application.yml파일이 존재하지 않기 때문에 빌드와 배포가 정상적으로 수행되지 않았다. 때문에 이를 해결하기 위해서 application.yml파일을 빌드 시에 소스코드에 삽입해주는 등의 과정이 필요해졌다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이 문제를 해결하기 위해 떠올린 방법은 아래 세가지이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;-첫번째, jenkins컨테이너 내부에 application.yml파일을 저장해놓고 빌드시에 넣어준다.&lt;br&gt;&amp;nbsp;&lt;br&gt;-두번째, ssh 접속을 통해 서버 pc에 접근하고 이 곳에서 git pull을 받아서 빌드, 도커이미지화, 배포한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;-세번째, application.yml파일을 애초에 소스코드에 포함시킨다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;첫번째 방식&lt;/b&gt;은 jenkins컨테이너가 자체적으로 application.yml파일을 가지고 있다가 빌드시에 넣어주는 방식이다. jenkins는 강력한 도구들을 제공하고 있기 때문에 이 방식이 크게 어렵진 않으나 컨테이너가 어플리케이션의 정보를 가지고 있는다는 것이 마음에 안들었다. jenkins는 CI/CD역할만 해주면 되는데 어플리케이션과 의존관계가 생기기 때문이다. java코드에서만 의존성을 느슨하게 하는것이 중요한 것이 아니다. 컨테이너 간에도 의존성이 강해지게 되면 도커를 사용해 서비스를 분리하는 것이 큰 의미가 없기 때문이다. 그래서 이 방법은 패스했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;두번째 방식&lt;/b&gt;은 jenkins파이프라인에서 내 로컬 pc에 접근해서 git pull을 받는 방식이다. 기존 로컬 프로젝트에는 application.yml 파일이 존재할테니 ssh접속으로 로컬 pc에 접근하여 git pull부터 빌드, 도커이미지화, 배포를 차례차례진행하는 방식이다. 이 방법도 github의 소스코드를 받아와서 빌드해주는 jenkins의 기능을 사용하지 않고 로컬 pc에서 모든것을 진행하는 방식이라 마음에 들지 않았다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;마지막으로 세번 째 방식&lt;/b&gt;은 &quot;그렇다면 아예 application.yml파일을 빼지 않는 방법은 없을까?&quot; 라는 고민을 하다가 찾게된 방식이다. 파일은 github에 공개되지만 그 내용들을 암호화하게 되면 파일이 올라가도 크게 상관이 없기 때문에다. 게다가 application.yml파일이 없어서 빌드가 정상적으로 되지 않던 기존의 문제도 해결할 수 있다. 또한 설정파일을 하나의 저장소에서 관리하면 변경이 있을때마다 협업자들이 내용을 수동으로 각각수정할 필요도 없다.&lt;br&gt;&amp;nbsp;&lt;br&gt;그래서 이번 포스팅에서는 springboot 프로젝트에 적용할 수 있는 `jasypt` 라이브러리를 이용해서 민감 정보를 암호화하는 방법을 다뤄보겠다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;JASYPT&lt;/h2&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jasypt라이브러리란?&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://github.com/ulisesbocchio/jasypt-spring-boot&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gcKyM/hyWzpvSNvS/EdurzSl91dFjsIlMAWObI0/img.png?width=1200&amp;amp;height=600&amp;amp;face=980_127_1043_196&quot; data-og-url=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot;&gt;&lt;a href=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gcKyM/hyWzpvSNvS/EdurzSl91dFjsIlMAWObI0/img.png?width=1200&amp;amp;height=600&amp;amp;face=980_127_1043_196')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;jasypt라이브러리는 민감정보의 암호화를 해주는 라이브러리로 springboot환경에서 매우 편리하게 적용할 수 있다. 위 프로젝트의 README에 사용법이 매우 쉽게 설명되어있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;jasypt로 검색하면 많은 블로그 포스팅이 나오는데 복사 붙여넣기 한 것처럼 내용이 똑같고 틀린 부분도 똑같이 공유하고 있기 때문에 왠만하면 공식문서를 참조하는 것이 좋을 것이다. 나도 블로그를 보며 실행해보는데 암만해도 복호화가 되지 않아 몇시간 동안 헤메다가 공식문서를 보고 1분만에 문제를 해결했다.&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;의존성 추가&lt;/h3&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;	implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;나는 빌드방식을 gradle로 선택했기 때문에 위 코드를 build.gradle파일에 붙여넣어준다. 의존성이 추가되면 항상 gradle새로고침을 통해 의존성을 반영하도록 해준다.&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;Config파일 생성, application.yml에 설정추가&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 프로젝트 적당한 위치에 JasyptConfig라는 파일을 하나 생성해준다. gradle에 의존성이 잘 추가되었다면 import가 정상적으로 잘 될것이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;#JasyptConfig.java&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Value(&quot;${jasypt.encryptor.password}&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private String KEY;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Bean(name = &quot;jasyptStringEncryptor&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public StringEncryptor stringEncryptor(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SimpleStringPBEConfig config = new SimpleStringPBEConfig();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setPassword(KEY);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setPoolSize(&quot;1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setAlgorithm(&quot;PBEWithMD5AndDES&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setStringOutputType(&quot;base64&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setKeyObtentionIterations(&quot;1000&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.setSaltGeneratorClassName(&quot;org.jasypt.salt.RandomSaltGenerator&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptor.setConfig(config);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return encryptor;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;@Value(&quot;$jasypt.encryptor.password&quot;): application.yml파일에서 해당하는 값을 가져온다. 이 값이 암호화와 복호화를 위해 사용되는 password이고 개발자가 잘 관리해야 하는 값이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;stringEncryptor 메서드내부에서는 암호화방식을 설정해준다. 알고리즘 방식이나 출력형식등이 세팅된다. 세부적인 세팅을 하려면 공식문서를 참조하도록 하자.&lt;br&gt;&amp;nbsp;&lt;br&gt;#application.yml&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;spring:
&amp;nbsp;&amp;nbsp;datasource:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driver-class-name: com.mysql.cj.jdbc.Driver
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url: jdbc:mysql://localhost:3306/highgarden_db?serverTimezone=Asia/Seoul&amp;amp;characterEncoding=UTF-8
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username: highgarden
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password: 1234

#jasypt 설정
jasypt:
&amp;nbsp;&amp;nbsp;encryptor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bean: jasyptStringEncryptor
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password: your_password&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 위처럼 db정보가 기입되어 있을텐데 아래에 jqsypt관련 설정을 추가해준다. bean에서 `jasyptStringEncryptor`라고 되어있는 부분은 위에서 JasyptConfig에서 등록한 bean의 이름이다. 두 이름이 일치해야 한다. password는 Config에서 @Value 어노테이션으로 가져와서 암호화와 복호화에 사용하게 될 비밀번호이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;#SpringbootBoardApplication.java&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableEncryptableProperties //꼭 추가해주도록 한다.
public class SpringbootBoardApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootBoardApplication.class, args);
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;블로그만 보다가 한참 헤메었던 부분이 바로 이곳인데 @EnableEncryptableProperties라는 어노테이션을 프로젝트 main메서드가 있는 클래스에 추가해주어야 한다. 이 어노테이션을 추가해주지 않으면 런타임 상태에서 암호화된 설정값들을 자동으로 스프링이 변환해주지 않아서 복호화가 되지 않는다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;인텔리제이 addVM options에 비밀번호 추가&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 jasypt를 사용하는 이유가 민감정보를 암호화시키려는 목적이라고 했다. 하지만 현재 application.yml파일에는 암복호화를 위한 password가 노출되어 있는 상태이다. 마치 자물쇠와 열쇠를 함께 두는 꼴이나 마찬가지다. password와 암호화 방식만 알면 문자열을 복호화하는 것은 식은죽 먹기이기 때문에 password는 소중하게 보관해야 하는 중요한 정보이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;인텔리제이에서는 설정파일의 값을 동적으로 넣어주는 옵션이 있다. 이를 이용해 application.yml파일에 비밀번호가 노출되지 않은 상태에서도 어플리케이션을 구동할 수 있다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;-Run -&amp;gt; Edid Configurations -&amp;gt; SpringBoot 프로젝트 -&amp;gt; Modify Options -&amp;gt; Add VM options&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umdpX/btsIDIVR5O3/hudsx92f3keZkN0tUpHZs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umdpX/btsIDIVR5O3/hudsx92f3keZkN0tUpHZs0/img.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;883&quot; style=&quot;width: 43.3625%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umdpX/btsIDIVR5O3/hudsx92f3keZkN0tUpHZs0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumdpX%2FbtsIDIVR5O3%2Fhudsx92f3keZkN0tUpHZs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1100&quot; height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKfQD4/btsICn6rbww/x4oDrk22EssJuvbqSQadv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKfQD4/btsICn6rbww/x4oDrk22EssJuvbqSQadv0/img.png&quot; data-origin-width=&quot;1675&quot; data-origin-height=&quot;1051&quot; style=&quot;width: 55.4747%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKfQD4/btsICn6rbww/x4oDrk22EssJuvbqSQadv0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKfQD4%2FbtsICn6rbww%2Fx4oDrk22EssJuvbqSQadv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1675&quot; height=&quot;1051&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;위와같이 VM 옵션을 사용하도록 설정해주고 다음과 같이 값을 추가해준다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;-Djasypt.encryptor.password=your_password&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;-D를 쓴다음 property이름과 값을 적어준다. 나는 앞서 application.yml파일의&amp;nbsp; encryptor password를 `your_password`로 했기 때문에 같은 값을 적어준다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X4a00/btsIDuwLIdL/fDnXSUp8IlhmGWLWa2HsQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X4a00/btsIDuwLIdL/fDnXSUp8IlhmGWLWa2HsQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X4a00/btsIDuwLIdL/fDnXSUp8IlhmGWLWa2HsQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX4a00%2FbtsIDuwLIdL%2FfDnXSUp8IlhmGWLWa2HsQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;208&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;*만약 이 설정값을 test에서도 사용하고 싶다면 Gradle의 Test에서 사용할 수 있도록 추가해주어야 한다.&amp;nbsp; Test코드에서는 본 프로젝트의 설정값을 가져오려면 시점문제를 고려하는 등의 귀찮은 작업이 필요하기 때문에 여기서도 그냥 추가해준다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdisVt/btsIDeAYpQv/oxux4oXgCkxQB7805bk6G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdisVt/btsIDeAYpQv/oxux4oXgCkxQB7805bk6G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdisVt/btsIDeAYpQv/oxux4oXgCkxQB7805bk6G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdisVt%2FbtsIDeAYpQv%2Foxux4oXgCkxQB7805bk6G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;436&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;#build.gradle&lt;br&gt;마지막으로 다음과 같은 설정도 build.gradle에 추가해주면 테스트코드에서 System.getProperty()메서드로 IDE에 저장된 설정값을 가져올 수 있다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;tasks.named('test') {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useJUnitPlatform()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;systemProperty &quot;jasypt.encryptor.password&quot;, System.getProperty(&quot;jasypt.encryptor.password&quot;)
}
 &lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;암호화 문자열생성하기&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;복잡한 설정이 끝났으니 이제 테스트코드로 암복호화를 테스트해보자.&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import org.assertj.core.api.Assertions;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class JasyptTest {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String encryptKey;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Test
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void jasypt(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptKey = System.getProperty(&quot;jasypt.encryptor.password&quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String url = &quot;jdbc:mysql://localhost:3306/highgarden_db?serverTimezone=Asia/Seoul&amp;amp;characterEncoding=UTF-8&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String username = &quot;highgarden&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String password = &quot;1234&quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String encryptUrl = jasyptEncrypt(url);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String encryptUsername = jasyptEncrypt(username);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String encryptPassword = jasyptEncrypt(password);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String decryptUrl&amp;nbsp;&amp;nbsp;= jasyptDecryt(encryptUrl);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String decryptUsername&amp;nbsp;&amp;nbsp;= jasyptDecryt(encryptUsername);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String decryptPassword&amp;nbsp;&amp;nbsp;= jasyptDecryt(encryptPassword);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;encryptUrl : &quot; + encryptUrl);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;encryptUsername : &quot; + encryptUsername);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;encryptPassword : &quot; + encryptPassword);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;decryptUrl : &quot; + decryptUrl);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;decryptUserName : &quot; + decryptUsername);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;decryptPassword : &quot; + decryptPassword);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assertions.assertThat(url).isEqualTo(jasyptDecryt(encryptUrl));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private String jasyptEncrypt(String input) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptor.setAlgorithm(&quot;PBEWithMD5AndDES&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptor.setPassword(encryptKey);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return encryptor.encrypt(input);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private String jasyptDecryt(String input){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptor.setAlgorithm(&quot;PBEWithMD5AndDES&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encryptor.setPassword(encryptKey);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return encryptor.decrypt(input);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;System.getProperty(&quot;jasypt.encryptor.password&quot;) 메서드로 인텔리제이 IDE에 저장한 비밀번호 설정값(`your_password`)을 가져온다. 암호화 하려는 문자열들을 선언하고 암호화해서 콘솔에 출력하고 다시 복호화 해서 출력하는 코드이다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BCYbB/btsICkPuT1f/Nt03RhJWdh7DkSmTyfxr3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BCYbB/btsICkPuT1f/Nt03RhJWdh7DkSmTyfxr3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BCYbB/btsICkPuT1f/Nt03RhJWdh7DkSmTyfxr3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBCYbB%2FbtsICkPuT1f%2FNt03RhJWdh7DkSmTyfxr3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;281&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 설정이 잘 수행되었다면 다음과 같이 콘솔에 문자열이 출력될 것이다. 우리가 사용할 것은 암호화 된 문자열들이다. 이 문자열을 드래그 해서 application.yml에 복사하도록 하자.&lt;br&gt;&amp;nbsp;&lt;br&gt;#application.yml&lt;br&gt;&amp;nbsp;&lt;br&gt;암호화된 문자열을 스프링이 인지하려면 특별한 형식으로 적어주어야 한다. `ENC(암호화된문자열)` 의 형태로 적어주면 런타임시에 자동으로 스프링이 암호화된 문자열을 복호화하여 설정값으로 사용한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;spring:
&amp;nbsp;&amp;nbsp;datasource:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hikari:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maximum-pool-size: 4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url: ENC(LPpesE/vPteqNciOcNNKXDsPvpHXGOy7UMWM7kIobDaWrXj6Pd44ruX34rw0lee3TnVXy2yDSQXuLIac4Eu3cggKfGtw7DO0+UVDtGSZvVBpiOOERwvf0ggpVHPFsRT8POlgn+N0WtsD9eOlluSf+A==)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username: ENC(cIRCqV5zMSICi6JjCPvwZzF0tpN05mbe)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password: ENC(M8tjFMWjs3f/E6nJFBQRTPRi2zAqtZ8096fI8RV/ldc=)

#jasypt 설정
jasypt:
&amp;nbsp;&amp;nbsp;encryptor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bean: jasyptStringEncryptor&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;jasypt라이브러리를 이용해 암호화와 복호화가 작동하는지 테스트 해보았다. 하지만 위 테스트코드로는 런타임시에 db와의 연동이 잘 이루어지는지 테스트할 수 없다. 실제로 스프링이 복호화를 잘 수행하여 연동을 잘 마치는지 테스트 해보려면 실제 어플리케이션을 구동해보아야 한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;다음 시간에는 암호화된 설정파일로 db와 연동을 해보고 docker환경에서는 동적으로 설정값을 어떻게 넣어주는지 알아보겠다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/Springboot</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/25</guid>
      <comments>https://generalcoder.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 17 Jul 2024 15:54:22 +0900</pubDate>
    </item>
    <item>
      <title>[git] 로컬 Ubuntu에 git 설치하고 토큰으로 로그인하기 (github pat토큰 발급 및 인증방법)</title>
      <link>https://generalcoder.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하다 보면 git은 꼭 사용하게 된다. 협업을 할 때나 혹은 오픈소스를 클론 해서 사용하는 등 개발자와는 뗄 수 없는 도구라고 할 수 있다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;최근 홈서버를 구성하기 위해 pc에 리눅스를 설치하고 CI/CD 환경을 구축하려고 하니 기존의 github 아이디를 이용해 다른 pc에서 작업해야 하는 상황이 발생했다. 프로젝트를 클론하고 수정하려는데 레포지토리 수정에 대한 권한이 없다는 permission deny가 발생했다. 이전 pc에서는 깃허브 아이디와 비밀번호만 가지고도 사용자 확인이 되었던 것 같은데 최근에 보안정책이 바뀌었다고 하는 것 같다.&lt;br&gt;&amp;nbsp;&lt;br&gt;인증방법에는 세 가지가 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt; 첫 번째, 깃허브 아이디를 컨트리뷰터로 등록하는 방법&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;이 것은 깃허브에 등록된 이메일이나 아이디를 등록하는 방식으로 공동 기여자가 되는 방식인데 나는 하나의 아이디로 여러 로컬 pc에서 작업하길 원했기 때문에 이 방법은 고려하지 않았다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;두 번째, SSH를 통해 인증키를 등록하는 방법&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;처음에 ssh로 인증을 하기 위해 open-ssh 패키지로 공개키를 생성하여 깃허브에 등록해 보았으나 알 수 없는 오류로 실행이 되지 않았다. ssh방식은 레퍼런스도 많지 않아 트러블 슈팅도 쉽지 않아 다음 방법을 시도해 보게 되었다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;세 번째, pat(personal access token) 토큰을 사용하는 방법&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;차선으로 선택한 pat토큰은 사용자의 깃허브 설정탭에서 생성할 수 있다. 토큰은 문자열로 이루어져 있고 이 토큰을 보관하고 있다가 git에 원격으로 push 등의 작업을 요청할 때 토큰을 함께 보내게 되면 그 토큰으로 사용자를 식별하게 된다. 발급도 간단하고 사용법도 매우 간단했다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;그래서 오늘은 아래의 순서로 git설치부터 시작해서 pat토큰을 사용하는 방법까지 다뤄보려 한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;1. Ubuntu에 깃 설치&lt;br&gt;2. 로컬 사용자 등록하기&lt;br&gt;3. pat 토큰 발급 및 환경변수 등록&lt;br&gt;4. 레포지토리 클론&lt;br&gt;5. 소스코드 변경 및 push&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;pat토큰 인증&lt;/h2&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Ubuntu에 깃 설치&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스가 편한 점은 패키지 이름만 알고 있으면 너무나 쉽게 설치할 수 있다는 점이다. 윈도우 환경에서 git을 설치할 때도 크게 어려운 점은 없었지만 리눅스는 그보다 훨씬 편하다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#git 설치
sudo apt install git

#git 버전확인
git --version&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cox5uJ/btsItP3wtmE/CMZnWXuRPfnhVSlp3JCTkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cox5uJ/btsItP3wtmE/CMZnWXuRPfnhVSlp3JCTkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cox5uJ/btsItP3wtmE/CMZnWXuRPfnhVSlp3JCTkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcox5uJ%2FbtsItP3wtmE%2FCMZnWXuRPfnhVSlp3JCTkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;277&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 git이 이미 깔려 있어서 설치작업이 매우 간편하게 끝났다. 이미 최신버전이라는 안내문이 나오는 것을 확인할 수 있다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beQyjb/btsIuruiwhz/DL2qeYKgBI8mFtQYFVFKck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beQyjb/btsIuruiwhz/DL2qeYKgBI8mFtQYFVFKck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beQyjb/btsIuruiwhz/DL2qeYKgBI8mFtQYFVFKck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeQyjb%2FbtsIuruiwhz%2FDL2qeYKgBI8mFtQYFVFKck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;172&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전체크를 통해 git이 잘 설치되었는지 확인해보자.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 로컬 사용자 등록하기&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;깃을 설치하면 로컬 사용자명과 이메일을 등록해주어야 한다. 사용자 등록 없이 작업을 시도하려고 하면 아래와 같은 메시지가 출력되는데 &quot;Please tell me who you are.&quot; 라며 사용자를 등록하라고 한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9nIHB/btsIv6WxFyT/AwMWH9EpwVXzC0dhTqWBZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9nIHB/btsIv6WxFyT/AwMWH9EpwVXzC0dhTqWBZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9nIHB/btsIv6WxFyT/AwMWH9EpwVXzC0dhTqWBZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9nIHB%2FbtsIv6WxFyT%2FAwMWH9EpwVXzC0dhTqWBZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;172&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#로컬사용자 아이디등록
git config --global user.name &quot;&amp;lt;사용자 id&amp;gt;&quot;

#로컬사용자 이메일등록
git config --global user.email &quot;&amp;lt;사용자 email&amp;gt;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 이용해 사용자를 등록해 주도록 한다. 어차피 pat 토큰을 이용해 사용자 인증이 되기 때문에 사용자명은 아무렇게나 해도 크게 상관없는 듯하다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) pat토큰 발급 및 환경변수 등록&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;#settings&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;1031&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5Szl/btsIuae9BOh/H3TL97PMmyevOgwVnQ4OoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5Szl/btsIuae9BOh/H3TL97PMmyevOgwVnQ4OoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5Szl/btsIuae9BOh/H3TL97PMmyevOgwVnQ4OoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5Szl%2FbtsIuae9BOh%2FH3TL97PMmyevOgwVnQ4OoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;547&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;1031&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 위에 사용자를 클릭하면 사이드바가 노출된다. 여기서 `settings`를 선택한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#Developer settings&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;1369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJRNW/btsIvsltoXU/6RKC8rcq9jcXGrMJ3afAJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJRNW/btsIvsltoXU/6RKC8rcq9jcXGrMJ3afAJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJRNW/btsIvsltoXU/6RKC8rcq9jcXGrMJ3afAJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJRNW%2FbtsIvsltoXU%2F6RKC8rcq9jcXGrMJ3afAJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;651&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;1369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같은 설정화면이 나오는데 여기서 왼쪽 사이드바 맨 아래쪽에 `Developer settings`를 클릭한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#Tokens(classic)&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKbjRg/btsIuv4sLVH/jd1KbIgDkHMkqqbKwUWVck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKbjRg/btsIuv4sLVH/jd1KbIgDkHMkqqbKwUWVck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKbjRg/btsIuv4sLVH/jd1KbIgDkHMkqqbKwUWVck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKbjRg%2FbtsIuv4sLVH%2Fjd1KbIgDkHMkqqbKwUWVck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;213&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 화면이 이동되는데 여기서 Personal access token -&amp;gt; Token(classic)를 클릭한다. 새로운 버전은 beta버전이기 때문에 검증된 classic 버전을 사용하도록 하겠다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;#token설정&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QubOD/btsIt3HeuO3/MkSpyeMhlcHgdB5awhzLg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QubOD/btsIt3HeuO3/MkSpyeMhlcHgdB5awhzLg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QubOD/btsIt3HeuO3/MkSpyeMhlcHgdB5awhzLg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQubOD%2FbtsIt3HeuO3%2FMkSpyeMhlcHgdB5awhzLg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;356&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Note: 토큰이름&lt;br&gt;*Expiration: 토큰의 유효기간이다. 상황에 맞게 설정해 주도록 한다. 나는 로컬 pc에서만 사용할 예정이기 때문에 No exporation을 선택했다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GHIfY/btsIvxtrBcW/QnHkbhIP2UeWD3IDD8IlR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GHIfY/btsIvxtrBcW/QnHkbhIP2UeWD3IDD8IlR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GHIfY/btsIvxtrBcW/QnHkbhIP2UeWD3IDD8IlR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGHIfY%2FbtsIvxtrBcW%2FQnHkbhIP2UeWD3IDD8IlR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;678&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 `Select scopes`라는 탭이 매우 복잡해 보이는데 다양한 권한을 부여할 수 있는 기능이다. 내가 사용할 기능은 레포지토리에 접근하고 수정만 하면 되기 때문에 `repo`탭만 체크를 해주고 나머지는 그대로 둔다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8j24c/btsIvbdd3a3/zjPLB4SsfyYMEVt0eZZZN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8j24c/btsIvbdd3a3/zjPLB4SsfyYMEVt0eZZZN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8j24c/btsIvbdd3a3/zjPLB4SsfyYMEVt0eZZZN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8j24c%2FbtsIvbdd3a3%2FzjPLB4SsfyYMEVt0eZZZN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;567&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 `Generation token` 버튼을 누르면 토큰이 생성된다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#token 생성 완료&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU8jgH/btsIvzSkcAn/0vpVWBQZUjW2Dvyl76sKhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU8jgH/btsIvzSkcAn/0vpVWBQZUjW2Dvyl76sKhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU8jgH/btsIvzSkcAn/0vpVWBQZUjW2Dvyl76sKhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU8jgH%2FbtsIvzSkcAn%2F0vpVWBQZUjW2Dvyl76sKhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;212&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초록색 바탕에 문자열이 나온다. 이 문자열이 바로 토큰인데 ghp_...으로 시작하는 것 보면 GitHubToken의 줄임말이 아닐까 한다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이때 주의해야 할 점은 안내문에도 있다시피 이 문자열은 처음에 딱 한 번만 발급되고 페이지를 벗어나게 되면 다시는 확인이 불가능하다. 때문에 파일에 저장해 놓는 등으로 따로 보관을 해야 한다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;나는 토큰을 저장도 하면서 사용도 편하도록 하기 위해 우분투의 환경변수로 토큰을 저장해 주었다. 우분투에서 환경변수에 등록하는 방법은 아래 방법을 따르면 된다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#.bashrc파일 수정하기
vim ~/.bashrc

#환경변수에 토큰 등록하기
export GITHUB_TOKEN=&quot;&amp;lt;your PAT token&amp;gt;&quot;

#변경내역 적용
source ~/.bashrc

#환경변수 출력해보기
echo $GITHUB_TOKEN&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;일단 `vi`나 `nano`, `vim` 등 어떤 편집기라도 상관없으니 편집기를 사용하여 `. bashrc`파일을 연다.&lt;br&gt;참고로 리눅스 환경에서는 파일명 앞에 `.` 이 들어가 있으면 숨김파일이라는 뜻이다. 숨김파일을 조회해 보려면 `ls` 명령어에 `-al` 옵션을 붙이면 모든 파일을 조회 가능하다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CV7fj/btsIu79SXMR/KKUfIXMRtgJezKpwt5L8r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CV7fj/btsIu79SXMR/KKUfIXMRtgJezKpwt5L8r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CV7fj/btsIu79SXMR/KKUfIXMRtgJezKpwt5L8r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCV7fj%2FbtsIu79SXMR%2FKKUfIXMRtgJezKpwt5L8r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;308&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`. bashrc` 파일 내부는 다음과 같이 생겼는데 맨 아래쪽에 환경변수를 추가해 준다. 아까 받은 토큰 문자열을 넣어주면 된다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCod0Q/btsIvRrMedW/VTn54pyUckn8XBZforzOp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCod0Q/btsIvRrMedW/VTn54pyUckn8XBZforzOp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCod0Q/btsIvRrMedW/VTn54pyUckn8XBZforzOp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCod0Q%2FbtsIvRrMedW%2FVTn54pyUckn8XBZforzOp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;157&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일에 환경변수가 추가되었기 때문에 `source` 명령어로 변경내역을 현재 세션에 바로 반영한다. `echo`로 GITHUB_TOKEN으로 등록한 환경변수가 잘 출력되는지 확인해 본다. 내가 등록한 토큰의 문자열이 잘 출력되는 것을 확인할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;4) 레포지토리 clone&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git clone https://$GITHUB_TOKEN@github.com/&amp;lt;github 아이디&amp;gt;/&amp;lt;레포지토리&amp;gt;.git&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;토큰을 이용해 클론을 하려면 기존 주소에 위와 같은 방식으로 토큰을 추가해서 보내면 된다. 토큰을 통해 사용자 인증이 되기 때문에 로그인 과정이 따로 필요하지 않다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgIVWm/btsIv6vt0uD/zlmqSkNnmELMw0zyRmlqhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgIVWm/btsIv6vt0uD/zlmqSkNnmELMw0zyRmlqhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgIVWm/btsIv6vt0uD/zlmqSkNnmELMw0zyRmlqhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgIVWm%2FbtsIv6vt0uD%2FzlmqSkNnmELMw0zyRmlqhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;180&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 잘 다운로드된 것을 확인할 수 있다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 소스코드 commit, push&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;clone 받은 프로젝트에 변경사항을 적용시킬 수 있는지 테스트를 해보기 위해 기존 프로젝트에 변경내용을 추가해 보자.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z7ZLC/btsItIja1SV/L5r1J1G2BlJbX6zvXxmeD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z7ZLC/btsItIja1SV/L5r1J1G2BlJbX6zvXxmeD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z7ZLC/btsItIja1SV/L5r1J1G2BlJbX6zvXxmeD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz7ZLC%2FbtsItIja1SV%2FL5r1J1G2BlJbX6zvXxmeD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;471&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;775&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 vscode를 사용해 `testfile.txt`라는 이름으로 파일을 하나 생성해 주고 내용을 추가해 주었다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p08mc/btsIvUhDdFa/e2VP6KAoVkPEVyl7HzV3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p08mc/btsIvUhDdFa/e2VP6KAoVkPEVyl7HzV3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p08mc/btsIvUhDdFa/e2VP6KAoVkPEVyl7HzV3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp08mc%2FbtsIvUhDdFa%2Fe2VP6KAoVkPEVyl7HzV3K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;94&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 변경사항을 추가하고 커밋을 한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuCBV4/btsIvzku3Oz/716dzsAhNUmNc4J6qri171/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuCBV4/btsIvzku3Oz/716dzsAhNUmNc4J6qri171/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuCBV4/btsIvzku3Oz/716dzsAhNUmNc4J6qri171/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuCBV4%2FbtsIvzku3Oz%2F716dzsAhNUmNc4J6qri171%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;201&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 push까지 해주었다. 성공적으로 레포지토리의 main브런치에 반영되었다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0grui/btsIvRSKVF0/zrdL9WSVuPW56FTANa3QCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0grui/btsIvRSKVF0/zrdL9WSVuPW56FTANa3QCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0grui/btsIvRSKVF0/zrdL9WSVuPW56FTANa3QCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0grui%2FbtsIvRSKVF0%2FzrdL9WSVuPW56FTANa3QCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;424&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github에서도 커밋한 내역을 확인 가능하다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이번 포스팅에서는 리눅스에 git을 설치하고 pat토큰을 발급받아 레포지토리에 접근하는 방법을 다뤄보았다. 윈도에서 jdk를 깔 때마다 환경변수를 등록해서 사용하곤 했는데 리눅스환경에서 환경변수를 직접 등록하고 출력하는 과정을 경험해 보니 추상적이었던 환경변수개념을 좀 더 구체적으로 이해하게 되었다.&lt;/p&gt;</description>
      <category>공부하자/git</category>
      <category>pat</category>
      <category>pat token</category>
      <category>pat토큰</category>
      <category>깃허브</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/24</guid>
      <comments>https://generalcoder.tistory.com/24#entry24comment</comments>
      <pubDate>Wed, 10 Jul 2024 21:40:02 +0900</pubDate>
    </item>
    <item>
      <title>[wsl]wsl2(Ubuntu 22.04) ip고정하기 -2(윈도우 작업 스케줄러)</title>
      <link>https://generalcoder.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.07.03 - [공부하자/wsl] - [wsl]wsl2(Ubuntu 22.04) ip고정하기 -1(powershell, 포트포워딩)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720054783069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[wsl]wsl2(Ubuntu 22.04) ip고정하기 -1(powershell, 포트포워딩)&quot; data-og-description=&quot;WSL(Windows Subsystem for Linux)은 Microsoft가 Windows 10과 Windows Server 2019 이상 버전에서 제공하는 기능으로, 사용자가 Windows 환경에서 직접 Linux 배포판을 실행할 수 있도록 해주는 기능이다. 이를 통해 Wind&quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/22&quot; data-og-url=&quot;https://generalcoder.tistory.com/22&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iQ1op/hyWvIue4Nq/IvbKQpPKZz8bnkHtDuYv21/img.png?width=800&amp;amp;height=327&amp;amp;face=0_0_800_327,https://scrap.kakaocdn.net/dn/jklyX/hyWvOutVT9/CiO9Z5ucTrexWGqATXpKq1/img.png?width=800&amp;amp;height=327&amp;amp;face=0_0_800_327,https://scrap.kakaocdn.net/dn/caCjns/hyWvVmOc19/SCkkcZha0X8YzVWuBToP41/img.png?width=1542&amp;amp;height=640&amp;amp;face=0_0_1542_640&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://generalcoder.tistory.com/22&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iQ1op/hyWvIue4Nq/IvbKQpPKZz8bnkHtDuYv21/img.png?width=800&amp;amp;height=327&amp;amp;face=0_0_800_327,https://scrap.kakaocdn.net/dn/jklyX/hyWvOutVT9/CiO9Z5ucTrexWGqATXpKq1/img.png?width=800&amp;amp;height=327&amp;amp;face=0_0_800_327,https://scrap.kakaocdn.net/dn/caCjns/hyWvVmOc19/SCkkcZha0X8YzVWuBToP41/img.png?width=1542&amp;amp;height=640&amp;amp;face=0_0_1542_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[wsl]wsl2(Ubuntu 22.04) ip고정하기 -1(powershell, 포트포워딩)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WSL(Windows Subsystem for Linux)은 Microsoft가 Windows 10과 Windows Server 2019 이상 버전에서 제공하는 기능으로, 사용자가 Windows 환경에서 직접 Linux 배포판을 실행할 수 있도록 해주는 기능이다. 이를 통해 Wind&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;generalcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;**이전글**&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지난시간 ip고정 작업을 윈도우가 부팅될때 마다 실행되도록 자동화하는 파워셸스트립트를 작성해보았다. 이젠 이 스크립트를 윈도우 스케줄러에 등록하기만 하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;윈도우 작업 자동화&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) 작업스케줄러에 스크립트 등록하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#작업스케줄러 검색&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 `시작` 버튼을 누르고 `작업 스케줄러`를 검색한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;작업스케줄러1.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biRyK7/btsImD9fCRv/uZu1qsT3oEkcdzLwk2Whk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biRyK7/btsImD9fCRv/uZu1qsT3oEkcdzLwk2Whk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biRyK7/btsImD9fCRv/uZu1qsT3oEkcdzLwk2Whk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiRyK7%2FbtsImD9fCRv%2FuZu1qsT3oEkcdzLwk2Whk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;655&quot; data-filename=&quot;작업스케줄러1.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#작업스케줄러화면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;작업스케줄러2.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVTjX5/btsInOBWUb4/rLEgdhmEkKIB7Y3QH6Lx3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVTjX5/btsInOBWUb4/rLEgdhmEkKIB7Y3QH6Lx3k/img.png&quot; data-alt=&quot;작업스케줄러 실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVTjX5/btsInOBWUb4/rLEgdhmEkKIB7Y3QH6Lx3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVTjX5%2FbtsInOBWUb4%2FrLEgdhmEkKIB7Y3QH6Lx3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;365&quot; data-filename=&quot;작업스케줄러2.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1033&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작업스케줄러 실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업스케줄러가 실행되면 다음과 같은 실행화면이 나온다. 기존에 존재하는 스케줄러 작업들이 작업스케줄러 라이브러리에 있는 것을 볼 수 있다. 이제 여기에 내 작업을 추가하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#작업폴더 만들고 작업생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I0jep/btsIlckkxA7/V7jUurj1exYSQi7e32e6zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I0jep/btsIlckkxA7/V7jUurj1exYSQi7e32e6zk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;550&quot; data-filename=&quot;작업스케줄러3.png&quot; style=&quot;width: 55.2278%; margin-right: 10px;&quot; data-widthpercent=&quot;55.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I0jep/btsIlckkxA7/V7jUurj1exYSQi7e32e6zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI0jep%2FbtsIlckkxA7%2FV7jUurj1exYSQi7e32e6zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUoBU/btsIm30Lhaw/moIfUH2rXoyHkaiwlmprs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUoBU/btsIm30Lhaw/moIfUH2rXoyHkaiwlmprs1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;692&quot; data-filename=&quot;작업스케줄러4.png&quot; style=&quot;width: 43.6094%;&quot; data-widthpercent=&quot;44.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUoBU/btsIm30Lhaw/moIfUH2rXoyHkaiwlmprs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUoBU%2FbtsIm30Lhaw%2FmoIfUH2rXoyHkaiwlmprs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;작업폴더만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트폴더인 `작업 스케줄러 라이브러리`에 바로 작업을 생성하면 나중에 찾기가 어려워질 수 있으니 하위폴더를 만들어서 내가 직접 생성한 작업들을 편하게 관리하도록 하자. 나는 `highgarden`이라는 폴더를 생성하여 스크립트를 관리하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#새 작업만들기 [일반]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_작업스케줄러5.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsu2av/btsInh5Gajx/rAZg96H6iQ6ZhxM9ELTOOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsu2av/btsInh5Gajx/rAZg96H6iQ6ZhxM9ELTOOk/img.png&quot; data-alt=&quot;새 작업 만들기[일반]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsu2av/btsInh5Gajx/rAZg96H6iQ6ZhxM9ELTOOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsu2av%2FbtsInh5Gajx%2FrAZg96H6iQ6ZhxM9ELTOOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;528&quot; data-filename=&quot;edited_작업스케줄러5.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새 작업 만들기[일반]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 작업만들기 [일반] 탭에서는 작업의 `이름`을 적어주고 나중에 알아볼 수 있도록 `설명`도 간단하게 적어준다. 그 다음 중요한 것은 `가장 높은 수준의 권한으로 실행`을 체크해 주는 것이다. 포트포워딩 작업은 방화벽 설정을 만지는 것이다. 그래서 관리자 권한으로만 변경이 가능하다. 이전 포스팅에서도 포트포워딩을 위해 관리자 권한의 파워셸로 작업을 했었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`구성대상`은 여러 버전이 있는데 버전에 맞게 지정해주면 되는데 window vista 버전으로 해도 크게 문제없이 작동 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#새 작업 만들기 [트리거]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHrGDm/btsIlR04jSR/udCXT1lPY2kI1ob1CpHUp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHrGDm/btsIlR04jSR/udCXT1lPY2kI1ob1CpHUp0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;713&quot; data-filename=&quot;작업스케줄러6.png&quot; style=&quot;width: 52.9456%; margin-right: 10px;&quot; data-widthpercent=&quot;53.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHrGDm/btsIlR04jSR/udCXT1lPY2kI1ob1CpHUp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHrGDm%2FbtsIlR04jSR%2FudCXT1lPY2kI1ob1CpHUp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1yGuw/btsInwBvoJK/6JLgnyw0kWdddy6LuTKZW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1yGuw/btsInwBvoJK/6JLgnyw0kWdddy6LuTKZW0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;772&quot; data-filename=&quot;작업스케줄러7.png&quot; style=&quot;width: 45.8916%;&quot; data-widthpercent=&quot;46.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1yGuw/btsInwBvoJK/6JLgnyw0kWdddy6LuTKZW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1yGuw%2FbtsInwBvoJK%2F6JLgnyw0kWdddy6LuTKZW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;새 작업 만들기[트리거]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[트리거] 탭에서 `새로 만들기` 를 클릭하여 스크립트가 실행될 조건을 설정해준다. 앞서 윈도우가 시작될 때 스크립트를 실행하고자 했으니 `작업 시작` 에서 `시작할 때`를 선택해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 `고급 설정` 에서 나는 `작업 지연시간` 을 1분을 주었다. 그 이유는 wsl부팅시점 때문이었다. 윈도우가 부팅되면 따라서 여러가지 작업들이 수행된다. 이 때 wsl도 같이 부팅되는데 만약 내가 만든 스크립트가 wsl보다 빠르게 실행된다면 동적으로 wsl의 ip를 가져오지 못할것이고 스크립트가 제대로 수행되지 못한다. 그래서 윈도우 시작 후 작업 지연시간 1분을 주어 wsl이 부팅되도록 충분한 시간을 주고 스크립트가 실행되도록 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업의 성격에 따라 여러가지 설정을 조절해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#새 작업 만들기 [동작]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZDkyb/btsInuXZTZa/VoUKAIdmDycKksDxvLu3fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZDkyb/btsInuXZTZa/VoUKAIdmDycKksDxvLu3fK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;927&quot; data-filename=&quot;작업스케줄러8.png&quot; style=&quot;width: 38.444%; margin-right: 10px;&quot; data-widthpercent=&quot;38.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZDkyb/btsInuXZTZa/VoUKAIdmDycKksDxvLu3fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZDkyb%2FbtsInuXZTZa%2FVoUKAIdmDycKksDxvLu3fK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QadQ2/btsIleicsbk/bZkJX5UCSYuaUkGW9Btj80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QadQ2/btsIleicsbk/bZkJX5UCSYuaUkGW9Btj80/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;787&quot; data-filename=&quot;작업스케줄러9.png&quot; style=&quot;width: 60.3932%;&quot; data-widthpercent=&quot;61.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QadQ2/btsIleicsbk/bZkJX5UCSYuaUkGW9Btj80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQadQ2%2FbtsIleicsbk%2FbZkJX5UCSYuaUkGW9Btj80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1259&quot; height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[동작] 탭에서 설정할 것은 `프로그램/스크립트` 와 `인수 추가`부분이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-프로그램/스크립트&lt;/b&gt;: 동작을 실행할 프로그램을 선택한다. powershell.exe를 찾아서 선택한다. 파워셸 실행프로그램의 경로는&quot;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe&quot; 에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-인수 추가&lt;/b&gt;: 스크립트의 경로를 지정해준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720055475973&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#프로그램/스크립트
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe


#인수추가
#실행권한을 부여 후 파일등록
-ExecutionPolicy Unrestricted -File &quot;C:\파일경로\파일명.ps1&quot;

#예시
-ExecutionPolicy Unrestricted -File &quot;C:\wsl_portforward.ps1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트를 실행하려면 권한이 있어야 하는데 &quot;ExecutionPolicy Unrestricted&quot; 옵션을 주어 권한 문제를 우회할 수 있다. 그 뒤에는 내가 실행시킬 스크립트의 실제 경로를 적어준다. 나같은 경우 C드라이브에 바로 `wsl_portforward.ps1` 파일을 두었기에 그 경로를 적어주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력이 끝나면 `확인` 버튼을 눌러 작업생성을 완료하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#등록완료&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_작업스케줄러10.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rtVWV/btsIlDhP4D2/nk7ipXkFSiksZyeVGFNFSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtVWV/btsIlDhP4D2/nk7ipXkFSiksZyeVGFNFSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtVWV/btsIlDhP4D2/nk7ipXkFSiksZyeVGFNFSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtVWV%2FbtsIlDhP4D2%2Fnk7ipXkFSiksZyeVGFNFSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;397&quot; data-filename=&quot;edited_edited_작업스케줄러10.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록이 완료되었다. [마지막 실행결과] 탭을 보면 작업이 아직 실행되지 않았다고 나온다. 이제 계획대로라면 윈도우가 시작될 때 스크립트가 실행되고 마지막 실행시간과 결과가 업데이트 될 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#포트포워딩 규칙 조회&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_포트포워드상태1.png&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umpqC/btsIlBc7qRU/lfMK8g9nllcNKNJUvmUFkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umpqC/btsIlBc7qRU/lfMK8g9nllcNKNJUvmUFkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umpqC/btsIlBc7qRU/lfMK8g9nllcNKNJUvmUFkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumpqC%2FbtsIlBc7qRU%2FlfMK8g9nllcNKNJUvmUFkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;220&quot; data-filename=&quot;edited_포트포워드상태1.png&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 스크립트가 등록되었는지 확인하기 위해 포트포워딩 상태를 다시 확인해보자. 지난시간 80번 포트를 wsl의 90번 포트로 연결해 두었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#스크립트 변경&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;포트포워드상태2.png&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H5gTs/btsIlmAB6XK/AiWNVvAcVDmoFt1Sz1UXnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H5gTs/btsIlmAB6XK/AiWNVvAcVDmoFt1Sz1UXnk/img.png&quot; data-alt=&quot;포트포워딩 스크립트(wsl_portforward.ps1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H5gTs/btsIlmAB6XK/AiWNVvAcVDmoFt1Sz1UXnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH5gTs%2FbtsIlmAB6XK%2FAiWNVvAcVDmoFt1Sz1UXnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;241&quot; data-filename=&quot;포트포워드상태2.png&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포트포워딩 스크립트(wsl_portforward.ps1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트를 수정해 80번 포트를 wsl의 80번으로 포트포워딩 되도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#작업 스케줄러에서 스크립트 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_포트포워드상태3.png&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bekAyl/btsInEzsMQz/hD6FqUPZKulKa9tR9uH4s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bekAyl/btsInEzsMQz/hD6FqUPZKulKa9tR9uH4s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bekAyl/btsInEzsMQz/hD6FqUPZKulKa9tR9uH4s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbekAyl%2FbtsInEzsMQz%2FhD6FqUPZKulKa9tR9uH4s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;316&quot; data-filename=&quot;edited_포트포워드상태3.png&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업스케줄러에 방금 등록한 `run_wsl_portforwad` 작업을 `실행`버튼으로 실행시켜본다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_포트포워드상태4.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4kNfF/btsIlRGNWRR/v77obCzsbNIHIj6Gmhv5oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4kNfF/btsIlRGNWRR/v77obCzsbNIHIj6Gmhv5oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4kNfF/btsIlRGNWRR/v77obCzsbNIHIj6Gmhv5oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4kNfF%2FbtsIlRGNWRR%2Fv77obCzsbNIHIj6Gmhv5oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;185&quot; data-filename=&quot;edited_포트포워드상태4.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란색 파워셸 창이 한 번 깜빡 한 후 상태를 확인 해 보면 마지막실행시간이 현재시간으로 업데이트 되었다. 일단 스크립트가 실행은 된 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_포트포워드상태5.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mc1Sa/btsIlP3iSaS/5wu95yudGY4pd8whF58pX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mc1Sa/btsIlP3iSaS/5wu95yudGY4pd8whF58pX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mc1Sa/btsIlP3iSaS/5wu95yudGY4pd8whF58pX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMc1Sa%2FbtsIlP3iSaS%2F5wu95yudGY4pd8whF58pX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;201&quot; data-filename=&quot;edited_포트포워드상태5.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트포워딩 상태를 다시 조회해보면 80번포트로 잘 변경되었다. 스크립트가 스케줄러를 통해 잘 실행된 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#웹서버로 테스트&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;테스트완료2.png&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zUlD1/btsIlluV0tD/dxD1GyXYaRLH5Wl7TmhmN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zUlD1/btsIlluV0tD/dxD1GyXYaRLH5Wl7TmhmN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zUlD1/btsIlluV0tD/dxD1GyXYaRLH5Wl7TmhmN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzUlD1%2FbtsIlluV0tD%2FdxD1GyXYaRLH5Wl7TmhmN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;428&quot; data-filename=&quot;테스트완료2.png&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;857&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl에 nginx를 구동시켜 실제로 포트포워딩이 잘 연결되었는지 마지막으로 테스트 해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_테스트완료.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkofsg/btsIln0GgG1/tyupaEgbFKEkrpckAkoTK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkofsg/btsIln0GgG1/tyupaEgbFKEkrpckAkoTK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkofsg/btsIln0GgG1/tyupaEgbFKEkrpckAkoTK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkofsg%2FbtsIln0GgG1%2FtyupaEgbFKEkrpckAkoTK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;218&quot; data-filename=&quot;edited_테스트완료.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내pc(window) ip인 192.xxx.xxx.xxx 로 접속했는데도 nginx의 index페이지가 잘 조회된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl에 서비스를 올리기 위해 포트포워딩이 필요하게 되었고 그로 인해 고정적으로 ip를 사용할 수 있도록 해야했다. 그 과정에서 윈도우 스케줄러와 파워셸 스크립트를 사용해 보았다. 스크립트를 스케줄러에 등록해놓고 트리거에 따라 작동시키면 많은 것들을 자동화 할 수 있을 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/wsl</category>
      <category>Linux</category>
      <category>PowerShell</category>
      <category>ubuntu</category>
      <category>wsl</category>
      <category>윈도우 스케줄러</category>
      <category>작업 스케줄러</category>
      <category>포트포워딩</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/23</guid>
      <comments>https://generalcoder.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 4 Jul 2024 11:08:19 +0900</pubDate>
    </item>
    <item>
      <title>[wsl]wsl2(Ubuntu 22.04) ip고정하기 -1(powershell, 포트포워딩)</title>
      <link>https://generalcoder.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;WSL(Windows Subsystem for Linux)은 Microsoft가 Windows 10과 Windows Server 2019 이상 버전에서 제공하는 기능으로, 사용자가 Windows 환경에서 직접 Linux 배포판을 실행할 수 있도록 해주는 기능이다. 이를 통해 Windows 사용자들은 별도의 가상 머신이나 듀얼 부팅 없이도 Linux의 다양한 기능과 도구들을 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl은 윈도우와 함께 구동되는데 서로 파일시스템도 공유하고 연동이 된다는 점이 매우 편리하다. 사용해 보면서 느낀 하나의 불편한 점은 wsl에서 제공하는 ubuntu는 새로 구동할 때마다 ip가 바뀐다는 점이었다. wsl 우분투 환경에서 서비스를 배포해보려고 했던 나에게 ip가 유동적으로 바뀐다는 것은 매우 디메리트였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 오늘은 wsl에서 고정ip 처럼 우분투를 사용할 수 있는 방법에 대해서 소개해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ip고정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) wsl ip확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 윈도우환경에서 내가 사용하는 ip와 wsl의 ip주소는 서로 다르다. 때문에 리눅스 환경과 상호작용 하기 위해서는 리눅스의 ip를 알아야만 한다. powershell과 wsl 우분투 터미널을 연다. 나 같은 경우 윈도우에서 제공하는 windows terminal을 사용하고 있다. 이 터미널의 장점은 한 실행창 내에서 여러 개의 터미널을 관리할 수 있다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;terminal.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1NoB9/btsIlXMCy5n/t8qwcPXSghnUzU3xbxm4Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1NoB9/btsIlXMCy5n/t8qwcPXSghnUzU3xbxm4Gk/img.png&quot; data-alt=&quot;windows terminal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1NoB9/btsIlXMCy5n/t8qwcPXSghnUzU3xbxm4Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1NoB9%2FbtsIlXMCy5n%2Ft8qwcPXSghnUzU3xbxm4Gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;287&quot; data-filename=&quot;terminal.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;windows terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진을 보면 powershell과 wsl 터미널이 탭으로 동시에 실행되는 것을 확인할 수 있다. 여러개의 터미널을 켜놓고 작업하다 보면 굉장히 지저분한데 windows terminal을 사용하면 폰트도 깔끔하고 각 터미널마다 다른 배경화면을 제공해서 구분도 쉽다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zImwK/btsIjIRdckD/5rEcRUnL269kBLi40UGBi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zImwK/btsIjIRdckD/5rEcRUnL269kBLi40UGBi1/img.png&quot; data-alt=&quot;windows 터미널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zImwK/btsIjIRdckD/5rEcRUnL269kBLi40UGBi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzImwK%2FbtsIjIRdckD%2F5rEcRUnL269kBLi40UGBi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;177&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;windows 터미널&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파워셸과 ubuntu터미널은 명령어가 서로 다르기 때문에 ip를 확인하는 명령어도 서로 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#powershell&lt;/p&gt;
&lt;pre id=&quot;code_1719971243002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ipconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_powershell.png&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/docY7z/btsIj8vzaM3/wFiozBkPJCN10HMcpaymn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/docY7z/btsIj8vzaM3/wFiozBkPJCN10HMcpaymn0/img.png&quot; data-alt=&quot;ipconfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/docY7z/btsIj8vzaM3/wFiozBkPJCN10HMcpaymn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdocY7z%2FbtsIj8vzaM3%2FwFiozBkPJCN10HMcpaymn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;290&quot; data-filename=&quot;edited_powershell.png&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ipconfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ipconfig명령어를 치게되면 현재 내 pc가 사용 중인 ip주소가 나오게 된다. 현재 나는 노트북 와이파이 환경에서 작업 중이기 때문에 무선 lan주소가 출력된다. Ipv4주소에 192.xxx..xxx.xxx의 형태의 숫자가 바로 내 ip주소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#wsl&lt;/p&gt;
&lt;pre id=&quot;code_1719971317331&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ifconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ubuntu터미널.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tTOMW/btsIjJJkNGa/uE1bXAojCcwkZz5xc0PQpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tTOMW/btsIjJJkNGa/uE1bXAojCcwkZz5xc0PQpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tTOMW/btsIjJJkNGa/uE1bXAojCcwkZz5xc0PQpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtTOMW%2FbtsIjJJkNGa%2FuE1bXAojCcwkZz5xc0PQpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;291&quot; data-filename=&quot;edited_ubuntu터미널.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl은 윈도우 환경 내에 캡슐화되어 있다. 때문에 ip주소도 다른데 eth0의 inet주소가 바로 wsl의 ip주소이다. 172.xxx.xxx.xxx의 형태로 되어있는 것을 볼 수 있고 내 pc(윈도우)의 ip인 192.xxx.... 와 다른 것을 알 수 있다. wsl은 기본적으로 윈도우가 부팅될 때 함께 시작되는데 재부팅될 때마다 다른 ip가 부여된다. 즉 wsl에 서비스를 올리게 되면 재부팅을 할 때마다 설정을 변경해 줄 수도 있게 된다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 포트포워딩&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 wsl은 윈도우 환경에 캡슐화되어있다고 말한 적 있다. 즉 외부에서 wsl로 직접접근이 불가능한데 윈도우 위에서 wsl이 구동 중이기 때문에 내 pc의 ip로 들어오는 요청을 우분투로 보내주어야 wsl에 요청이 전달된다. 즉, wsl로 서비스를 배포했을 때 클라이언트가 wsl환경에서 구동 중인 서버로 요청을 보내려면&amp;nbsp; 1) 내 pc(window) ip로 요청을 보내고 2) window는 wsl서버로 요청을 포트포워딩을 하는 두 가지 선행과정이 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#nginx서버 구동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 서버에 접근 가능한지 테스트 해보기 위해 nginx서버를 설치하고 구동시켜 보자. wsl터미널에서 실행하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719973816922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#wsl terminal

#nginx 설치
sudo apt install nginx

#nginx서버 구동
sudo systemctl start nginx

#nginx상태 확인
sudo systemctl status nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginxStatus.png&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk7tXo/btsIlm0s25I/QvKl7CM0bH6KkmLRCbS8Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk7tXo/btsIlm0s25I/QvKl7CM0bH6KkmLRCbS8Ok/img.png&quot; data-alt=&quot;nginx status&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk7tXo/btsIlm0s25I/QvKl7CM0bH6KkmLRCbS8Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk7tXo%2FbtsIlm0s25I%2FQvKl7CM0bH6KkmLRCbS8Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;496&quot; data-filename=&quot;nginxStatus.png&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nginx status&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 서버가 구동중이면 다음과 같은 메시지가 보일 것이다. 이제 브라우저에서 리눅스 주소로 접속해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#브라우저 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx는 wsl에 설치되면 80번 포트로 접근이 가능하다. 브라우저에 wsl ip주소를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_nginxIndex.png&quot; data-origin-width=&quot;1567&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5usUN/btsImeHnvRN/YrHFdhPcvo3kWyEEv9Ox81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5usUN/btsImeHnvRN/YrHFdhPcvo3kWyEEv9Ox81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5usUN/btsImeHnvRN/YrHFdhPcvo3kWyEEv9Ox81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5usUN%2FbtsImeHnvRN%2FYrHFdhPcvo3kWyEEv9Ox81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;234&quot; data-filename=&quot;edited_nginxIndex.png&quot; data-origin-width=&quot;1567&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 실행이 되었다면 다음과 같은 메시지를 확인할 수 있을 것이다. 앞서 wsl에는 직접적인 접근이 불가능하다고 했는데 브라우저에서 실행되는 것이 이상할 수 있다. 그 이유는 로컬환경에서 실행했기 때문이다. 만약 다른 기기에서 접속을 시도한다면 당연히 안될 것이다. 그래서 실제로 내 pc로 들어오는 요청이 wsl로 전달되려면 포트포워딩을 해서 192.xxx로의 요청이 172.xx라는 주소로 매핑되도록 해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#포트포워딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window pc로 들어오는 요청을 wsl에 연결해 주려면 window 측에서 작업을 해주어야 한다. 받은 것을 보내주어야 하니 당연하다고 볼 수 있다. 아래 명령어를 통해 포트포워딩 규칙과 목록을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719974823867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#powershell

#포트포워딩 내역 조회
netsh interface portproxy show all

#포트포워딩 추가
netsh interface portproxy add v4tov4 listenport=&amp;lt;HOST_PORT&amp;gt; listenaddress=0.0.0.0 connectport=&amp;lt;WSL_PORT&amp;gt; connectaddress=&amp;lt;WSL_IP&amp;gt;

#예시
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.xxx.xxx.xxx

#포트포워딩 삭제
netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-listenport: 내 window pc로 전달받을 포트번호를 지정한다. nginx는 80번 포트를 사용하니 통일감을 위해 80으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-listenaddress: 어떤 ip로부터의 요청을 받을지 정한다. `0.0`0.0`은 모든 요청을 받겠단 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-connectport: wsl의 port를 연결한다. nginx가 80번 포트에서 돌아가고 있기 때문에 80으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-connectaddress: wsl ip를 기입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_netsh1.png&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOYyXV/btsIjIDG1XK/UXWuHvy4By5CJyNQPz38CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOYyXV/btsIjIDG1XK/UXWuHvy4By5CJyNQPz38CK/img.png&quot; data-alt=&quot;현재 포트포워딩 내역 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOYyXV/btsIjIDG1XK/UXWuHvy4By5CJyNQPz38CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOYyXV%2FbtsIjIDG1XK%2FUXWuHvy4By5CJyNQPz38CK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;158&quot; data-filename=&quot;edited_netsh1.png&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 포트포워딩 내역 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 기존에 ssh접속을 위해 wsl 22번 포트에 포트포워딩 규칙을 추가해 놓았기 때문에 그 내역이 존재한다. 만약 맨 처음이라면 아무것도 조회되지 않을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_netsh2.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rEYZy/btsImduYkf0/tU1xgwBr0Ksw1EEYvPKKG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rEYZy/btsImduYkf0/tU1xgwBr0Ksw1EEYvPKKG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rEYZy/btsImduYkf0/tU1xgwBr0Ksw1EEYvPKKG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrEYZy%2FbtsImduYkf0%2FtU1xgwBr0Ksw1EEYvPKKG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;259&quot; data-filename=&quot;edited_netsh2.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어는 관리자권한으로만 수행가능하다. 때문에 powershell을 관리자권한으로 실행해야 한다. 규칙이 추가되고 내역을 조회하니 80번 포트로의 요청이 wsl로 잘 연결되었음을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.xxx로 시작하는 현재 pc의 ip로 브라우저에서 접속을 시도해도 nginx서버의 index페이지가 잘 보이는 것을 확인할 수 있다. 성공적으로 포트포워딩이 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_portfow.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfjTb/btsIldh9j4V/Ie7eySgNXF045F0mPgbpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfjTb/btsIldh9j4V/Ie7eySgNXF045F0mPgbpkk/img.png&quot; data-alt=&quot;포트포워딩 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfjTb/btsIldh9j4V/Ie7eySgNXF045F0mPgbpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfjTb%2FbtsIldh9j4V%2FIe7eySgNXF045F0mPgbpkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;249&quot; data-filename=&quot;edited_portfow.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포트포워딩 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) ip고정하기, 작업 스케줄러&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip를 고정해야 하는 이유는 포트포워딩과정을 살펴보면 알겠지만 wsl의 ip주소를 명시적으로 기입하여 포트포워딩을 해주어야 한다는 것 때문이다. 재부팅이 되면서 wsl의 ip가 달라지면 기존의 포트포워딩 규칙이 쓸모없게 되고 요청을 wsl로 넘겨줄 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이유로 wsl의 ip고정이 필요한데 wsl은 자체적으로 ip를 고정하는 기능을 제공하지 않는다. 때문에 window에서 wsl의 ip변경에 따라 포워딩 규칙을 새로 생성해주어야 한다. 이를 위해 파워셸 스크립트와 윈도우 작업 스케줄러를 사용할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`작업 스케줄러`는 특정 조건에 따라서 작업을 수행할 수 있도록 해주는 기능이다. 예를 들어 윈도가 시작할 때마다 특정 동작(포트포워딩 규칙을 추가한다)이 수행되도록 할 수 있다. 이 때 실행될 작업을 스크립트로 작성할 수 있는데 이 때 파워셸 스크립트가 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우가 시작될 때 wsl은 같이 부팅된다. 동시에 wsl ip가 할당되는데 그 시점의 wsl의 ip주소를 알아내어 기존 포트포워딩 규칙을 삭제하고 새로 알아낸 wsl ip를 포트포워딩에 추가해 주도록 스크립트를 작성해 보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#powershell 스크립트파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 ps1확장자를 가진 파일을 하나 생성해 준다. ps1확장자는 powershell 스크립트 파일을 말하며 작업 스케줄러에서 해당 파일을 실행하면 스크립트가 실행되도록 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wsl_port.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTvh70/btsIj5lo7wH/bzTx29W8kg55vO2cWwI89K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTvh70/btsIj5lo7wH/bzTx29W8kg55vO2cWwI89K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTvh70/btsIj5lo7wH/bzTx29W8kg55vO2cWwI89K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTvh70%2FbtsIj5lo7wH%2FbzTx29W8kg55vO2cWwI89K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;327&quot; data-filename=&quot;wsl_port.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#powershell 스크립트 작성(wsl_portforward.ps1)&lt;/p&gt;
&lt;pre id=&quot;code_1719977370947&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#기존포트포워딩 삭제
netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0

#재부팅되어 리셋된 wsl ip를 변수에 할당
$wsl_ip = wsl hostname -I | Out-String
$wsl_ip = $wsl_ip.Trim()

#새로운 ip로 포트포워딩
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 스크립트가 실행되면 기존의 80번 포트와 관련된 포트포워딩규칙이 삭제되고 wsl의 ip주소를 얻어 새로운 규칙을 추가하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl_ip라는 변수에 동적으로 wsl의 ip주소를 할당하여 포트포워딩을 수행한다. 이 때 바로 변수를 넣어 포트포워딩을 하게 되면 포트포워딩이 제대로 수행되지 않는다. 아마 윈도우에서 보안관련 정책으로 동적인 값으로 요청을 수행하면 차단하는 듯 하다.&amp;nbsp; 때문에 Out-String으로 문자열로 변환한 후에 사용해야 문제가 생기지 않는다. Trim()은 Out-String작업 후 생기는 공백문자를 삭제해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 동적인 변수로 그대로 스크립트를 실행했을 때 포트포워드도 정상적으로 수행되어 보였는데 실제로는 포트포워딩이 작동하지 않아 문제를 찾는데 한참 걸렸다. ip주소는 동적인 변수에 담지 말고 문자열로 변환해서 사용하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#스크립트 실행 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파워셸에서 작성한 스크립트가 올바로 작동하는지 테스트해보자. 변경된 부분을 알기 위해 기존 80-&amp;gt;80번 포트로 연결되던 것을 80-&amp;gt;90으로 되도록 스크립트(wsl_portforward.ps1) 내용을 변경했다.&lt;/p&gt;
&lt;pre id=&quot;code_1719977790698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#스크립트 실행권한 설정
Set-ExecutionPolicy RemoteSigned

#스크립트파일 실행
C:\wsl_portforward.ps1

#변경된 규칙 확인
netsh interface portproxy show all&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행에 앞서 스크립트를 실행한다는 것은 운영체제에 접근할 수 있다는 뜻이기 때문에 실행권한에 엄격한 규칙이 있다. 때문에 `Set_ExecutionPolicy RemoteSigned` 를 사용해서 해당 pc에서 작성된 스크립트는 모두 실행 가능하도록 설정해 준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 스크립트를 실행해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_portfow2.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyXSCo/btsIkjwLqjD/tkGKxQHuzXWYKElKBzcUz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyXSCo/btsIkjwLqjD/tkGKxQHuzXWYKElKBzcUz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyXSCo/btsIkjwLqjD/tkGKxQHuzXWYKElKBzcUz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeyXSCo%2FbtsIkjwLqjD%2FtkGKxQHuzXWYKElKBzcUz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;238&quot; data-filename=&quot;edited_portfow2.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경사항이 잘 반영되었다. wsl포트가 90번으로 연결된 것을 확인할 수 있다. 90번으로 바꿨던 스크립트는 다시 원래대로 80으로 돌려놓도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 스크립트만 실행되면 wsl ip는 마치 고정 ip인 것처럼 사용이 가능하다. 어떻게 변경이 되어도 새로 포트포워딩을 해주기 때문이다. 이제 마지막 하나의 작업이 남았다. 다음 시간에는 이 스크립트가 윈도우가 부팅될 때마다 실행될 수 있도록 작업 스케줄러에 스크립트를 등록해 보고 테스트해보도록 하자.&lt;/p&gt;</description>
      <category>공부하자/wsl</category>
      <category>PowerShell</category>
      <category>wsl</category>
      <category>포트포워딩</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/22</guid>
      <comments>https://generalcoder.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 3 Jul 2024 12:55:39 +0900</pubDate>
    </item>
    <item>
      <title>[Linux]linux-ubuntu 20.04 실전 기본 명령어 -4(네트워크2)</title>
      <link>https://generalcoder.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.06.26 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -3(네트워크상태확인, ifconfig, ping)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719454865516&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -3(네트워크상태확인, ifconfig, ping)&quot; data-og-description=&quot;2024.06.21 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)&amp;nbsp;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)2024.06.20 - [공부하자/Linux] - [Linux]linux-ubuntu 20&quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/20&quot; data-og-url=&quot;https://generalcoder.tistory.com/20&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1bR48/hyWrMDFrLS/yLYjTkj53ngJYaK94l5Cx1/img.png?width=800&amp;amp;height=362&amp;amp;face=0_0_800_362,https://scrap.kakaocdn.net/dn/fIVZu/hyWrKZ7kbO/aQqyFa73Y2aWVkrd0efwHk/img.png?width=800&amp;amp;height=362&amp;amp;face=0_0_800_362&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://generalcoder.tistory.com/20&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1bR48/hyWrMDFrLS/yLYjTkj53ngJYaK94l5Cx1/img.png?width=800&amp;amp;height=362&amp;amp;face=0_0_800_362,https://scrap.kakaocdn.net/dn/fIVZu/hyWrKZ7kbO/aQqyFa73Y2aWVkrd0efwHk/img.png?width=800&amp;amp;height=362&amp;amp;face=0_0_800_362');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -3(네트워크상태확인, ifconfig, ping)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024.06.21 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)&amp;nbsp;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)2024.06.20 - [공부하자/Linux] - [Linux]linux-ubuntu 20&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;generalcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;**이전글**&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에는 리눅스 네트워크와 관련된 기본 명령어인 `ifconfig`과 `ping`에 대해서 살펴보았다. 리눅스는 그 외에도 다양한 네트워크 관련 명령어를 제공하고 있다. 오늘은 자주쓰이는 네트워크 관련 명령어들을 살펴보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) ip&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난시간 `ifconfig`를 통해 네트워크 상태를 확인하는 방법을 배웠다. `ifconfig`는 오래되고 기본적인 도구이지만 여러가지 한계점이 있었고 그 것을 해결하기 위해 좀 더 현대적인 네트워크 관리도구가 개발되었다. 그것이 바로 `ip`이다. `ip`는 `ifconfig`에서는 제공하지 않는 VLAN설정이나 다중주소 지원, 인터페이스 상태관리 등 을 제공하고 다양한 네트워크 작업을 통합적이고 일관된 방식으로 처리할 수있다는 것이 장점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 간단한 예제를 실습해보면서 ip의 기능을 알아보자.&lt;/p&gt;
&lt;pre id=&quot;code_1719458608798&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#모든 네트워크 인터페이스와 상태 확인
ip addr show

#특정 인터페이스 (예: eth0)의 정보 확인
ip addr show eth0

#새로운 IP 주소 추가
sudo ip addr add 192.xxx.xxx.xxx/24 dev eth0

#추가된 IP 주소 삭제
sudo ip addr del 192.xxx.xxx.xxx/24 dev eth0

#인터페이스 활성화
sudo ip link set eth0 up

#인터페이스 비활성화
sudo ip link set eth0 down&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip1.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxEKz/btsIeUh2gsb/h1YCDReyICKafxsxLkvTe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxEKz/btsIeUh2gsb/h1YCDReyICKafxsxLkvTe0/img.png&quot; data-alt=&quot;ip addr show&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxEKz/btsIeUh2gsb/h1YCDReyICKafxsxLkvTe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxEKz%2FbtsIeUh2gsb%2Fh1YCDReyICKafxsxLkvTe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;200&quot; data-filename=&quot;edited_ip1.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ip addr show&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`ip addr show`명령어를 치면 모든 네트워크 인터페이스와 상태를 확인할 수 있다. `ifconfig`과 거의 비슷한 정보를 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip2.png&quot; data-origin-width=&quot;1735&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqYQcx/btsIeeuuF1G/1FSG02K9FoEqTdW37wCzZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqYQcx/btsIeeuuF1G/1FSG02K9FoEqTdW37wCzZ1/img.png&quot; data-alt=&quot;특정 인터페이스만 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqYQcx/btsIeeuuF1G/1FSG02K9FoEqTdW37wCzZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqYQcx%2FbtsIeeuuF1G%2F1FSG02K9FoEqTdW37wCzZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;123&quot; data-filename=&quot;edited_ip2.png&quot; data-origin-width=&quot;1735&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특정 인터페이스만 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 인터페이스(예: eth0)의 이름을 가지고 단일 조회도 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_ip3.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brfmZy/btsIdfnBx9F/p7yNXcuCv7AGkQKzrvtMPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brfmZy/btsIdfnBx9F/p7yNXcuCv7AGkQKzrvtMPK/img.png&quot; data-alt=&quot;ip추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brfmZy/btsIdfnBx9F/p7yNXcuCv7AGkQKzrvtMPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrfmZy%2FbtsIdfnBx9F%2Fp7yNXcuCv7AGkQKzrvtMPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;232&quot; data-filename=&quot;edited_edited_ip3.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ip추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`eth0` 네트워크 인터페이스에 새로운 ip를 추가해 준다. 그 다음 다시 `ip addr show`로 조회를 하니 eth0에 새로기입한 ip가 추가되어 있는 것을 볼 수 있다. 이 기능이 바로 기존 `ifconfig` 에서는 지원하지 않는 다중주소지원 기능인데 하나의 네트워크 인터페이스가 복수의 ip주소를 가질 수 있다. 아직 쓰임새가 마땅히 생각나지는 않지만 여러 용도로 사용될 수 있을 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip4.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbU5U/btsIe3stxus/y4ol5KKxGbLKjfntfJOUnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbU5U/btsIe3stxus/y4ol5KKxGbLKjfntfJOUnk/img.png&quot; data-alt=&quot;네트워크 인터페이스 비활성화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbU5U/btsIe3stxus/y4ol5KKxGbLKjfntfJOUnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbU5U%2FbtsIe3stxus%2Fy4ol5KKxGbLKjfntfJOUnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;210&quot; data-filename=&quot;edited_ip4.png&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네트워크 인터페이스 비활성화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`sudo ip link set eth0 down` 명령어는 해당 인터페이스를 비활성화 한다.&amp;nbsp; eth0의 상태를 표현하던 `UP`이 사라진 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip5.png&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdLWag/btsIe1VJtF8/W4hTkCTFcv9PTsxvNXbSk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdLWag/btsIe1VJtF8/W4hTkCTFcv9PTsxvNXbSk1/img.png&quot; data-alt=&quot;추가한 ip 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdLWag/btsIe1VJtF8/W4hTkCTFcv9PTsxvNXbSk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdLWag%2FbtsIe1VJtF8%2FW4hTkCTFcv9PTsxvNXbSk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;158&quot; data-filename=&quot;edited_ip5.png&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추가한 ip 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중ip를 위해 추가했던 ip주소를 다시 삭제해준다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) netstat&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719459798238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#모든 네트워크 연결 상태 확인
netstat -a

#현재 열려 있는 포트와 그 포트의 프로그램 확인
sudo netstat -tuln&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t : TCP 연결 정보를 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-u : UDP 연결 정보를 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-n : 숫자 형식으로 IP 주소와 포트를 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-a : 모든 연결을 표시 (리스닝과 연결 상태 모두 포함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-r : 라우팅 테이블을 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l : 리스닝 상태인 소켓만 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netstat뒤에 붙을 수 있는 일반적인 옵션들은 위와 같다. `-tuln`이라면 tcp, udp 연결정보를 숫자형식으로 리스닝중인 소켓만 조회한다는 뜻이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_netstat.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rv0RC/btsIe0CzGWE/fbTk7KWFXomayWF7Fm2HXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rv0RC/btsIe0CzGWE/fbTk7KWFXomayWF7Fm2HXk/img.png&quot; data-alt=&quot;netstat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rv0RC/btsIe0CzGWE/fbTk7KWFXomayWF7Fm2HXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frv0RC%2FbtsIe0CzGWE%2FfbTk7KWFXomayWF7Fm2HXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;214&quot; data-filename=&quot;edited_netstat.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;netstat&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`netstat -a`를 입력하면 다음과 같이 네트워크 연결상태가 출력된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*만약 netstat패키지가 없다는 메시지가 출력된다면 `sudo apt install net-tools` 를 통해 패키지를 다운받고 나서 실행해보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) traceroute&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;traceroute는 패킷이 목적지까지 도달하기 까지의 경로를 추적한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719461779315&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;traceroute google.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 내 네트워크 환경에서 google.com까지의 경로를 보여주고 걸리는 시간을 계산해서 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;traceroute.png&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CxAlo/btsIdT5zVkQ/HHwzK1ifXdfZKN1BWfQK31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CxAlo/btsIdT5zVkQ/HHwzK1ifXdfZKN1BWfQK31/img.png&quot; data-alt=&quot;traceroute&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CxAlo/btsIdT5zVkQ/HHwzK1ifXdfZKN1BWfQK31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCxAlo%2FbtsIdT5zVkQ%2FHHwzK1ifXdfZKN1BWfQK31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;177&quot; data-filename=&quot;traceroute.png&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;traceroute&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 좌측에 보이는 숫자는 홉(hop)수 인데 홉수는 목적지까지 거쳐야하는 라우터의 갯수라고 볼 수 있다. traceroute의 디폴트 세팅은 최대 홉수 30(30 hops max)이다. 30홉까지만 추적하고 그 이상 넘어가면 실행이 종료된다. 위 예제에서는 총 13홉 안에 목표에 도달하여 traceroute가 종료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 `***`로 되어있는 곳들은 ICMP(ping)을 차단해 놓거나 방화벽 필터링 등으로 응답을 받지 못한 경우를 말한다. traceroute는 최대 홉수를 하나씩 늘려가며 핑을 날려 반환시간을 체크하는 방식으로 작동한다. 때문에 경로에 ICMP을 차단하는 무엇인가가 있다면 반환시간을 계산 할 수 없고 `***`으로 출력되는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) nslookup&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719462985994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nslookup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nslookup은 도메인 네임시스템(DNS)를 통해 호스트 네임이나 IP주소를 조회할 수 있는 기능을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nslookup.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rx3c2/btsId04xVco/E2MQ13rennqvG8JCaf6ENK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rx3c2/btsId04xVco/E2MQ13rennqvG8JCaf6ENK/img.png&quot; data-alt=&quot;nslookup&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rx3c2/btsId04xVco/E2MQ13rennqvG8JCaf6ENK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frx3c2%2FbtsId04xVco%2FE2MQ13rennqvG8JCaf6ENK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;274&quot; data-filename=&quot;nslookup.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nslookup&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`google.com` 은 DNS에 의해 실제 ip 주소와 매핑된다. 하지만 실제 ip 주소는 겉으로는 보이지 않는데 이것을 nslookup을 통해 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;google1.png&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDDqB/btsIe3faaz5/cDuRyJccE9eiELKr6WxrI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDDqB/btsIe3faaz5/cDuRyJccE9eiELKr6WxrI0/img.png&quot; data-alt=&quot;ip주소 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDDqB/btsIe3faaz5/cDuRyJccE9eiELKr6WxrI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDDqB%2FbtsIe3faaz5%2FcDuRyJccE9eiELKr6WxrI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;217&quot; data-filename=&quot;google1.png&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ip주소 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 구글의 ip주소인지 확인하기 위해 브라우저에 ip주소를 입력해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 구글웹사이트로 잘 이동하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;google2.png&quot; data-origin-width=&quot;1832&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6UfY7/btsIdxaLa7y/6YanHH1jH4m3Dh93DENeb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6UfY7/btsIdxaLa7y/6YanHH1jH4m3Dh93DENeb0/img.png&quot; data-alt=&quot;google등장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6UfY7/btsIdxaLa7y/6YanHH1jH4m3Dh93DENeb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6UfY7%2FbtsIdxaLa7y%2F6YanHH1jH4m3Dh93DENeb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;353&quot; data-filename=&quot;google2.png&quot; data-origin-width=&quot;1832&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;google등장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) dig&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719462998472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dig google.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 좀 더 자세하게 DNS관련 정보를 확인하고 싶다면 `dig`를 사용한다. `nslookup`은 간결하게 정보를 제공해주었다면 `dig`는 많은 정보를 제공해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dig.png&quot; data-origin-width=&quot;1815&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zI1UH/btsIfkub1on/f3BAYryVMZOzHO6ty439j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zI1UH/btsIfkub1on/f3BAYryVMZOzHO6ty439j0/img.png&quot; data-alt=&quot;dig google.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zI1UH/btsIfkub1on/f3BAYryVMZOzHO6ty439j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzI1UH%2FbtsIfkub1on%2Ff3BAYryVMZOzHO6ty439j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;267&quot; data-filename=&quot;dig.png&quot; data-origin-width=&quot;1815&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dig google.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6) curl 및 wget&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719463179537&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#curl을 사용하여 웹 페이지 내용 가져오기
curl http://example.com

#wget을 사용하여 파일 다운로드
wget http://example.com/file.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl이나 wget을 사용하면 브라우저나 포스트맨 같은 툴 없이도 간단하게 url요청을 할 수 있다. `curl`은 주로 HTTP API호출과 데이터 전송에 많이 사용되며 `wget`은 파일 다운로드나 웹 크롤링에 활용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 네트워크 관련된 기능들이 많이 존재하지만 가장 핵심적인 명령어들만 포스팅에 담으려 노력했다.&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/Linux</category>
      <category>ip</category>
      <category>Linux</category>
      <category>ubuntu</category>
      <category>WSL2</category>
      <category>네트워크</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/21</guid>
      <comments>https://generalcoder.tistory.com/21#entry21comment</comments>
      <pubDate>Thu, 27 Jun 2024 13:52:45 +0900</pubDate>
    </item>
    <item>
      <title>[Linux]linux-ubuntu 20.04 실전 기본 명령어 -3(네트워크상태확인, ifconfig, ping)﻿</title>
      <link>https://generalcoder.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.06.21 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719381339810&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)&quot; data-og-description=&quot;2024.06.20 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템) [Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템)백엔드 개발자 로드맵을 보게 되면 basic 레벨에서 Git과 함께 L&quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/19&quot; data-og-url=&quot;https://generalcoder.tistory.com/19&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLZiYo/hyWrWsv0iA/dkjulL4AvVUCb1PRLxQKt1/img.png?width=800&amp;amp;height=150&amp;amp;face=0_0_800_150,https://scrap.kakaocdn.net/dn/cOL8VI/hyWrXZhhf4/Jo5T6qKqNgQIjqMvBulcPK/img.png?width=800&amp;amp;height=150&amp;amp;face=0_0_800_150,https://scrap.kakaocdn.net/dn/le1zz/hyWrNoNYSW/HAPy7bCMRzNKx6y59nxsd0/img.png?width=1275&amp;amp;height=829&amp;amp;face=0_0_1275_829&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://generalcoder.tistory.com/19&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLZiYo/hyWrWsv0iA/dkjulL4AvVUCb1PRLxQKt1/img.png?width=800&amp;amp;height=150&amp;amp;face=0_0_800_150,https://scrap.kakaocdn.net/dn/cOL8VI/hyWrXZhhf4/Jo5T6qKqNgQIjqMvBulcPK/img.png?width=800&amp;amp;height=150&amp;amp;face=0_0_800_150,https://scrap.kakaocdn.net/dn/le1zz/hyWrNoNYSW/HAPy7bCMRzNKx6y59nxsd0/img.png?width=1275&amp;amp;height=829&amp;amp;face=0_0_1275_829');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024.06.20 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템) [Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템)백엔드 개발자 로드맵을 보게 되면 basic 레벨에서 Git과 함께 L&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;generalcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;**이전 글**&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네트워크상태확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 환경에서 네트워크를 다루려면 가장 기본이 되는 네트워크 설정과 상태정보를 읽을 수 있어야 한다. 본 포스팅에서는 그때 사용하는 명령어와 그 정보를 읽는 방법을 다뤄보겠다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 네트워크 설정과 상태 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#네트워크 정보 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifconfig: 가장 기본적으로 사용하는 명령어로 네트워크인터페이스의 설정과 상태정보를 출력해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1719382567154&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ifconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`eth0`과 `lo`라는 이름으로 의미 모를 글자들이 적혀있다. 대략 `inet`은 ip주소가 되겠구나 라는 추측은 할 수 있을 듯하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서 자세하게 설명하겠지만 `eth0`은 설치 시 세팅된 기본 이더넷 인터페이스로 별도의 세팅을 하지 않았다면 `eth0`이 실제 물리적인 네트워크와의 연결을 담당하고 실제로 네트워크 통신을 담당한다고 볼 수 있다. 만약 외부에서 내 우분투로 접근하려면 `eth0`의 ip를 필요로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ifconfig.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAoZgn/btsIcQgS3NH/e4ZA34Xm8KN3lwhiVurygK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAoZgn/btsIcQgS3NH/e4ZA34Xm8KN3lwhiVurygK/img.png&quot; data-alt=&quot;ifconfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAoZgn/btsIcQgS3NH/e4ZA34Xm8KN3lwhiVurygK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAoZgn%2FbtsIcQgS3NH%2Fe4ZA34Xm8KN3lwhiVurygK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;317&quot; data-filename=&quot;edited_ifconfig.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ifconfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 의미는 아래에서 자세히 살펴보도록 하고 지금은 ifconfig명령어는 네트워크 관련 정보를 출력하는구나만 알고 넘어가자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) ifconfig 주요 필드의 의미&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifconfig명령어로 출력되는 필드들의 의미를 하나씩 살펴보자 이 것들을 이해하는 데는 기본적인 네트워크 지식이 필요하다. IPv4나 IPv6 같은 기본적 지식은 검색을 통해 채우도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#인터페이스 이름(`eth0`, `lo`...)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eth0:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 두 가지의 네트워크 인터페이스를 확인할 수 있다. `eth0` 과 `lo`인데 `eth0`은 우분투 설치 시 기본으로 세팅되는 네트워크 인터페이스로 유선 이더넷 인터페이스를 의미한다. 이더넷(ethernet)의 `이더(ehe)`를 표현한 것으로 무선 인터페이스는 `wlan0` 등으로 표현된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lo:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름 짓기 규칙을 보면 `lo`도 어떤 단어의 앞글자를 딴 것이라고 합리적으로 추측해 볼 수 있다. 실제로 `lo`는 루프백(loopback)에서 따와서 루프백 인터페이스라고 불린다. 주로 시스템에서 자체 통신을 위해 사용되는 인터페이스를 말한다. 네트워크 인터페이스의 종류에 대해서는 아래에서 다루겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#flags&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`flags`는 인터페이스의 상태와 옵션을 나타낸다. 예를 들어 `UP(활성화됨)`, `BROADCAST(브로드캐스트 지원)`, `MULTICAST(멀티캐스트 지원)` 등을 포함할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719385804549&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eth0: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#mtu(Maximum Transmission Unit)&lt;/p&gt;
&lt;pre id=&quot;code_1719386054965&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eth0: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1500&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;` mtu`란 네트워크 인터페이스의 최대 전송크기를 말한다. 단위는 `바이트(byte)`로 즉 여기서는 1500바이트가 최대전송단위임을 알 수 있다. 이더넷 환경에서는 기본 1500바이트가 디폴트 값이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#inet, netmask, broadcast&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inet: IPv4주소를 말함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netmask: 서브넷 마스크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;broadcast: 브로드캐스트 주소&lt;/p&gt;
&lt;pre id=&quot;code_1719386161594&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inet 172.xxx.xxx.xxx  netmask 255.255.240.0  broadcast 172.xxx.xxx.xxx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#inet6&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inet6: IPv6주소를 나타냄.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prefixlen: 서브넷 접두사 길이를 나타냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scopeid: 주소의 범위와 유형을 나타냄.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719386461527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inet6 fe80::xxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPv6로 표현된 ip 주소와 서브넷접두사 길이(64비트), 링크 로컬 주소임을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#ether, txqueuelen&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ether: MAC주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exqueuelen: 전송 큐 길이&lt;/p&gt;
&lt;pre id=&quot;code_1719387147772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MAC주소와 전송큐의 길이가 1000 임을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#RX packets, TX packets&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719387224410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;RX packets 470  bytes 74575 (74.5 KB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 25  bytes 1822 (1.8 KB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RX packets: 수신된 패킷 수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bytes: 수신된 데이터 바이트 수&lt;/li&gt;
&lt;li&gt;errors: 수신 중 발생한 오류 수&lt;/li&gt;
&lt;li&gt;dropped: 드롭된 수신 패킷 수&lt;/li&gt;
&lt;li&gt;overruns: 오버런 된 수신패킷 수&amp;nbsp;&lt;/li&gt;
&lt;li&gt;frame: 프레임 오류 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TX packets: 전송된 패킷 수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bytes: 전송된 데이터 바이트 수&lt;/li&gt;
&lt;li&gt;errors: 전송 중 발생한 오류 수&lt;/li&gt;
&lt;li&gt;dropped: 드롭된 전송 패킷 수&lt;/li&gt;
&lt;li&gt;overruns: 오버런된 전송패킷 수&lt;/li&gt;
&lt;li&gt;carrier: 캐리어 오류 수&lt;/li&gt;
&lt;li&gt;collisions: 충돌 수&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 의미를 자세하기 이해하는 것은 전송 단위인 패킷에 대한 이해가 필요한데 여기서는 전송 단위로 `패킷`이라는 것이 사용되고 네트워크의 상태를 진단하기 위해서 받은 패킷과 전송한 패킷의 개수, 혹은 오류 갯수 등을 사용하는구나 정도 알고 넘어가면 될 듯하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 외부에서 네트워크상태 확인(PING 날리기)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷이라는 것이 감이 잘 잡히지 않을 수 있기 때문에 실습을 통해 패킷이동을 확인해 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 `ifconfig` 를 사용해 현재까지 주고받은 패킷의 개수를 확인해 보자. 받은 패킷(RX packets)은 현재까지 882개로 확인이 가능하다. 그리고 전송한 패킷(TX packets)은 28개이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ping1.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/srIjC/btsIcUKjwD8/aIo4XtflrUMetYJRt7xHD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/srIjC/btsIcUKjwD8/aIo4XtflrUMetYJRt7xHD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/srIjC/btsIcUKjwD8/aIo4XtflrUMetYJRt7xHD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsrIjC%2FbtsIcUKjwD8%2FaIo4XtflrUMetYJRt7xHD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;193&quot; data-filename=&quot;edited_ping1.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 우분투 환경으로 `ping`을 날려보자,&amp;nbsp; `ping`이란 간단하게 설명하면 네트워크의 상태를 외부에서 확인하기 위해 해당네트워크로 패킷을 보내고 다시 반환되어 오는 패킷을 분석해 주는 프로그램을 말한다. `ping을 날린다`, 혹은 `ping을 쏜다` 등의 표현으로 자주 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말보다는 보는 것이 더 이해가 빠르니 실습을 해보도록 하자. 일단 cmd창을 켠다. 나는 윈도 환경에서 wsl로 리눅스 환경을 구성했기 때문에 윈도우와 리눅스가 한 컴퓨터에서 실행되고 있지만 각각 별개의 네트워크를 가지고 있다. 때문에 cmd(윈도우)에서 리눅스(우분투)로 ping 테스트가 가능하다. wsl을 사용하지 않는다면 다른 기기 혹은 os에서 테스트 가능할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719388659317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ping ip주소&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ping2.png&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uP6Ts/btsIcjcX8Kb/7lgv1eqjUQL9md0J8v9Q91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uP6Ts/btsIcjcX8Kb/7lgv1eqjUQL9md0J8v9Q91/img.png&quot; data-alt=&quot;cmd(윈도우환경)에서 리눅스로 ping날리기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uP6Ts/btsIcjcX8Kb/7lgv1eqjUQL9md0J8v9Q91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuP6Ts%2FbtsIcjcX8Kb%2F7lgv1eqjUQL9md0J8v9Q91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;338&quot; data-filename=&quot;edited_ping2.png&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cmd(윈도우환경)에서 리눅스로 ping날리기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`ifconfig`를 통해 알아낸 ip주소를 가지고 cmd창에서 우분투로 ping을 날려본다. 총 4번의 패킷이 전송되었고 4번을 반환받았다는 것을 알 수 있다. ping명령어는 위와 같은 정보를 사용자에게 제공함으로 인해 외부에서 네트워크상태를 간편하게 알 수 있도록 해준다. ping을 악용하는 경우도 있어서 특정 서버에서는 막아놓기도 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 기억해야 할 것은 총 4번의 패킷을 보냈고 4번의 패킷을 받았다는 것이다. 이제 우분투에서 받은 패킷(RX packets)과 전송한 패킷(Tx packets)이 각각 4개씩 늘어났다면 두 개의 네트워크가 성공적으로 상호작용 했다고 생각할 수 있을 것이다.&amp;nbsp;직접 확인해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 우분투로 돌아와서 `ifconfig`를 쳐보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ping3.png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rnaae/btsIeg6sMaQ/lA8Z4i6diKzhWWTHYMaqQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rnaae/btsIeg6sMaQ/lA8Z4i6diKzhWWTHYMaqQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rnaae/btsIeg6sMaQ/lA8Z4i6diKzhWWTHYMaqQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRnaae%2FbtsIeg6sMaQ%2FlA8Z4i6diKzhWWTHYMaqQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;149&quot; data-filename=&quot;ping3.png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4개씩의 패킷만 이동할 줄 알았지만 실제로는 패킷이 더 많이 이동한 것을 확인할 수 있다. 예상이 틀렸다. 왜일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#tcpdump&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 일어나는 패킷의 이동을 확인하기 위해 사용하는 명령어가 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719389897362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo tcpdump -i 네트워크인터페이스명

sudo tcpdump -i eth0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 사용하면 실시간으로 패킷이 들어오고 나가는 것을 모니터링할 수 있다. 이 명령어를 통해 실시간으로 패킷흐름을 파악해 보자. tcpdump명령어를 사용한 후 cmd창에서 다시 우분투로 ping을 날려본다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_tcpdump.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v1tG3/btsIcqiE55X/IdVUc1pZk0IyvEFcmakFeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v1tG3/btsIcqiE55X/IdVUc1pZk0IyvEFcmakFeK/img.png&quot; data-alt=&quot;실시간 패킷이동 추적&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v1tG3/btsIcqiE55X/IdVUc1pZk0IyvEFcmakFeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv1tG3%2FbtsIcqiE55X%2FIdVUc1pZk0IyvEFcmakFeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;513&quot; data-filename=&quot;edited_tcpdump.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실시간 패킷이동 추적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소가 적나라하게 드러나 있어서 모자이크를 했다. 로그 내용자체보다는 주고받은 패킷의 양이 8개보다 많다는 사실만 알고 넘어가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 확인해 보니 실제 ping요청 외에도 다양한 패킷의 이동이 동시에 일어나는 것을 알 수 있었다. 내부에서 ping 이외에도 다른 네트워크 요청들이 보이지 않게 일어난 것이다. ping 명령어를 통해 ICMP Echo Request와 Echo Reply 패킷이 오고 가는 동안, DNS 역방향 조회, mDNS, IPv6 및 ARP와 관련된 추가적인 네트워크 활동이 발생한다는 것을 알 수 있었다. 이로 인해 예상보다 많은 패킷이 이동한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 ifconfig명령어를 통해 내부에서 네트워크상태를 확인하는 방법과 외부에서 네트워크를 확인하는 방법을 알아보았다. 또한 패킷의 이동이 실제로 일어나는 모습을 확인해 보았다. 다음 포스팅에서도 이어서 네트워크에 대한 리눅스 명령어들을 알아보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/Linux</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/20</guid>
      <comments>https://generalcoder.tistory.com/20#entry20comment</comments>
      <pubDate>Wed, 26 Jun 2024 17:32:30 +0900</pubDate>
    </item>
    <item>
      <title>[Linux]linux-ubuntu 20.04 실전 기본 명령어 -2(사용자 및 권한관리)</title>
      <link>https://generalcoder.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/18&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;2024.06.20 - [공부하자/Linux] - [Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템)&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;백엔드 개발자 로드맵을 보게 되면 basic 레벨에서 Git과 함께 Linux 학습이 위치해 있는 것을 볼 수 있다. 하지만 실제로 비전공자 입장에서 로드맵대로 git과 linux를 먼저 학습하는 것이 실효성이 &quot; data-og-host=&quot;generalcoder.tistory.com&quot; data-og-source-url=&quot;https://generalcoder.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/S5gic/hyWoGX9C4e/aQTmJ0Yl3asT3MxeNHMJPK/img.png?width=800&amp;amp;height=588&amp;amp;face=0_0_800_588,https://scrap.kakaocdn.net/dn/bZGRqN/hyWoLFb1Ke/yK1NDE7u5caTc0jCrCNnnK/img.png?width=800&amp;amp;height=588&amp;amp;face=0_0_800_588,https://scrap.kakaocdn.net/dn/gzXDg/hyWoNbTWrc/qa2Dr6K0VyS2tonS8DfzfK/img.png?width=1248&amp;amp;height=918&amp;amp;face=0_0_1248_918&quot; data-og-url=&quot;https://generalcoder.tistory.com/18&quot;&gt;&lt;a href=&quot;https://generalcoder.tistory.com/18&quot; target=&quot;_blank&quot; data-source-url=&quot;https://generalcoder.tistory.com/18&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/S5gic/hyWoGX9C4e/aQTmJ0Yl3asT3MxeNHMJPK/img.png?width=800&amp;amp;height=588&amp;amp;face=0_0_800_588,https://scrap.kakaocdn.net/dn/bZGRqN/hyWoLFb1Ke/yK1NDE7u5caTc0jCrCNnnK/img.png?width=800&amp;amp;height=588&amp;amp;face=0_0_800_588,https://scrap.kakaocdn.net/dn/gzXDg/hyWoNbTWrc/qa2Dr6K0VyS2tonS8DfzfK/img.png?width=1248&amp;amp;height=918&amp;amp;face=0_0_1248_918')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;[Linux]linux-ubuntu 20.04 실전 기본 명령어 -1(파일시스템)&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;백엔드 개발자 로드맵을 보게 되면 basic 레벨에서 Git과 함께 Linux 학습이 위치해 있는 것을 볼 수 있다. 하지만 실제로 비전공자 입장에서 로드맵대로 git과 linux를 먼저 학습하는 것이 실효성이 &lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;generalcoder.tistory.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #EF5369;&quot;&gt;**이전글**&lt;/span&gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 및 권한관리&lt;/h2&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 사용자 관리&amp;nbsp;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;#새로운 사용자 추가&lt;br&gt;useradd: 새로운 유저를 생성한다.&lt;br&gt;passwd: 유저패스워드를 지정 혹은 변경한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo useradd -[옵션] 생성할유저명
sudo passwd 유저명

sudo useradd -m highgarden
sudo passwd highgarden&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;*sudo: `sudo`란 Super User Do의 줄임말로 root계정의 권한으로 명령을 실행한다는 뜻이다. linux에서 sudo를 사용하게 되면 웬만한 작업은 대부분 `permission deny`없이 진행가능하다.&amp;nbsp;&lt;br&gt;*-m: `useradd`에서 `-m` 옵션을 주게되면 생성하는 user명으로 home경로에 디렉토리를 생성해 준다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT52qK/btsH7ZRduVm/9wnAyK5qOai05yQ70FQqQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT52qK/btsH7ZRduVm/9wnAyK5qOai05yQ70FQqQK/img.png&quot; data-alt=&quot;user생성과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT52qK/btsH7ZRduVm/9wnAyK5qOai05yQ70FQqQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT52qK%2FbtsH7ZRduVm%2F9wnAyK5qOai05yQ70FQqQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;132&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;user생성과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`highgarden` 이라는 user명으로 계정을 생성하려고 하니 root계정인 `garden`의 비밀번호를 요청하는 모습니다. 이후에 `passwd`명령어로 `highgarden` 계정에 비밀번호를 부여한다. 비밀번호입력과 확인절차까지 마치니 성공적으로 업데이트 되었다는 문구가 출력된다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHyKcq/btsH7EGyq9e/q4Jf0htHDf0rpktFRkBDk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHyKcq/btsH7EGyq9e/q4Jf0htHDf0rpktFRkBDk0/img.png&quot; data-alt=&quot;home에 새로 생성한 user디렉토리 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHyKcq/btsH7EGyq9e/q4Jf0htHDf0rpktFRkBDk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHyKcq%2FbtsH7EGyq9e%2Fq4Jf0htHDf0rpktFRkBDk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;146&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;home에 새로 생성한 user디렉토리 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;home 디렉토리로 가보니 새로운 유저의 디렉토리가 생성된 것을 알 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#사용자 정보 수정&lt;br&gt;usermod: 사용자 계정에 관련된 다양한 정보를 수정한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo usermod -[옵션] 그룹명 유저명

sudo usermod -aG sudo highgarden&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;*-a: `-G`옵션과 함께 사용되며 지정하는 그룹에 계정이 추가된다. 만약 `-a` 없이 `-G`만 사용된다면 지정된 그룹 외 다른 그룹에서는 계정이 모두 삭제된다. append의 a를 의미한다.&amp;nbsp;&lt;br&gt;*-G: 그룹에 계정을 배정한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqny4r/btsH5HZffqa/zL4csTPcYtW1vp7uZh4RzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqny4r/btsH5HZffqa/zL4csTPcYtW1vp7uZh4RzK/img.png&quot; data-alt=&quot;그룹추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqny4r/btsH5HZffqa/zL4csTPcYtW1vp7uZh4RzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqny4r%2FbtsH5HZffqa%2FzL4csTPcYtW1vp7uZh4RzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;410&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그룹추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`sudo`그룹에 highgarden계정을 추가(append)한다. cat /etc/group명령어를 실행하면 그룹목록을 확인할 수 있는데 사진 맨 아래 sudo 그룹에 highgarden이 잘 추가된 것을 확인할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#사용자 삭제&lt;br&gt;userdel: 사용자계정을 삭제한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo userdel -[옵션] 유저명

sudo userdel -r highgarden&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;*-r: 해당 사용자계정과 home디렉토리, mailspool을 함께 삭제한다. 앞서 계정을 생성하면서 home경로에 디렉토리를 추가했었다. `-r` 옵션을 주게 되면 계정삭제와 함께 관련 디렉토리와 mailspool을 함께 삭제해 준다. DBMS의 `CASCADE` 옵션과 비슷하다고 생각된다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paXoM/btsH6vjwr9E/P0wqsrTnuyro7lVcrbCXU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paXoM/btsH6vjwr9E/P0wqsrTnuyro7lVcrbCXU0/img.png&quot; data-alt=&quot;사용자계정 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paXoM/btsH6vjwr9E/P0wqsrTnuyro7lVcrbCXU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaXoM%2FbtsH6vjwr9E%2FP0wqsrTnuyro7lVcrbCXU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;455&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자계정 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자계정을 삭제하니 디렉토리도 삭제되었고 group에서도 삭제된 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 파일 권한 관리&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;#파일 권한 확인&lt;br&gt;ls -l: 해당디렉토리 혹은 파일의 권한을 확인한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;touch 파일명
ls -l 파일경로

touch highgarden.txt
ls -l highgarden.txt&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;일단 위에서 학습한 `touch`명령어로 txt파일을 하나 생성해 준다. 그다음 해당 파일을 `ls -l`로 조회해 보면 권한에 대한 내용이 출력되는 것을 볼 수 있다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rFGhC/btsH5HLI2nA/fnkVw1uQ2kpOCgARS5DMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rFGhC/btsH5HLI2nA/fnkVw1uQ2kpOCgARS5DMQk/img.png&quot; data-alt=&quot;파일 권한확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rFGhC/btsH5HLI2nA/fnkVw1uQ2kpOCgARS5DMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrFGhC%2FbtsH5HLI2nA%2FfnkVw1uQ2kpOCgARS5DMQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;245&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 권한확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`highgarden.txt`라는 파일을 생성 후 `ls` 명령어와 `ls -l`명령어를 각각 실행해 본다. `-l`옵션을 주게 되니 파일정보가 좀 더 상세하게 보이는 것을 알 수 있다. 그다음은 원하는 파일 하나만 권한정보를 확인할 수도 있다. 권한정보는 맨 앞 10자리의 알파벳 묶음을 통해서 알 수 있다. 뭔 외계어가 쓰여있나 싶을 수 있기 때문에 리눅스의 권한정보를 읽는 방법을 설명하겠다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#리눅스의 권한&lt;br&gt;리눅스의 권한정보는 총 10개의 문자를 갖는 문자열로 이루어져 있다. 예시를 통해 알아보자. 다음과 같은 권한정보를 가지고 해석해 보겠다.&lt;/p&gt;&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #009A87;&quot;&gt;rwx&lt;/span&gt; &lt;span style=&quot;color: #006DD7;&quot;&gt;r-x&lt;/span&gt; &lt;span style=&quot;color: #8A3DB6;&quot;&gt;r-x&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;-첫 번째 문자&lt;/span&gt;&lt;/b&gt;: 파일의 유형&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;- : 일반 파일&lt;/li&gt;&lt;li&gt;d : 디렉토리&lt;/li&gt;&lt;li&gt;l : 심볼릭 링크&lt;/li&gt;&lt;li&gt;c : 문자 장치&lt;/li&gt;&lt;li&gt;b : 블록 장치&lt;/li&gt;&lt;li&gt;p : 파이프&lt;/li&gt;&lt;li&gt;s : 소켓&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;-두 번째부터 열 번째 문자: 파일의 권한을 나타냄. 세 그룹으로 나누어짐.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #009A87;&quot;&gt;첫 번째 그룹 (rwx)&lt;/span&gt;&lt;/b&gt;: 소유자(owner)의 권한, 2~4 번째 문자열&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006DD7;&quot;&gt;두 번째 그룹 (r-x)&lt;/span&gt;&lt;/b&gt;: 그룹(group)의 권한, 5~7 번째 문자열&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #8A3DB6;&quot;&gt;세 번째 그룹 (r-x)&lt;/span&gt;&lt;/b&gt;: 기타 사용자(others)의 권한, 8~10 번째 문자열&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;-r m x 의미&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;r (read): 읽기 권한&lt;/li&gt;&lt;li&gt;w (write): 쓰기 권한&lt;/li&gt;&lt;li&gt;x (execute): 실행 권한&lt;/li&gt;&lt;li&gt;- (none): 권한 없음&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;위 정보를 통해 예시(&lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #009A87;&quot;&gt;rwx&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #006DD7;&quot;&gt;r-x&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8A3DB6;&quot;&gt;r-x&lt;/span&gt;&lt;/b&gt;)의 권한정보를 해석해 보자면 다음과 같다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;일반파일&lt;/span&gt;&lt;/b&gt;: 일반적인 파일(&lt;span style=&quot;color: #EE2323;&quot;&gt;-&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #009A87;&quot;&gt;소유자(owner)&lt;/span&gt;&lt;/b&gt;: 읽기, 쓰기, 실행 권한 (&lt;span style=&quot;color: #009A87;&quot;&gt;rwx&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006DD7;&quot;&gt;그룹(group)&lt;/span&gt;&lt;/b&gt;: 읽기, 실행 권한 (&lt;span style=&quot;color: #006DD7;&quot;&gt;r-x&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #8A3DB6;&quot;&gt;기타 사용자(others)&lt;/span&gt;&lt;/b&gt;: 읽기, 실행 권한 (&lt;span style=&quot;color: #8A3DB6;&quot;&gt;r-x&lt;/span&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;#파일 권한 변경&lt;br&gt;chmod: 파일의 권한을 변경한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;chmod 권한 파일명

chmod 755 highgarden.txt&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;권한정보는 `rmx`라는 문자열로 표현가능하지만 숫자로도 표현이 가능하다.&amp;nbsp;&lt;br&gt;1,2,4는 각각 2의 0승, 1승, 2승에 해당하는 수이다. 이 숫자들의 합으로 권한정보를 쉽게 표현할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;-1 2 4&amp;nbsp; 의미&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;1: 실행(x)&lt;/li&gt;&lt;li&gt;2: 쓰기(w)&lt;/li&gt;&lt;li&gt;4: 읽기(r)&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;각 숫자는 각각의 권한정보를 의미하는데 이 숫자들은 여러 조합으로 합쳤을 때 중복되는 숫자가 나오지 않는다. 때문에 숫자들의 합이 최대 3가지의 권한정보를 포함할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;-권한정보(1 2 4)의 합으로 표현된 3 5 7&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;3(1+2): 실행(x) + 쓰기(w)&lt;/li&gt;&lt;li&gt;5(1+4): 실행(x) + 읽기(r)&lt;/li&gt;&lt;li&gt;7(1+2+4): 실행(x) + 쓰기(w) + 읽기(r)&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이 정보를 바탕으로 `chmod 755`의 의미를 해석해 보자면, 소유자(rmx), 그룹(r-x), 기타 사용자(r-x)의 권한을 부여한다는 의미가 된다. 최소한의 텍스트로 많은 내용을 포함하기 위해 애썼다는 것을 알 수 있다. 하지만 진입장벽은 덤.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL7mI2/btsH7kavBFz/1qAllGk0OpXDcKLGoxyKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL7mI2/btsH7kavBFz/1qAllGk0OpXDcKLGoxyKu0/img.png&quot; data-alt=&quot;파일 권한변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL7mI2/btsH7kavBFz/1qAllGk0OpXDcKLGoxyKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL7mI2%2FbtsH7kavBFz%2F1qAllGk0OpXDcKLGoxyKu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;139&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 권한변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상했던 대로 `755`에 해당하는 권한이 파일에 부여된 것을 확인할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;#파일 소유자 변경&lt;br&gt;chown: 파일 소유자를 변경한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo chown 소유자:그룹 파일명

sudo useradd -m newuser
sudo passwd newuser

sudo chown newuser:newuser highgarden.txt&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서 생성한 사용자를 삭제했으니 다시 사용자를 생성해 주도록 한다. 예제에서는 `newuser`라는 이름으로 생성하였다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L9b9o/btsH6LsWBv6/3UlKIkoZSXfHDC97zsbggk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L9b9o/btsH6LsWBv6/3UlKIkoZSXfHDC97zsbggk/img.png&quot; data-alt=&quot;newuser생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L9b9o/btsH6LsWBv6/3UlKIkoZSXfHDC97zsbggk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL9b9o%2FbtsH6LsWBv6%2F3UlKIkoZSXfHDC97zsbggk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;149&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;newuser생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 `highgarden.txt`의 소유주는 `garden`이고 그룹도 `garden`으로 되어있는 것을 확인할 수 있다. 새로운 계정으로 소유권을 넘기기 위해서 계정을 생성해 준다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b79Kqw/btsH6O4jBLO/sr80rkHVGsSZp46mQmNop1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b79Kqw/btsH6O4jBLO/sr80rkHVGsSZp46mQmNop1/img.png&quot; data-alt=&quot;소유주 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b79Kqw/btsH6O4jBLO/sr80rkHVGsSZp46mQmNop1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb79Kqw%2FbtsH6O4jBLO%2Fsr80rkHVGsSZp46mQmNop1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;98&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소유주 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`chown`명령어로 `newuser`에게 소유권을 넘긴 후 권한을 조회해 보니 소유권 이전이 잘 완료되었다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부하자/Linux</category>
      <category>Linux</category>
      <category>리눅스</category>
      <category>사용자계정</category>
      <category>실전명령어</category>
      <category>실전예제</category>
      <category>우분투</category>
      <category>파일권한관리</category>
      <author>하이가든</author>
      <guid isPermaLink="true">https://generalcoder.tistory.com/19</guid>
      <comments>https://generalcoder.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 21 Jun 2024 11:39:26 +0900</pubDate>
    </item>
  </channel>
</rss>