<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이제 반 지났다...</title>
    <link>https://amnesia.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 7 Aug 2026 11:25:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>a_mnesia</managingEditor>
    <image>
      <title>이제 반 지났다...</title>
      <url>https://tistory1.daumcdn.net/tistory/5750772/attach/27b73d447ee248b78daa8f01c0c46cd5</url>
      <link>https://amnesia.tistory.com</link>
    </image>
    <item>
      <title>리눅스에서 로그 파일의 1000번째 줄부터 2000번째 줄까지를 추출하여 별도 파일로 저장</title>
      <link>https://amnesia.tistory.com/121</link>
      <description>&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;1000번째 줄부터 2000번째 줄까지&lt;/b&gt;를 추출하여 &lt;b&gt;별도 파일로 저장&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;106&quot; data-start=&quot;103&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;131&quot; data-start=&quot;108&quot; data-ke-size=&quot;size26&quot;&gt;✅ 방법 1: sed 명령어 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757058905949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sed -n '1000,2000p' /path/to/source.log &amp;gt; /path/to/output.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;구성설명
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;343&quot; data-start=&quot;208&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;343&quot; data-start=&quot;236&quot;&gt;
&lt;tr data-end=&quot;264&quot; data-start=&quot;236&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;243&quot; data-start=&quot;236&quot;&gt;-n&lt;/td&gt;
&lt;td data-end=&quot;264&quot; data-start=&quot;243&quot; data-col-size=&quot;sm&quot;&gt;출력 억제 (선택한 줄만 출력)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;308&quot; data-start=&quot;265&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;282&quot; data-start=&quot;265&quot;&gt;'1000,2000p'&lt;/td&gt;
&lt;td data-end=&quot;308&quot; data-start=&quot;282&quot; data-col-size=&quot;sm&quot;&gt;1000번 줄부터 2000번 줄까지 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;343&quot; data-start=&quot;309&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;326&quot; data-start=&quot;309&quot;&gt;&amp;gt; output.log&lt;/td&gt;
&lt;td data-end=&quot;343&quot; data-start=&quot;326&quot; data-col-size=&quot;sm&quot;&gt;결과를 별도 파일로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;348&quot; data-start=&quot;345&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;373&quot; data-start=&quot;350&quot; data-ke-size=&quot;size26&quot;&gt;✅ 방법 2: awk 명령어 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757058932229&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;awk 'NR&amp;gt;=1000 &amp;amp;&amp;amp; NR&amp;lt;=2000' /path/to/source.log &amp;gt; /path/to/output.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;509&quot; data-start=&quot;457&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;473&quot; data-start=&quot;457&quot;&gt;NR: 현재 라인 번호&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;474&quot;&gt;NR &amp;gt;= 1000 &amp;amp;&amp;amp; NR &amp;lt;= 2000인 줄만 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;550&quot; data-start=&quot;511&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;550&quot; data-start=&quot;513&quot; data-ke-size=&quot;size16&quot;&gt;awk는 필터링 조건을 더 추가하고 싶을 때 확장성이 좋습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;555&quot; data-start=&quot;552&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;564&quot; data-start=&quot;557&quot; data-ke-size=&quot;size26&quot;&gt;✅ 예제&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757058957243&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sed -n '1000,2000p' /var/log/syslog &amp;gt; ~/logs/syslog_chunk.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;643&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757058976181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;awk 'NR&amp;gt;=1000 &amp;amp;&amp;amp; NR&amp;lt;=2000' /var/log/syslog &amp;gt; ~/logs/syslog_chunk.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;730&quot; data-start=&quot;727&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;754&quot; data-start=&quot;732&quot; data-ke-size=&quot;size26&quot;&gt;  참고: 추출 대상 줄 수 확인&lt;/h2&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;756&quot; data-ke-size=&quot;size16&quot;&gt;전체 라인 수를 먼저 알고 싶다면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;wc&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -l /path/to/source.log&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1757058993125&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wc -l /path/to/source.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;819&quot; data-start=&quot;816&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;831&quot; data-start=&quot;821&quot; data-ke-size=&quot;size26&quot;&gt;  추가 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;902&quot; data-start=&quot;833&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;902&quot; data-start=&quot;833&quot;&gt;파일에 &lt;b&gt;헤더 라인&lt;/b&gt;이 있는 경우, 첫 줄을 유지하고 1000~2000줄을 추가하고 싶다면 다음과 같이 조합도 가능:&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059123675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(head -n 1 /path/to/source.log &amp;amp;&amp;amp; sed -n '1000,2000p' /path/to/source.log) &amp;gt; output_with_header.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1080&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1080&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;로그 파일에서 특정 문자열을 포함한 줄만 추출&lt;/b&gt;하거나, &lt;b&gt;압축된 로그(.gz 등)에서 직접 검색&lt;/b&gt;하는 방법&lt;/h3&gt;
&lt;h2 data-end=&quot;112&quot; data-start=&quot;88&quot; data-ke-size=&quot;size26&quot;&gt;✅ 1. 특정 문자열 포함한 줄만 추출&lt;/h2&gt;
&lt;h3 data-end=&quot;134&quot; data-start=&quot;114&quot; data-ke-size=&quot;size23&quot;&gt;  grep 명령어 사용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059261302&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep &quot;에러코드123&quot; /path/to/logfile.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;옵션설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;285&quot; data-start=&quot;185&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;285&quot; data-start=&quot;213&quot;&gt;
&lt;tr data-end=&quot;241&quot; data-start=&quot;213&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;227&quot; data-start=&quot;213&quot;&gt;&quot;에러코드123&quot;&lt;/td&gt;
&lt;td data-end=&quot;241&quot; data-start=&quot;227&quot; data-col-size=&quot;sm&quot;&gt;찾고자 하는 문자열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;285&quot; data-start=&quot;242&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;267&quot; data-start=&quot;242&quot;&gt;/path/to/logfile.log&lt;/td&gt;
&lt;td data-end=&quot;285&quot; data-start=&quot;267&quot; data-col-size=&quot;sm&quot;&gt;검색 대상 로그 파일 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;316&quot; data-start=&quot;287&quot; data-ke-size=&quot;size23&quot;&gt;  여러 키워드 중 하나라도 포함된 줄 검색&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059281046&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -E &quot;ERROR|FATAL|PANIC&quot; logfile.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;413&quot; data-start=&quot;371&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;400&quot; data-start=&quot;371&quot;&gt;-E는 &lt;b&gt;extended regex&lt;/b&gt; 사용&lt;/li&gt;
&lt;li data-end=&quot;413&quot; data-start=&quot;401&quot;&gt;|는 OR 조건&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;418&quot; data-start=&quot;415&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;443&quot; data-start=&quot;420&quot; data-ke-size=&quot;size23&quot;&gt;  추출 결과를 별도 파일로 저장&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059300199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep &quot;에러코드123&quot; logfile.log &amp;gt; filtered.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;503&quot; data-start=&quot;500&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;523&quot; data-start=&quot;505&quot; data-ke-size=&quot;size23&quot;&gt;  줄 번호도 함께 출력&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059315918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -n &quot;에러코드123&quot; logfile.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;571&quot; data-start=&quot;568&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;600&quot; data-start=&quot;573&quot; data-ke-size=&quot;size26&quot;&gt;✅ 2. 압축된 로그(.gz)에서 직접 검색&lt;/h2&gt;
&lt;h3 data-end=&quot;619&quot; data-start=&quot;602&quot; data-ke-size=&quot;size23&quot;&gt;  zgrep 사용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059333657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zgrep &quot;에러코드123&quot; logfile.log.gz&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;706&quot; data-start=&quot;665&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;706&quot; data-start=&quot;665&quot;&gt;zgrep은 gzip 파일에서 &lt;b&gt;압축 해제 없이 직접 검색&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;740&quot; data-start=&quot;708&quot; data-ke-size=&quot;size23&quot;&gt;  여러 키워드 OR 검색 (zgrep -E)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059346839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zgrep -E &quot;ERROR|FATAL|PANIC&quot; logfile.log.gz&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;802&quot; data-start=&quot;799&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;826&quot; data-start=&quot;804&quot; data-ke-size=&quot;size23&quot;&gt;  줄 번호까지 포함하고 싶다면&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059361880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zcat logfile.log.gz | grep -n &quot;에러코드123&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;910&quot; data-start=&quot;881&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;910&quot; data-start=&quot;881&quot;&gt;zcat으로 압축 해제 후 grep을 조합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;915&quot; data-start=&quot;912&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;950&quot; data-start=&quot;917&quot; data-ke-size=&quot;size23&quot;&gt;  1000~2000줄 사이에서 특정 문자열만 검색&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059383148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sed -n '1000,2000p' logfile.log | grep &quot;에러코드123&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1026&quot; data-start=&quot;1014&quot; data-ke-size=&quot;size16&quot;&gt;또는 압축 파일이라면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1757059395511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zcat logfile.log.gz | sed -n '1000,2000p' | grep &quot;에러코드123&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1103&quot; data-start=&quot;1100&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1113&quot; data-start=&quot;1105&quot; data-ke-size=&quot;size26&quot;&gt;  정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;목적명령어 예시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1387&quot; data-start=&quot;1115&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1387&quot; data-start=&quot;1154&quot;&gt;
&lt;tr data-end=&quot;1199&quot; data-start=&quot;1154&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1171&quot; data-start=&quot;1154&quot;&gt;일반 로그에서 문자열 검색&lt;/td&gt;
&lt;td data-end=&quot;1199&quot; data-start=&quot;1171&quot; data-col-size=&quot;sm&quot;&gt;grep &quot;문자열&quot; logfile.log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1249&quot; data-start=&quot;1200&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1217&quot; data-start=&quot;1200&quot;&gt;압축 로그에서 문자열 검색&lt;/td&gt;
&lt;td data-end=&quot;1249&quot; data-start=&quot;1217&quot; data-col-size=&quot;sm&quot;&gt;zgrep &quot;문자열&quot; logfile.log.gz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1294&quot; data-start=&quot;1250&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1263&quot; data-start=&quot;1250&quot;&gt;줄 번호 포함 검색&lt;/td&gt;
&lt;td data-end=&quot;1294&quot; data-start=&quot;1263&quot; data-col-size=&quot;sm&quot;&gt;grep -n &quot;문자열&quot; logfile.log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1356&quot; data-start=&quot;1295&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1310&quot; data-start=&quot;1295&quot;&gt;특정 줄 범위에서 검색&lt;/td&gt;
&lt;td data-end=&quot;1341&quot; data-start=&quot;1310&quot; data-col-size=&quot;sm&quot;&gt;`sed -n '1000,2000p' logfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1387&quot; data-start=&quot;1357&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1365&quot; data-start=&quot;1357&quot;&gt;결과 저장&lt;/td&gt;
&lt;td data-end=&quot;1387&quot; data-start=&quot;1365&quot; data-col-size=&quot;sm&quot;&gt;... &amp;gt; output.log&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1483&quot; data-start=&quot;1394&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1080&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>python/tips</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/121</guid>
      <comments>https://amnesia.tistory.com/121#entry121comment</comments>
      <pubDate>Fri, 5 Sep 2025 17:03:32 +0900</pubDate>
    </item>
    <item>
      <title>Linux에서 디렉토리나 파일을 최근 변경된 순서로 정렬하여 리스트</title>
      <link>https://amnesia.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서 디렉토리나 파일을 &lt;b&gt;최근 변경된 순서로 정렬하여 리스트&lt;/b&gt;하고 싶다면, ls 명령어에 다음 옵션들을 조합해서 사용하면 됩니다:&lt;/p&gt;
&lt;h2 data-end=&quot;104&quot; data-start=&quot;88&quot; data-ke-size=&quot;size26&quot;&gt;가장 기본적인 명령어&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1754467262702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -lt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;옵션의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;227&quot; data-start=&quot;126&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;227&quot; data-start=&quot;154&quot;&gt;
&lt;tr data-end=&quot;183&quot; data-start=&quot;154&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;161&quot; data-start=&quot;154&quot;&gt;-l&lt;/td&gt;
&lt;td data-end=&quot;183&quot; data-start=&quot;161&quot; data-col-size=&quot;sm&quot;&gt;상세 목록(long format)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;227&quot; data-start=&quot;184&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;191&quot; data-start=&quot;184&quot;&gt;-t&lt;/td&gt;
&lt;td data-end=&quot;227&quot; data-start=&quot;191&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;최종 수정 시간(descending)&lt;/b&gt; 기준으로 정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;266&quot; data-start=&quot;229&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;266&quot; data-start=&quot;231&quot; data-ke-size=&quot;size16&quot;&gt;  결과는 &lt;b&gt;최근에 수정된 파일이 가장 위에&lt;/b&gt; 표시됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;292&quot; data-start=&quot;273&quot; data-ke-size=&quot;size26&quot;&gt;디렉토리만 보고 싶다면?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1754467227708&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -ltd */&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;405&quot; data-start=&quot;318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;359&quot; data-start=&quot;318&quot;&gt;*/는 현재 디렉토리 내의 &lt;b&gt;하위 디렉토리만&lt;/b&gt; 대상으로 리스트업&lt;/li&gt;
&lt;li data-end=&quot;405&quot; data-start=&quot;360&quot;&gt;-d는 디렉토리 자체에 대한 정보만 출력 (디렉토리 내부 내용 출력 방지)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;410&quot; data-start=&quot;407&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;451&quot; data-start=&quot;412&quot; data-ke-size=&quot;size26&quot;&gt;수정 시간 말고 &quot;변경 시간(ctime)&quot; 기준 정렬하려면?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1754467199454&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -ltc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;541&quot; data-start=&quot;474&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;541&quot; data-start=&quot;474&quot;&gt;-c: inode 변경 시간(change time) 기준 정렬&lt;br /&gt;(예: 권한 변경, 소유자 변경 등도 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;573&quot; data-start=&quot;548&quot; data-ke-size=&quot;size26&quot;&gt;서브 디렉토리 포함 전체 탐색하려면&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1754467140914&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -type f -printf &quot;%T@ %Tc %p\n&quot; | sort -n&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;788&quot; data-start=&quot;636&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;788&quot; data-start=&quot;664&quot;&gt;
&lt;tr data-end=&quot;686&quot; data-start=&quot;664&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;676&quot; data-start=&quot;664&quot;&gt;-type f&lt;/td&gt;
&lt;td data-end=&quot;686&quot; data-start=&quot;676&quot; data-col-size=&quot;sm&quot;&gt;파일만 찾음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;716&quot; data-start=&quot;687&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;695&quot; data-start=&quot;687&quot;&gt;%T@&lt;/td&gt;
&lt;td data-end=&quot;716&quot; data-start=&quot;695&quot; data-col-size=&quot;sm&quot;&gt;epoch 시간 출력 (정렬용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;746&quot; data-start=&quot;717&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;725&quot; data-start=&quot;717&quot;&gt;%Tc&lt;/td&gt;
&lt;td data-end=&quot;746&quot; data-start=&quot;725&quot; data-col-size=&quot;sm&quot;&gt;human-readable 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;763&quot; data-start=&quot;747&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;754&quot; data-start=&quot;747&quot;&gt;%p&lt;/td&gt;
&lt;td data-end=&quot;763&quot; data-start=&quot;754&quot; data-col-size=&quot;sm&quot;&gt;파일 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;788&quot; data-start=&quot;764&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;776&quot; data-start=&quot;764&quot;&gt;sort -n&lt;/td&gt;
&lt;td data-end=&quot;788&quot; data-start=&quot;776&quot; data-col-size=&quot;sm&quot;&gt;시간 오름차순 정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;829&quot; data-start=&quot;790&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; sort -nr로 바꾸면 &lt;b&gt;최근 변경된 순&lt;/b&gt;으로 정렬됩니다.&lt;/p&gt;
&lt;h2 data-end=&quot;866&quot; data-start=&quot;836&quot; data-ke-size=&quot;size26&quot;&gt;전체 예시: 최근 변경된 디렉토리 Top 5&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -ltd -- */ | &lt;/span&gt;&lt;span&gt;&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -n 5&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1754467172745&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -type f -printf &quot;%T@ %Tc %p\n&quot; | sort -n&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;927&quot; data-start=&quot;912&quot; data-ke-size=&quot;size26&quot;&gt;요약 명령어 모음&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;목적명령어
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1126&quot; data-start=&quot;929&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1126&quot; data-start=&quot;960&quot;&gt;
&lt;tr data-end=&quot;989&quot; data-start=&quot;960&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;977&quot; data-start=&quot;960&quot;&gt;전체 파일/디렉토리 변경순&lt;/td&gt;
&lt;td data-end=&quot;989&quot; data-start=&quot;977&quot; data-col-size=&quot;sm&quot;&gt;ls -lt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1018&quot; data-start=&quot;990&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1002&quot; data-start=&quot;990&quot;&gt;디렉토리만 최근순&lt;/td&gt;
&lt;td data-end=&quot;1018&quot; data-start=&quot;1002&quot; data-col-size=&quot;sm&quot;&gt;ls -ltd */&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1049&quot; data-start=&quot;1019&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1036&quot; data-start=&quot;1019&quot;&gt;변경시간(ctime) 기준&lt;/td&gt;
&lt;td data-end=&quot;1049&quot; data-start=&quot;1036&quot; data-col-size=&quot;sm&quot;&gt;ls -ltc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1126&quot; data-start=&quot;1050&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1072&quot; data-start=&quot;1050&quot;&gt;서브디렉토리 포함 전체 파일 변경순&lt;/td&gt;
&lt;td data-end=&quot;1113&quot; data-start=&quot;1072&quot; data-col-size=&quot;sm&quot;&gt;`find . -type f -printf &quot;%T@ %Tc %p\n&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1193&quot; data-start=&quot;1133&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>python/tips</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/120</guid>
      <comments>https://amnesia.tistory.com/120#entry120comment</comments>
      <pubDate>Wed, 6 Aug 2025 17:01:19 +0900</pubDate>
    </item>
    <item>
      <title>Linux 명령어 (파일의 라인수, CSV파일 읽기 및 별도파일생성)</title>
      <link>https://amnesia.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Linux lsyncd log 파일 초기화&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-end=&quot;103&quot; data-start=&quot;67&quot; data-ke-size=&quot;size26&quot;&gt;1. : &amp;gt; 연산자 사용 (내용만 비우고 파일 유지)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551671663&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;: &amp;gt; /var/log/lsyncd/lsyncd.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;250&quot; data-start=&quot;149&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;184&quot; data-start=&quot;149&quot;&gt;파일 내용만 모두 지우고, &lt;b&gt;파일 자체는 그대로 유지&lt;/b&gt;됨&lt;/li&gt;
&lt;li data-end=&quot;208&quot; data-start=&quot;185&quot;&gt;touch와 달리 변경시간은 갱신됨&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;209&quot;&gt;프로세스가 계속해서 이 파일을 로그로 쓰는 경우에도 안전하게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;281&quot; data-start=&quot;257&quot; data-ke-size=&quot;size26&quot;&gt;2. truncate 명령 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551693474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;truncate -s 0 /var/log/lsyncd/lsyncd.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;395&quot; data-start=&quot;337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;363&quot; data-start=&quot;337&quot;&gt;파일의 &lt;b&gt;사이즈를 0으로 줄여 초기화&lt;/b&gt;함&lt;/li&gt;
&lt;li data-end=&quot;395&quot; data-start=&quot;364&quot;&gt;동일하게 내용만 삭제, 권한/소유자/경로 그대로 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;422&quot; data-start=&quot;402&quot; data-ke-size=&quot;size26&quot;&gt;3. echo 명령 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551733050&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;&quot; &amp;gt; /var/log/lsyncd/lsyncd.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;493&quot; data-start=&quot;474&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;493&quot; data-start=&quot;474&quot;&gt;빈 문자열을 덮어씌워 내용 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;510&quot; data-start=&quot;500&quot; data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;634&quot; data-start=&quot;512&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;512&quot;&gt;로그 파일을 삭제(rm)하고 새로 만드는 것은 서비스나 데몬이 &lt;b&gt;파일 핸들 유지 중일 경우 로그 기록이 끊기는 문제&lt;/b&gt;가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;634&quot; data-start=&quot;597&quot;&gt;따라서 &lt;b&gt;파일 삭제보다는 내용만 비우는 방법이 안전&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&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;&lt;b&gt;리눅스에서 각 파일의 line 수를 확인하는 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-end=&quot;106&quot; data-start=&quot;84&quot; data-ke-size=&quot;size26&quot;&gt;1. 단일 파일의 라인 수 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551861587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wc -l filename.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;180&quot; data-start=&quot;140&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;180&quot; data-start=&quot;140&quot;&gt;출력 예시:&lt;br /&gt;123 filename.txt &amp;rarr; 총 123줄&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;221&quot; data-start=&quot;187&quot; data-ke-size=&quot;size26&quot;&gt;2. 현재 디렉토리의 모든 파일에 대한 라인 수 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551881604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wc -l *&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;362&quot; data-start=&quot;244&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;286&quot; data-start=&quot;244&quot;&gt;각 파일의 라인 수와 파일명이 나열되고, 마지막에 전체 합계가 나옵니다.&lt;/li&gt;
&lt;li data-end=&quot;362&quot; data-start=&quot;287&quot;&gt;디렉토리 포함시 에러 발생 가능성이 있으므로 &lt;b&gt;텍스트 파일만 지정&lt;/b&gt;하려면:
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752551917416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wc -l *.txt&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;407&quot; data-start=&quot;369&quot; data-ke-size=&quot;size26&quot;&gt;3. 하위 디렉토리 포함 모든 파일 라인 수 확인 (재귀적)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551956452&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -type f -exec wc -l {} +&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;530&quot; data-start=&quot;454&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;470&quot; data-start=&quot;454&quot;&gt;.: 현재 디렉토리부터&lt;/li&gt;
&lt;li data-end=&quot;490&quot; data-start=&quot;471&quot;&gt;-type f: 파일만 검색&lt;/li&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;491&quot;&gt;-exec wc -l {}: 각 파일에 대해 wc -l 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;571&quot; data-start=&quot;537&quot; data-ke-size=&quot;size26&quot;&gt;4. 결과를 정렬하여 출력 (라인 수 기준 내림차순)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752551985772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -type f -exec wc -l {} + | sort -nr&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;664&quot; data-start=&quot;634&quot; data-ke-size=&quot;size26&quot;&gt;5. 특정 확장자만 필터링 (예: .py)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552008641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -name &quot;*.py&quot; -type f -exec wc -l {} + | sort -nr&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;761&quot; data-start=&quot;740&quot; data-ke-size=&quot;size26&quot;&gt;  참고: 라인 수만 합산하려면&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552026220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -type f -name &quot;*.java&quot; -exec cat {} + | wc -l&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;868&quot; data-start=&quot;829&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;868&quot; data-start=&quot;829&quot;&gt;모든 .java 파일의 라인을 합쳐서 총 라인 수만 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752552617976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find . -name &quot;*.tpl.html&quot; -type f -exec wc -l {} + | sort -nr
find . -name &quot;*.tpl.html&quot; -exec wc -l {} + | sort -nr

라인수만계산
find . -type f -name &quot;*.tpl.html&quot; -exec cat {} + | wc -l
find . -type f -name &quot;*.tpl.html&quot; -exec wc -l {} + | sort -nr&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;linux csv파일 상위 10개 라인만 조회하는 명령어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 **CSV 파일의 상위 10개 라인(행)**만 조회하려면, 일반적으로 head 명령어를 사용합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;81&quot; data-start=&quot;70&quot; data-ke-size=&quot;size26&quot;&gt;기본 명령어&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552100719&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head -n 10 yourfile.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;197&quot; data-start=&quot;120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;158&quot; data-start=&quot;120&quot;&gt;yourfile.csv 파일의 &lt;b&gt;앞 10줄&lt;/b&gt;을 출력합니다.&lt;/li&gt;
&lt;li data-end=&quot;197&quot; data-start=&quot;159&quot;&gt;-n 뒤에 원하는 숫자를 지정하면 해당 줄 수만큼 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;212&quot; data-start=&quot;204&quot; data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552115313&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head -n 10 customers.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;298&quot; data-start=&quot;252&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; customers.csv 파일의 1행(헤더 포함)부터 10행까지 보여줍니다.&lt;/p&gt;
&lt;h2 data-end=&quot;335&quot; data-start=&quot;305&quot; data-ke-size=&quot;size26&quot;&gt;✅ 헤더 제외 상위 10개 데이터만 보고 싶을 때&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552143764&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -n +2 yourfile.csv | head -n 10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;463&quot; data-start=&quot;387&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;428&quot; data-start=&quot;387&quot;&gt;tail -n +2: 2번째 줄부터 끝까지 출력 (즉, 헤더 제외)&lt;/li&gt;
&lt;li data-end=&quot;463&quot; data-start=&quot;429&quot;&gt;그 후 head -n 10으로 상위 10줄을 자릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CSV 파일의 상위 10개 라인만 추출해서 새로운 파일로 저장&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-end=&quot;92&quot; data-start=&quot;67&quot; data-ke-size=&quot;size26&quot;&gt;head 명령어 + 리디렉션 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -n 10 original.csv &amp;gt; top10.csv &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;232&quot; data-start=&quot;143&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;175&quot; data-start=&quot;143&quot;&gt;original.csv의 &lt;b&gt;앞 10줄&lt;/b&gt;을 읽어서&lt;/li&gt;
&lt;li data-end=&quot;208&quot; data-start=&quot;176&quot;&gt;top10.csv라는 &lt;b&gt;새 파일에 저장&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;232&quot; data-start=&quot;209&quot;&gt;기존 파일이 있을 경우 덮어씌워집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;269&quot; data-start=&quot;239&quot; data-ke-size=&quot;size26&quot;&gt;헤더 제외하고 상위 10개 데이터만 저장하려면&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552209012&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head -n 10 original.csv &amp;gt; top10.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;395&quot; data-start=&quot;342&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;372&quot; data-start=&quot;342&quot;&gt;2번째 줄부터 읽은 뒤 상위 10줄만 추출하여 저장&lt;/li&gt;
&lt;li data-end=&quot;395&quot; data-start=&quot;373&quot;&gt;보통 &lt;b&gt;데이터만 필요할 때&lt;/b&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;447&quot; data-start=&quot;402&quot; data-ke-size=&quot;size26&quot;&gt;헤더 포함 + 상위 10개 데이터 저장 (즉, 11줄: 헤더 + 10줄)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752552246609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(head -n 1 original.csv &amp;amp;&amp;amp; tail -n +2 original.csv | head -n 10) &amp;gt; top10_with_header.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;649&quot; data-start=&quot;551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;576&quot; data-start=&quot;551&quot;&gt;head -n 1: 헤더 1줄 추출&lt;/li&gt;
&lt;li data-end=&quot;618&quot; data-start=&quot;577&quot;&gt;tail -n +2 | head -n 10: 데이터 10줄 추출&lt;/li&gt;
&lt;li data-end=&quot;649&quot; data-start=&quot;619&quot;&gt;전체를 ()로 묶고 &amp;gt;로 새로운 파일에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>python/tips</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/119</guid>
      <comments>https://amnesia.tistory.com/119#entry119comment</comments>
      <pubDate>Tue, 15 Jul 2025 13:05:19 +0900</pubDate>
    </item>
    <item>
      <title>GCash</title>
      <link>https://amnesia.tistory.com/118</link>
      <description>&lt;div id=&quot;content&quot; data-testid=&quot;page-content-only&quot; data-inline-comments-target=&quot;true&quot;&gt;
&lt;div id=&quot;main-content&quot; data-test-appearance=&quot;full-page&quot; data-vc=&quot;pageContentRendererTestId&quot; data-testid=&quot;pageContentRendererTestId&quot;&gt;
&lt;div style=&quot;color: #292a2e;&quot;&gt;
&lt;p data-renderer-start-pos=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;GCash는 &lt;b&gt;필리핀 최대 모바일 지갑 서비스&lt;/b&gt;로, &lt;b&gt;Globe Fintech Innovations, Inc.&lt;/b&gt; (브랜드명 &lt;b&gt;Mynt&lt;/b&gt;)에 속해 있으며, 운영은 자회사인 &lt;b&gt;G‑Xchange, Inc.&lt;/b&gt; (GXI)가 담당하고 있습니다 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://en.wikipedia.org/wiki/GCash?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;tribune.net.ph+15en.wikipedia.org+15new.gcash.com+15&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot; -GCash:-회사-개요&quot; style=&quot;color: #292a2e;&quot; data-renderer-start-pos=&quot;179&quot; data-ke-size=&quot;size26&quot;&gt;GCash: 회사 개요&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span data-testid=&quot;visually-hidden-heading-anchor&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스&lt;/b&gt;: 송금, 결제, 송금, 쇼핑, 투자, 보험 등 금융 기능 제공 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://new.gcash.com/about-us?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;datanyze.com+2new.gcash.com+2stlpartners.com+2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출시&lt;/b&gt;: 2004년 10월 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://en.wikipedia.org/wiki/GCash?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;cgaa.org+2en.wikipedia.org+2chrisgarin.com+2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가입자 수&lt;/b&gt;: 2023년 기준 약 8,100만명 사용 중 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://www.mynt.xyz/newsroom/gcash-valuation-soars-to-5-billion?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;mynt.xyz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot; -소유주-및-주요-주주-구조&quot; style=&quot;color: #292a2e;&quot; data-renderer-start-pos=&quot;393&quot; data-ke-size=&quot;size26&quot;&gt;소유주 및 주요 주주 구조&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span data-testid=&quot;visually-hidden-heading-anchor&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-renderer-start-pos=&quot;412&quot; data-ke-size=&quot;size16&quot;&gt;GCash의 모회사 &lt;b&gt;Mynt&lt;/b&gt;는 &lt;b&gt;Globe Telecom&lt;/b&gt; 계열의 &lt;b&gt;917Ventures&lt;/b&gt;가 설립하고, &lt;b&gt;Ant Group(Alibaba 그룹 계열사)&lt;/b&gt;, &lt;b&gt;Ayala Corporation&lt;/b&gt;, 그리고 &lt;b&gt;Globe Telecom&lt;/b&gt;이 공동 투자한 &lt;b&gt;합작법인(JV)&lt;/b&gt; 구조입니다 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://en.wikipedia.org/wiki/GCash?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;growjo.com+15en.wikipedia.org+15reuters.com+15&lt;/a&gt;.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Globe Telecom&lt;/b&gt;: 통신업체이며, 917Ventures의 모회사&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ant Group&lt;/b&gt;: Alibaba 그룹 계열로, Alipay 운영사&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ayala Corporation&lt;/b&gt;: 필리핀 재계의 대표적인 대기업으로, Mynt 지분율은 약 13% (2024년 추가 투자 기준) &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://www.business-news-asia.com/284-ayala-corporation-to-increase-stake-in-gcash-parent-company-mynt/?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;marketech-apac.com+3business-news-asia.com+3reuters.com+3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mitsubishi UFJ Financial Group (MUFG)&lt;/b&gt;: 2024~2025년 중 &lt;b&gt;8% 지분&lt;/b&gt; 추가 확보, Mynt의 가치를 약 50억 달러로 평가 &lt;a style=&quot;color: #1868db;&quot; href=&quot;https://marketech-apac.com/gcash-parent-company-mynt-surges-to-5-billion-valuation-with-new-investments-from-ayala-mufg/?utm_source=chatgpt.com&quot; data-renderer-mark=&quot;true&quot;&gt;stlpartners.com+15marketech-apac.com+15mb.com.ph+15&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-renderer-start-pos=&quot;964&quot; data-ke-size=&quot;size16&quot;&gt;결론적으로 현재 주요 주주는 &lt;b&gt;Globe Telecom&lt;/b&gt; (via 917Ventures), &lt;b&gt;Ant Group&lt;/b&gt;, &lt;b&gt;Ayala&lt;/b&gt;, 그리고 &lt;b&gt;MUFG&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h2 id=&quot; -요약-정리&quot; style=&quot;color: #292a2e;&quot; data-renderer-start-pos=&quot;1046&quot; data-ke-size=&quot;size26&quot;&gt;요약 정리&lt;/h2&gt;
&lt;div data-testid=&quot;table-container&quot; data-layout=&quot;default&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-local-id=&quot;cb9827dd-bc76-44f2-a90e-3728eaac0e58&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;회사명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Globe Fintech Innovations, Inc. (브랜드명: Mynt)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;운영 서비스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;G-Xchange, Inc. (GCash 서비스)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;서비스 시작&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;2004년 10월&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;주요 주주&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Globe Telecom (through 917Ventures), Ant Group, Ayala Corporation (~13%), MUFG (~8%)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;Valuation&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;약 50억 달러 (2024)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ssr-placeholder-replace=&quot;-JIDW:4y5Pz:qz-Pe:F4Zdx-0&quot; data-vc=&quot;view-page-labels-container&quot; data-testid=&quot;view-page-labels-container&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;color: #292a2e;&quot; data-value=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #505258;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Cloud/Alibaba</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/118</guid>
      <comments>https://amnesia.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 18 Jun 2025 10:42:04 +0900</pubDate>
    </item>
    <item>
      <title>update-ca-trust extract가 작동하지 않는 주요 원인</title>
      <link>https://amnesia.tistory.com/117</link>
      <description>&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;91bfb537-0f72-48fc-9a62-4296906cbabe&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;h3 data-end=&quot;192&quot; data-start=&quot;158&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;인증서 형식 오류 (PEM 형식 아님)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;260&quot; data-start=&quot;194&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;260&quot; data-start=&quot;194&quot;&gt;인증서 파일은 반드시 **PEM 형식 (Base64 인코딩)**이어야 하며, 다음과 같은 헤더가 포함되어야 합니다:&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515697489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-----BEGIN CERTIFICATE-----
... (Base64 encoded content)
-----END CERTIFICATE-----&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;382&quot; data-start=&quot;363&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;382&quot; data-start=&quot;363&quot;&gt;형식이 맞지 않으면 무시됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;398&quot; data-start=&quot;384&quot; data-ke-size=&quot;size20&quot;&gt;확인 방법:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515722447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /etc/pki/ca-trust/source/anchors/your-cert.crt.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;499&quot; data-start=&quot;472&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;잘못된 경로에 파일을 넣음&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;706&quot; data-start=&quot;501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;669&quot; data-start=&quot;501&quot;&gt;유효한 경로는 다음 중 하나입니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;669&quot; data-start=&quot;525&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;569&quot; data-start=&quot;525&quot;&gt;/etc/pki/ca-trust/source/anchors/ ✅ (권장)&lt;/li&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;572&quot;&gt;/etc/pki/ca-trust/source/blacklist/ ❌ (차단 리스트)&lt;/li&gt;
&lt;li data-end=&quot;669&quot; data-start=&quot;625&quot;&gt;/usr/share/pki/ca-trust-source/ (시스템 전역)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;706&quot; data-start=&quot;671&quot;&gt;anchors 폴더 외 경로에 넣으면 적용되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;754&quot; data-start=&quot;713&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;파일 확장자가 .crt 또는 .pem이 아님&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;818&quot; data-start=&quot;756&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;818&quot; data-start=&quot;756&quot;&gt;파일 확장자는 반드시 .crt, .pem, .cer 중 하나여야 하며, 그렇지 않으면 무시됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;833&quot; data-start=&quot;820&quot; data-ke-size=&quot;size20&quot;&gt;✔️ 권장 예:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515765604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;your-cert.crt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;919&quot; data-start=&quot;884&quot; data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;인증서 내용이 실제로 CA 인증서가 아님&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1083&quot; data-start=&quot;921&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;993&quot; data-start=&quot;921&quot;&gt;개인 인증서(Client Cert)나 중간 인증서가 아닌 &lt;b&gt;Root 또는 Intermediate CA 인증서&lt;/b&gt;여야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1083&quot; data-start=&quot;994&quot;&gt;openssl x509 -in cert.pem -text -noout 명령어로 &lt;b&gt;Basic Constraints: CA:TRUE&lt;/b&gt; 여부를 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1127&quot; data-start=&quot;1090&quot; data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;extract 실행 후 시스템에 적용 안 됨&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1287&quot; data-start=&quot;1129&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1129&quot;&gt;update-ca-trust extract는 시스템 내 /etc/ssl/certs/ca-bundle.crt 등을 갱신하지만,
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1287&quot; data-start=&quot;1207&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1243&quot; data-start=&quot;1207&quot;&gt;이를 사용하는 앱(OpenSSL, curl 등)만 영향을 받음&lt;/li&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1246&quot;&gt;Java는 전혀 영향을 받지 않습니다. (cacerts 별도 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1292&quot; data-start=&quot;1289&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1315&quot; data-start=&quot;1294&quot; data-ke-size=&quot;size26&quot;&gt;빠르게 점검하는 체크리스트&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목점검
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1568&quot; data-start=&quot;1317&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1568&quot; data-start=&quot;1345&quot;&gt;
&lt;tr data-end=&quot;1374&quot; data-start=&quot;1345&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1369&quot; data-start=&quot;1345&quot;&gt;.crt 파일이 PEM 형식인가요?&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1374&quot; data-start=&quot;1369&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1425&quot; data-start=&quot;1375&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1420&quot; data-start=&quot;1375&quot;&gt;파일에 -----BEGIN CERTIFICATE----- 헤더가 있나요?&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1425&quot; data-start=&quot;1420&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1490&quot; data-start=&quot;1426&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1485&quot; data-start=&quot;1426&quot;&gt;anchors 폴더에 위치했나요? (/etc/pki/ca-trust/source/anchors/)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1490&quot; data-start=&quot;1485&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1532&quot; data-start=&quot;1491&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1527&quot; data-start=&quot;1491&quot;&gt;update-ca-trust extract를 실행했나요?&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1532&quot; data-start=&quot;1527&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1568&quot; data-start=&quot;1533&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1563&quot; data-start=&quot;1533&quot;&gt;openssl verify로 테스트해 봤나요?&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1568&quot; data-start=&quot;1563&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;적용 여부 테스트&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515801610&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openssl verify -CAfile /etc/ssl/certs/ca-bundle.crt your-target-cert.pem​&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1709&quot; data-start=&quot;1678&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어로 시스템에 반영되었는지 테스트할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;749474d8-c631-4f9e-bbf5-776bb1d3760e&quot; data-message-author-role=&quot;user&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;/etc/pki/ca-trust/extracted/java/cacerts 에 update-ca-trust extract로 your-cert.cer를 등록하는 방법&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/pki/ca-trust/extracted/java/cacerts 경로에 인증서를 등록하려는 경우, &lt;/span&gt;&lt;b&gt;이는 Java용 Trust Store에 해당하는 시스템 CA 통합 결과 파일&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;입니다. 이 파일은 직접 수정하는 것이 아니라, &lt;/span&gt;&lt;b&gt;update-ca-trust extract 명령으로 자동 생성&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;되며, 다음 절차에 따라야 등록이 성공합니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;291ec5bf-8a5d-4b91-86b9-622cf718ca38&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;h1 data-end=&quot;226&quot; data-start=&quot;217&quot;&gt;목적:&lt;/h1&gt;
&lt;p data-end=&quot;359&quot; data-start=&quot;227&quot; data-ke-size=&quot;size16&quot;&gt;update-ca-trust extract 실행 시 **/etc/pki/ca-trust/extracted/java/cacerts**에&lt;br /&gt;your-cert.cer 인증서가 포함되도록 만드는 절차&lt;/p&gt;
&lt;h2 data-end=&quot;380&quot; data-start=&quot;366&quot; data-ke-size=&quot;size26&quot;&gt;등록 절차 요약&lt;/h2&gt;
&lt;h3 data-end=&quot;410&quot; data-start=&quot;382&quot; data-ke-size=&quot;size23&quot;&gt;1. 인증서를 &lt;b&gt;PEM 형식&lt;/b&gt;으로 준비&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515945906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 확인: PEM 형식인지 체크
grep &quot;BEGIN CERTIFICATE&quot; your-cert.cer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;523&quot; data-start=&quot;499&quot; data-ke-size=&quot;size23&quot;&gt;2. anchors 폴더에 복사&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515975577&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo cp your-cert.cer /etc/pki/ca-trust/source/anchors/​&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;672&quot; data-start=&quot;611&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;672&quot; data-start=&quot;613&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 반드시 .cer, .crt, .pem 확장자 중 하나여야 하고, PEM 형식이어야 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;696&quot; data-start=&quot;674&quot; data-ke-size=&quot;size23&quot;&gt;3. Trust Store 갱신&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749515994763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo update-ca-trust extract​&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;835&quot; data-start=&quot;739&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;835&quot; data-start=&quot;741&quot; data-ke-size=&quot;size16&quot;&gt;이 명령은 /etc/ssl/certs/ca-bundle.crt와 함께 /etc/pki/ca-trust/extracted/java/cacerts도 함께 갱신합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;856&quot; data-start=&quot;837&quot; data-ke-size=&quot;size23&quot;&gt;4. 등록 성공 여부 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749516014879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -A 1 &quot;BEGIN CERTIFICATE&quot; /etc/pki/ca-trust/extracted/java/cacerts | less​&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;987&quot; data-start=&quot;948&quot; data-ke-size=&quot;size16&quot;&gt;또는, 파일 내부에 인증서 정보가 포함됐는지 openssl로 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749516029465&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openssl x509 -in /etc/pki/ca-trust/extracted/java/cacerts -text -noout&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1122&quot; data-start=&quot;1073&quot; data-ke-size=&quot;size16&quot;&gt;(위 명령은 일부 시스템에서 오류 발생 가능 &amp;mdash; 이 경우 단순 문자열 검색이 더 유효함)&lt;/p&gt;
&lt;h2 data-end=&quot;1156&quot; data-start=&quot;1129&quot; data-ke-size=&quot;size26&quot;&gt;인증서가 포함되지 않는 경우 주요 원인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;원인설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1358&quot; data-start=&quot;1158&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1358&quot; data-start=&quot;1186&quot;&gt;
&lt;tr data-end=&quot;1246&quot; data-start=&quot;1186&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1200&quot; data-start=&quot;1186&quot;&gt;인증서 형식이 DER&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1246&quot; data-start=&quot;1200&quot;&gt;openssl x509 -inform der로 확인 및 PEM 변환 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1298&quot; data-start=&quot;1247&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1268&quot; data-start=&quot;1247&quot;&gt;인증서에 CA:TRUE가 없음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1298&quot; data-start=&quot;1268&quot;&gt;루트 또는 중간 CA 인증서가 아닌 경우 무시됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1358&quot; data-start=&quot;1299&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1317&quot; data-start=&quot;1299&quot;&gt;파일 위치 또는 확장자 오류&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1358&quot; data-start=&quot;1317&quot;&gt;/anchors/가 아닌 위치거나 확장자가 비표준일 경우 무시됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;필요시 PEM 변환&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749516055031&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openssl x509 -in your-cert.cer -inform der -out your-cert.pem -outform pem
sudo cp your-cert.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;1622&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1623&quot; data-ke-size=&quot;size16&quot;&gt;/etc/pki/ca-trust/extracted/java/cacerts는 수동 수정 대상이 아니며,&lt;br /&gt;&lt;b&gt;PEM 인증서를 anchors/에 넣고 update-ca-trust extract를 실행해야 반영&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>python/tips</category>
      <category>openssl</category>
      <category>update-ca-trust</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/117</guid>
      <comments>https://amnesia.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 10 Jun 2025 09:45:09 +0900</pubDate>
    </item>
    <item>
      <title>DeFi에 대한 6가지 기본 질문</title>
      <link>https://amnesia.tistory.com/112</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;79&quot;&gt;&lt;b&gt;1. 개인 금융(Personal Banking)에서 DeFi란 무엇인가요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;81&quot; data-end=&quot;159&quot;&gt;DeFi(탈중앙화 금융)는 개인에게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자신의 자산에 대한 직접적인 통제권&lt;/b&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;허가 없이 이용할 수 있는 금융 서비스&lt;/b&gt;를 제공합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;161&quot; data-end=&quot;194&quot;&gt;개인은 다음과 같은 방식으로 DeFi를 활용할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;196&quot; data-end=&quot;451&quot;&gt;
&lt;li data-start=&quot;196&quot; data-end=&quot;267&quot;&gt;&lt;b&gt;DEX(탈중앙화 거래소)를 통한 비(非)수탁형 거래&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;237&quot; data-end=&quot;267&quot;&gt;
&lt;li data-start=&quot;237&quot; data-end=&quot;267&quot;&gt;중개기관 없이 직접 암호화폐를 거래할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;269&quot; data-end=&quot;359&quot;&gt;&lt;b&gt;대출 및 차입 프로토콜 참여로 수익 창출 및 담보 대출 이용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;315&quot; data-end=&quot;359&quot;&gt;
&lt;li data-start=&quot;315&quot; data-end=&quot;359&quot;&gt;암호화폐를 예치해 이자를 얻거나, 담보를 제공하고 대출을 받을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;361&quot; data-end=&quot;451&quot;&gt;&lt;b&gt;스테이블코인 활용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;383&quot; data-end=&quot;451&quot;&gt;
&lt;li data-start=&quot;383&quot; data-end=&quot;451&quot;&gt;결제 수단으로 사용하거나, 암호화폐 시장의 높은 변동성에 대비하기 위한 헤지(위험 회피) 수단으로 활용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;60&quot;&gt;&lt;b&gt;2. DeFi 은행의 예시는 무엇인가요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;62&quot; data-end=&quot;167&quot;&gt;DeFi 은행은 전통적인 의미의 은행은 아니지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Aave&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Compound&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MakerDAO&lt;/b&gt;와 같은 DeFi 프로토콜들이 은행과 유사한 금융 서비스를 제공합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;169&quot; data-end=&quot;243&quot;&gt;이러한 프로토콜은 오픈소스와 비(非)수탁형(non-custodial) 플랫폼으로 운영되며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;스마트 계약&lt;/b&gt;에 의해 관리됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;245&quot; data-end=&quot;267&quot;&gt;주요 제공 서비스는 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;268&quot; data-end=&quot;351&quot;&gt;
&lt;li data-start=&quot;268&quot; data-end=&quot;288&quot;&gt;&lt;b&gt;대출 (Lending)&lt;/b&gt;&lt;/li&gt;
&lt;li data-start=&quot;289&quot; data-end=&quot;311&quot;&gt;&lt;b&gt;차입 (Borrowing)&lt;/b&gt;&lt;/li&gt;
&lt;li data-start=&quot;312&quot; data-end=&quot;351&quot;&gt;&lt;b&gt;스테이블코인 발행 (Stablecoin Issuance)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;353&quot; data-end=&quot;437&quot;&gt;전통적인 금융기관 없이도 사용자가 직접 자산을 빌려주고 빌릴 수 있으며, 스테이블코인과 같은 디지털 자산을 발행하고 활용할 수 있도록 지원합니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;82&quot;&gt;&lt;b&gt;3. 거래 은행(Transaction Banking)에서 DeFi란 무엇인가요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;84&quot; data-end=&quot;129&quot;&gt;DeFi(탈중앙화 금융)는 거래 은행 분야에서도 큰 변화를 일으키고 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;131&quot; data-end=&quot;146&quot;&gt;주요 변화 내용:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;148&quot; data-end=&quot;606&quot;&gt;
&lt;li data-start=&quot;148&quot; data-end=&quot;205&quot;&gt;&lt;b&gt;국경 간 결제의 간소화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;171&quot; data-end=&quot;205&quot;&gt;
&lt;li data-start=&quot;171&quot; data-end=&quot;205&quot;&gt;복잡한 절차 없이 빠르고 효율적인 해외 송금이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;207&quot; data-end=&quot;278&quot;&gt;&lt;b&gt;중개기관 의존도 감소&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;229&quot; data-end=&quot;278&quot;&gt;
&lt;li data-start=&quot;229&quot; data-end=&quot;278&quot;&gt;기존 은행, 결제 네트워크 등의 중개자가 필요하지 않으므로 비용과 시간이 절감됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;280&quot; data-end=&quot;361&quot;&gt;&lt;b&gt;스테이블코인 기반 결제 채널 활용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;309&quot; data-end=&quot;361&quot;&gt;
&lt;li data-start=&quot;309&quot; data-end=&quot;361&quot;&gt;USDC, USDT와 같은 스테이블코인을 사용해 가치 변동 위험 없이 결제할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;363&quot; data-end=&quot;482&quot;&gt;&lt;b&gt;Layer-2 확장 솔루션 활용 (예: Lightning Network)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;414&quot; data-end=&quot;482&quot;&gt;
&lt;li data-start=&quot;414&quot; data-end=&quot;482&quot;&gt;비트코인 네트워크의 라이트닝 네트워크와 같은 Layer-2 솔루션을 사용하여 더 빠르고 저렴한 거래 처리가 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;484&quot; data-end=&quot;606&quot;&gt;&lt;b&gt;탈중앙화 결제 게이트웨이 도입&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;511&quot; data-end=&quot;606&quot;&gt;
&lt;li data-start=&quot;511&quot; data-end=&quot;606&quot;&gt;기업들은 탈중앙화된 결제 게이트웨이를 통해 암호화폐 결제를 직접 수락할 수 있으며, 이를 통해 결제 처리 비용을 절감하고 글로벌 고객에게 더 쉽게 접근할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;613&quot; data-end=&quot;714&quot;&gt;DeFi는 거래 은행 분야에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;더 빠르고, 저렴하며, 투명한 결제 및 정산 환경&lt;/b&gt;을 제공함으로써, 기존 금융 인프라를 대체하거나 보완하는 역할을 하고 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;613&quot; data-end=&quot;714&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;89&quot;&gt;&lt;b&gt;4. DeFi 뱅킹(DeFi Banking)이란 무엇이며, 전통적인 은행과 어떻게 다른가요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;91&quot; data-end=&quot;197&quot;&gt;&lt;b&gt;DeFi 뱅킹&lt;/b&gt;은 중앙집중화되고 중개 기관에 의존하는 기존 금융 시스템에서 벗어나,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;탈중앙화된 개인 간(Peer-to-Peer) 금융 모델&lt;/b&gt;로 전환하는 패러다임 변화를 의미합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;199&quot; data-end=&quot;224&quot;&gt;&lt;b&gt;DeFi 뱅킹의 주요 특징:&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;225&quot; data-end=&quot;549&quot;&gt;
&lt;li data-start=&quot;225&quot; data-end=&quot;284&quot;&gt;&lt;b&gt;블록체인 기술과 스마트 계약 활용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;254&quot; data-end=&quot;284&quot;&gt;
&lt;li data-start=&quot;254&quot; data-end=&quot;284&quot;&gt;자동화된 계약으로 중개자 없이 거래가 이루어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;286&quot; data-end=&quot;352&quot;&gt;&lt;b&gt;중개 기관 불필요&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;306&quot; data-end=&quot;352&quot;&gt;
&lt;li data-start=&quot;306&quot; data-end=&quot;352&quot;&gt;은행, 결제 네트워크, 브로커 등의 역할을 스마트 계약과 프로토콜이 대신합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;354&quot; data-end=&quot;409&quot;&gt;&lt;b&gt;투명성 향상&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;371&quot; data-end=&quot;409&quot;&gt;
&lt;li data-start=&quot;371&quot; data-end=&quot;409&quot;&gt;모든 거래 기록은 블록체인에 저장되어 누구나 검증할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;411&quot; data-end=&quot;492&quot;&gt;&lt;b&gt;접근성 확대&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;428&quot; data-end=&quot;492&quot;&gt;
&lt;li data-start=&quot;428&quot; data-end=&quot;492&quot;&gt;전통 금융 서비스에 접근하기 어려운 사람들도 인터넷과 암호화폐 지갑만 있으면 금융 서비스를 이용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;494&quot; data-end=&quot;549&quot;&gt;&lt;b&gt;사용자 주도적 자산 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;518&quot; data-end=&quot;549&quot;&gt;
&lt;li data-start=&quot;518&quot; data-end=&quot;549&quot;&gt;개인이 자신의 자산에 대한 완전한 통제권을 가집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;556&quot; data-end=&quot;586&quot;&gt;&lt;b&gt;전통적인 은행과의 주요 차이점 비교&lt;/b&gt;&lt;/h3&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;구분전통적인 은행DeFi 뱅킹
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;588&quot; data-end=&quot;981&quot;&gt;
&lt;tbody data-start=&quot;701&quot; data-end=&quot;981&quot;&gt;
&lt;tr data-start=&quot;701&quot; data-end=&quot;745&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-start=&quot;701&quot; data-end=&quot;715&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;운영 주체&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; data-start=&quot;715&quot; data-end=&quot;731&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;중앙 기관 (은행)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-start=&quot;731&quot; data-end=&quot;745&quot;&gt;&lt;b&gt;탈중앙화 네트워크&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;746&quot; data-end=&quot;792&quot;&gt;
&lt;td data-start=&quot;746&quot; data-end=&quot;759&quot; data-col-size=&quot;sm&quot;&gt;중개자 존재&lt;/td&gt;
&lt;td data-start=&quot;759&quot; data-end=&quot;777&quot; data-col-size=&quot;sm&quot;&gt;있음 (필수)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;777&quot; data-end=&quot;792&quot;&gt;없음 (스마트 계약)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;793&quot; data-end=&quot;844&quot;&gt;
&lt;td data-start=&quot;793&quot; data-end=&quot;808&quot; data-col-size=&quot;sm&quot;&gt;투명성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;808&quot; data-end=&quot;827&quot;&gt;제한적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;827&quot; data-end=&quot;844&quot;&gt;완전한 공개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;845&quot; data-end=&quot;890&quot;&gt;
&lt;td data-start=&quot;845&quot; data-end=&quot;860&quot; data-col-size=&quot;sm&quot;&gt;접근성&lt;/td&gt;
&lt;td data-start=&quot;860&quot; data-end=&quot;875&quot; data-col-size=&quot;sm&quot;&gt;제한적 (계좌 필요)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;875&quot; data-end=&quot;890&quot;&gt;누구나 참여 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;891&quot; data-end=&quot;937&quot;&gt;
&lt;td data-start=&quot;891&quot; data-end=&quot;905&quot; data-col-size=&quot;sm&quot;&gt;자산 통제&lt;/td&gt;
&lt;td data-start=&quot;905&quot; data-end=&quot;923&quot; data-col-size=&quot;sm&quot;&gt;은행이 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;923&quot; data-end=&quot;937&quot;&gt;사용자가 직접 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;938&quot; data-end=&quot;981&quot;&gt;
&lt;td data-start=&quot;938&quot; data-end=&quot;952&quot; data-col-size=&quot;sm&quot;&gt;비용 구조&lt;/td&gt;
&lt;td data-start=&quot;952&quot; data-end=&quot;966&quot; data-col-size=&quot;sm&quot;&gt;수수료 및 서비스 요금&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;966&quot; data-end=&quot;981&quot;&gt;상대적으로 저렴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;988&quot; data-end=&quot;1096&quot;&gt;DeFi 뱅킹은 기존 금융 시스템의 복잡함과 비효율성을 제거하고, 사용자에게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;더 많은 자율성과 투명성, 그리고 비용 절감&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;혜택을 제공하는 혁신적인 금융 모델입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;988&quot; data-end=&quot;1096&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;73&quot;&gt;&lt;b&gt;5. DeFi 은행을 전통 은행보다 사용하는 장점은 무엇인가요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;75&quot; data-end=&quot;119&quot;&gt;DeFi(탈중앙화 금융)는 사용자에게 다음과 같은 여러 가지 이점을 제공합니다:&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;126&quot; data-end=&quot;173&quot;&gt;&lt;b&gt;1. 허가 없는 접근 (Permissionless Access)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;174&quot; data-end=&quot;278&quot;&gt;
&lt;li data-start=&quot;174&quot; data-end=&quot;229&quot;&gt;별도의 계좌 개설, 신용 조회 등의 절차 없이 누구나 DeFi 서비스를 이용할 수 있습니다.&lt;/li&gt;
&lt;li data-start=&quot;230&quot; data-end=&quot;278&quot;&gt;전 세계 어디에서나 인터넷과 암호화폐 지갑만 있으면 금융 서비스 이용이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;285&quot; data-end=&quot;346&quot;&gt;&lt;b&gt;2. 높은 투명성과 감사 가능성 (Transparency and Auditability)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;347&quot; data-end=&quot;443&quot;&gt;
&lt;li data-start=&quot;347&quot; data-end=&quot;406&quot;&gt;모든 거래 내역은 퍼블릭 블록체인에 기록되며, 누구나 이를 실시간으로 확인하고 검증할 수 있습니다.&lt;/li&gt;
&lt;li data-start=&quot;407&quot; data-end=&quot;443&quot;&gt;금융 거래의 불투명성과 조작 가능성을 크게 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;450&quot; data-end=&quot;512&quot;&gt;&lt;b&gt;3. 조합성과 상호운용성 (Composability and Interoperability)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;513&quot; data-end=&quot;648&quot;&gt;
&lt;li data-start=&quot;513&quot; data-end=&quot;587&quot;&gt;서로 다른 DeFi 프로토콜 간에 연동이 가능하여,&lt;br /&gt;새로운 금융 상품과 서비스를 자유롭게 조합하고 개발할 수 있습니다.&lt;/li&gt;
&lt;li data-start=&quot;588&quot; data-end=&quot;648&quot;&gt;예: Aave에서 대출받고, Curve Finance로 유동성 제공, Compound로 이자 수익 창출.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;655&quot; data-end=&quot;717&quot;&gt;&lt;b&gt;4. 프로그래밍 가능성과 자동화 (Programmability and Automation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;718&quot; data-end=&quot;820&quot;&gt;
&lt;li data-start=&quot;718&quot; data-end=&quot;784&quot;&gt;스마트 계약을 통해 금융 계약을 자동으로 실행할 수 있어,&lt;br /&gt;수동 개입 없이 효율적으로 거래가 처리됩니다.&lt;/li&gt;
&lt;li data-start=&quot;785&quot; data-end=&quot;820&quot;&gt;예: 정해진 조건에 따라 자동 상환, 이자 지급 등이 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;827&quot; data-end=&quot;883&quot;&gt;&lt;b&gt;5. 상대적으로 높은 수익률 (Potentially Higher Returns)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;884&quot; data-end=&quot;998&quot;&gt;
&lt;li data-start=&quot;884&quot; data-end=&quot;957&quot;&gt;DeFi 대출 및 투자 프로토콜은 전통적인 예금 상품이나 투자 상품보다 더 높은 이자율과 수익률을 제공하는 경우가 많습니다.&lt;/li&gt;
&lt;li data-start=&quot;958&quot; data-end=&quot;998&quot;&gt;이는 중개 기관이 없어, 수익이 직접 사용자에게 돌아가기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1005&quot; data-end=&quot;1117&quot;&gt;DeFi 은행은 사용자가 더 쉽게 금융 서비스에 접근하고, 더 높은 수익을 얻으며, 거래의 투명성과 자산 통제력을 직접 확보할 수 있게 해주는 혁신적인 대안 금융 시스템입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1005&quot; data-end=&quot;1117&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;31&quot; data-end=&quot;73&quot;&gt;&lt;b&gt;6. DeFi 뱅킹은 어떻게 작동하며, 어떤 기술이 사용되나요?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;75&quot; data-end=&quot;118&quot;&gt;DeFi(탈중앙화 금융) 뱅킹은 다음과 같은 핵심 기술을 활용하여 운영됩니다:&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;125&quot; data-end=&quot;157&quot;&gt;&lt;b&gt;1. 블록체인 (Blockchain)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;158&quot; data-end=&quot;329&quot;&gt;
&lt;li data-start=&quot;158&quot; data-end=&quot;209&quot;&gt;블록체인은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;분산 원장 기술&lt;/b&gt;로, 모든 거래 내역을 안전하고 투명하게 기록합니다.&lt;/li&gt;
&lt;li data-start=&quot;210&quot; data-end=&quot;266&quot;&gt;데이터를 중앙 서버가 아닌 네트워크 참여자들이 공동으로 관리하며, 변경이나 위조가 어렵습니다.&lt;/li&gt;
&lt;li data-start=&quot;267&quot; data-end=&quot;329&quot;&gt;주요 블록체인 플랫폼:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이더리움(Ethereum)&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Solana&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Polygon&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;336&quot; data-end=&quot;375&quot;&gt;&lt;b&gt;2. 스마트 계약 (Smart Contracts)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;376&quot; data-end=&quot;570&quot;&gt;
&lt;li data-start=&quot;376&quot; data-end=&quot;412&quot;&gt;스마트 계약은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자동으로 실행되는 디지털 계약&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-start=&quot;413&quot; data-end=&quot;464&quot;&gt;계약 조건이 충족되면 사람이 개입하지 않아도 자동으로 거래나 금융 계약이 실행됩니다.&lt;/li&gt;
&lt;li data-start=&quot;465&quot; data-end=&quot;523&quot;&gt;이를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;중개 기관 없이&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;금융 서비스 제공이 가능하고, 운영 효율성을 높일 수 있습니다.&lt;/li&gt;
&lt;li data-start=&quot;524&quot; data-end=&quot;570&quot;&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;534&quot; data-end=&quot;570&quot;&gt;
&lt;li data-start=&quot;534&quot; data-end=&quot;546&quot;&gt;자동 대출 실행&lt;/li&gt;
&lt;li data-start=&quot;549&quot; data-end=&quot;558&quot;&gt;이자 지급&lt;/li&gt;
&lt;li data-start=&quot;561&quot; data-end=&quot;570&quot;&gt;담보 청산&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;577&quot; data-end=&quot;628&quot;&gt;&lt;b&gt;3. 탈중앙화 거버넌스 (Decentralized Governance)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;629&quot; data-end=&quot;871&quot;&gt;
&lt;li data-start=&quot;629&quot; data-end=&quot;748&quot;&gt;DeFi 생태계에서는 **DAO(Decentralized Autonomous Organization)**와 같은 거버넌스 메커니즘을 활용하여,&lt;br /&gt;커뮤니티가 직접 프로토콜 개선과 정책 결정을 주도합니다.&lt;/li&gt;
&lt;li data-start=&quot;749&quot; data-end=&quot;808&quot;&gt;거버넌스 토큰을 가진 사용자가 제안 및 투표를 통해 시스템 업그레이드나 주요 의사결정에 참여합니다.&lt;/li&gt;
&lt;li data-start=&quot;809&quot; data-end=&quot;871&quot;&gt;예시 플랫폼:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Uniswap DAO&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MakerDAO&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Aave Governance&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;873&quot; data-end=&quot;876&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;878&quot; data-end=&quot;993&quot;&gt;DeFi 뱅킹은 블록체인과 스마트 계약을 기반으로, 탈중앙화된 방식으로 금융 서비스를 제공하며,&lt;br /&gt;프로토콜의 운영과 개선은 커뮤니티 중심의 거버넌스 시스템을 통해 이루어집니다.&lt;/p&gt;</description>
      <category>블록체인</category>
      <category>defi</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/112</guid>
      <comments>https://amnesia.tistory.com/112#entry112comment</comments>
      <pubDate>Fri, 16 May 2025 21:06:47 +0900</pubDate>
    </item>
    <item>
      <title>Linux Java TrustStore에서 오래된 인증서 예전 인증서 제거하는 방법</title>
      <link>https://amnesia.tistory.com/111</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Linux 시스템의 cacerts 파일은 Java 신뢰할 수 있는 인증서 저장소 (Java TrustStore) 입니다. 오래된 인증서를 제거하고 최신 인증서를 관리하는 것은 보안상 매우 중요합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;164&quot; data-start=&quot;146&quot;&gt;&lt;b&gt;인증서 제거 절차&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-end=&quot;194&quot; data-start=&quot;166&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. keytool 명령어 확인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;264&quot; data-start=&quot;195&quot; data-ke-size=&quot;size16&quot;&gt;Java TrustStore는 keytool로 관리합니다.&lt;br /&gt;우선 keytool 경로와 Java 환경을 확인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747178936327&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;which keytool
java -version&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;387&quot; data-start=&quot;307&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;예시 TrustStore 경로:&lt;br /&gt;/etc/alternatives/java_sdk/jre/lib/security/cacerts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;422&quot; data-start=&quot;394&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 현재 저장된 인증서 목록 확인&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747178969416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo keytool -list -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;640&quot; data-start=&quot;538&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;538&quot;&gt;기본 패스워드: changeit (변경했으면 해당 패스워드 사용)&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;579&quot;&gt;주요 정보:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;640&quot; data-start=&quot;592&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;610&quot; data-start=&quot;592&quot;&gt;&lt;b&gt;별칭 (Alias)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;624&quot; data-start=&quot;613&quot;&gt;&lt;b&gt;만료일&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;627&quot;&gt;&lt;b&gt;인증기관 정보&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;669&quot; data-start=&quot;647&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 제거할 인증서 결정&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;734&quot; data-start=&quot;670&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;670&quot;&gt;예전 인증서를 별칭(Alias) 기준으로 제거합니다.&lt;/li&gt;
&lt;li data-end=&quot;734&quot; data-start=&quot;704&quot;&gt;목록에서 예전 인증서를 찾고 별칭을 메모해 두세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;763&quot; data-start=&quot;741&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 인증서 삭제 명령어&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747179052481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo keytool -delete -alias &amp;lt;alias_name&amp;gt; -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;936&quot; data-start=&quot;901&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;930&quot; data-start=&quot;901&quot;&gt;&amp;lt;alias_name&amp;gt;: 삭제할 인증서의 별칭&lt;/li&gt;
&lt;li data-end=&quot;936&quot; data-start=&quot;931&quot;&gt;예시:&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747179082547&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo keytool -delete -alias old_cert -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;1094&quot; data-start=&quot;1075&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 삭제 후 확인&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747179119992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo keytool -list -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1245&quot; data-start=&quot;1210&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1245&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size16&quot;&gt;삭제된 인증서가 목록에서 사라졌는지 반드시 확인하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 data-end=&quot;1266&quot; data-start=&quot;1252&quot;&gt;  &lt;b&gt;주의 사항&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1323&quot; data-start=&quot;1267&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1323&quot; data-start=&quot;1267&quot;&gt;cacerts는 &lt;b&gt;시스템 전역 Java 인증서 저장소&lt;/b&gt;입니다. 삭제 전 반드시 백업 하시기 바랍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747179143940&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo cp /etc/alternatives/java_sdk/jre/lib/security/cacerts /etc/alternatives/java_sdk/jre/lib/security/cacerts.bak​&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1545&quot; data-start=&quot;1454&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1499&quot; data-start=&quot;1454&quot;&gt;패스워드를 변경했을 경우, changeit 대신 새 패스워드를 사용 하시기 바랍니다.&lt;/li&gt;
&lt;li data-end=&quot;1545&quot; data-start=&quot;1500&quot;&gt;일부 시스템에서는 경로가 다를 수 있습니다. 확인 후 정확한 경로 사용 필요.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>python/tips</category>
      <category>cacerts</category>
      <category>java truststore</category>
      <category>keytool</category>
      <category>Linux</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/111</guid>
      <comments>https://amnesia.tistory.com/111#entry111comment</comments>
      <pubDate>Wed, 14 May 2025 08:34:50 +0900</pubDate>
    </item>
    <item>
      <title>Excel에서 두 시분초(예, 010203)값의 차이를 초로 계산하기</title>
      <link>https://amnesia.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;400&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot; height=&quot;24&quot;&gt;START_DT&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;START_TIME&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;END_DT&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;END_TIME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001238&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001145&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001500&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;005432&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값중에서 START_TIME과 END_TIME의 차이를 초로 계산하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;500&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot; height=&quot;24&quot;&gt;START_DT&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;START_TIME&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;END_DT&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;END_TIME&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;b&gt;차이 (초)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001238&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;&lt;b&gt;155&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001120&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;&lt;b&gt;77&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001145&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;&lt;b&gt;102&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; height=&quot;24&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;001500&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;20250427&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;005432&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;&lt;b&gt;2372&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;110&quot; data-start=&quot;90&quot;&gt;Excel 함수로 변환 공식&lt;/h1&gt;
&lt;p data-end=&quot;193&quot; data-start=&quot;112&quot; data-ke-size=&quot;size16&quot;&gt;만약 A1 셀에 021320처럼 &lt;b&gt;숫자 형태&lt;/b&gt;로 입력되어 있다고 가정할 때, 이를 초(second)로 변환하는 공식은 다음과 같습니다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745843756195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;277&quot; data-start=&quot;271&quot; data-ke-size=&quot;size23&quot;&gt;설명&lt;/h3&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;부분의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;448&quot; data-start=&quot;278&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;448&quot; data-start=&quot;302&quot;&gt;
&lt;tr data-end=&quot;334&quot; data-start=&quot;302&quot;&gt;
&lt;td data-end=&quot;320&quot; data-start=&quot;302&quot;&gt;INT(A1/10000)&lt;/td&gt;
&lt;td data-end=&quot;334&quot; data-start=&quot;320&quot;&gt;시(hour) 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;373&quot; data-start=&quot;335&quot;&gt;
&lt;td data-end=&quot;357&quot; data-start=&quot;335&quot;&gt;MOD(A1,10000)/100&lt;/td&gt;
&lt;td data-end=&quot;373&quot; data-start=&quot;357&quot;&gt;분(minute) 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;406&quot; data-start=&quot;374&quot;&gt;
&lt;td data-end=&quot;390&quot; data-start=&quot;374&quot;&gt;MOD(A1,100)&lt;/td&gt;
&lt;td data-end=&quot;406&quot; data-start=&quot;390&quot;&gt;초(second) 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;448&quot; data-start=&quot;407&quot;&gt;
&lt;td data-end=&quot;448&quot; data-start=&quot;407&quot;&gt;각각 시는 &amp;times;3600, 분은 &amp;times;60을 해서 모두 초로 변환 후 합산&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;476&quot; data-start=&quot;455&quot;&gt;두 값의 초 차이 구하는 공식&lt;/h1&gt;
&lt;p data-end=&quot;484&quot; data-start=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;563&quot; data-start=&quot;485&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;502&quot; data-start=&quot;485&quot;&gt;A1 = 021320&lt;/li&gt;
&lt;li data-end=&quot;563&quot; data-start=&quot;503&quot;&gt;B1 = 021428&lt;br /&gt;이렇게 두 값이 있다고 하면, &lt;b&gt;두 값의 초 차이&lt;/b&gt;를 구하는 공식은:&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745843788485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=(INT(B1/10000)*3600 + INT(MOD(B1,10000)/100)*60 + MOD(B1,100)) 
- (INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;715&quot; data-start=&quot;709&quot; data-ke-size=&quot;size23&quot;&gt;결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;769&quot; data-start=&quot;716&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;716&quot;&gt;위 수식을 입력하면,&lt;/li&gt;
&lt;li data-end=&quot;769&quot; data-start=&quot;732&quot;&gt;B1 - A1의 &lt;b&gt;초 단위 차이&lt;/b&gt;가 바로 계산됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;784&quot; data-start=&quot;776&quot;&gt;추가 팁&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;937&quot; data-start=&quot;786&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;857&quot; data-start=&quot;786&quot;&gt;결과를 &lt;b&gt;분:초 형식&lt;/b&gt;으로 보고 싶으면 =TEXT(초값/86400,&quot;[mm]:ss&quot;) 형식으로 변환할 수도 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;858&quot;&gt;예를 들어 위 공식 결과가 68초라면,&lt;br /&gt;=TEXT(68/86400,&quot;[mm]:ss&quot;) 로 01:08처럼 표시할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;329&quot; data-start=&quot;300&quot; data-ke-size=&quot;size23&quot;&gt;결과를 시:분:초 (hh:mm:ss) 형식으로 변환&lt;/h3&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;331&quot; data-ke-size=&quot;size16&quot;&gt;엑셀에서는 &lt;b&gt;시간 = 초 / 86400&lt;/b&gt; 을 하면 시간 형식으로 바꿀 수 있습니다.&lt;br /&gt;(하루 = 24시간 &amp;times; 60분 &amp;times; 60초 = 86400초)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1748394578997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;=TEXT(
   ((INT(B1/10000)*3600 + INT(MOD(B1,10000)/100)*60 + MOD(B1,100)) 
   - (INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100))) / 86400,
   &quot;hh:mm:ss&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;616&quot; data-start=&quot;604&quot; data-ke-size=&quot;size23&quot;&gt;결과 예시&lt;/h3&gt;
&lt;p data-end=&quot;654&quot; data-start=&quot;618&quot; data-ke-size=&quot;size16&quot;&gt;위 식을 적용하면 668초 &amp;rarr; 00:11:08 로 출력됩니다.&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;776&quot; data-end=&quot;784&quot;&gt;추가 팁&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;795&quot; data-start=&quot;674&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;795&quot; data-start=&quot;674&quot;&gt;TEXT(..., &quot;hh:mm:ss&quot;)로 표시 형식을 지정하지 않으면 엑셀이 &lt;b&gt;소수로 인식&lt;/b&gt;할 수 있으므로 반드시 TEXT로 감싸거나, 셀 서식을 **사용자 지정 &amp;rarr; hh:mm:ss**로 설정하세요.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>python/tips</category>
      <category>Excel</category>
      <category>시분초-시분초=초</category>
      <category>유용한팁</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/110</guid>
      <comments>https://amnesia.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 28 Apr 2025 21:37:38 +0900</pubDate>
    </item>
    <item>
      <title>HTTP Request Smuggling (요청 스머글링)이란?</title>
      <link>https://amnesia.tistory.com/109</link>
      <description>&lt;h2 data-end=&quot;170&quot; data-start=&quot;129&quot; data-ke-size=&quot;size26&quot;&gt;HTTP Request Smuggling (요청 스머글링)이란?&lt;/h2&gt;
&lt;p data-end=&quot;344&quot; data-start=&quot;172&quot; data-ke-size=&quot;size16&quot;&gt;**HTTP 요청 스머글링(HTTP Request Smuggling, HRS)**이란,&lt;br /&gt;**프론트엔드 서버(리버스 프록시, 로드 밸런서 등)**와 &lt;b&gt;백엔드 서버(애플리케이션 서버)&lt;/b&gt; 간&lt;br /&gt;&lt;b&gt;HTTP 요청 해석 차이점&lt;/b&gt;을 악용하여 &lt;b&gt;요청을 변조하거나 몰래 끼워 넣는 공격 기법&lt;/b&gt;을 의미합니다.&lt;/p&gt;
&lt;p data-end=&quot;356&quot; data-start=&quot;346&quot; data-ke-size=&quot;size16&quot;&gt;간단히 말하면,&lt;/p&gt;
&lt;blockquote data-end=&quot;456&quot; data-start=&quot;357&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;456&quot; data-start=&quot;359&quot; data-ke-size=&quot;size16&quot;&gt;&quot;앞단 서버는 하나의 요청이라 생각했지만, 뒷단 서버는 두 개 이상의 요청으로 인식하여&lt;br /&gt;공격자가 숨겨둔 악의적 요청이 몰래 처리되는 것&quot;&lt;br /&gt;이라고 할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;479&quot; data-start=&quot;463&quot; data-ke-size=&quot;size26&quot;&gt;어떻게 발생하는가?&lt;/h2&gt;
&lt;p data-end=&quot;599&quot; data-start=&quot;481&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 요청 본문의 길이를 명시하는 &lt;b&gt;Content-Length&lt;/b&gt; 헤더와&lt;br /&gt;요청을 여러 개로 구분하는 &lt;b&gt;Transfer-Encoding: chunked&lt;/b&gt; 헤더의 &lt;b&gt;해석 차이&lt;/b&gt;를 이용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;701&quot; data-start=&quot;601&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;643&quot; data-start=&quot;601&quot;&gt;프론트 서버와 백엔드 서버가 &lt;b&gt;서로 다르게&lt;/b&gt; 이 두 헤더를 해석하면,&lt;/li&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;644&quot;&gt;공격자가 숨긴 &lt;b&gt;두 번째 요청&lt;/b&gt;이 정상 요청에 &lt;b&gt;끼워 넣어져&lt;/b&gt; 처리될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;711&quot; data-start=&quot;702&quot; data-ke-size=&quot;size23&quot;&gt;예시 흐름&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745810698894&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST / HTTP/1.1
Host: example.com
Content-Length: 50
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: example.com&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;978&quot; data-start=&quot;851&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;902&quot; data-start=&quot;851&quot;&gt;프론트 서버는 Content-Length를 기준으로 해석하여 요청 완료라 판단하지만,&lt;/li&gt;
&lt;li data-end=&quot;978&quot; data-start=&quot;903&quot;&gt;백엔드 서버는 Transfer-Encoding을 기준으로 해석하여 &lt;b&gt;뒤의 숨은 GET 요청&lt;/b&gt;을 별개로 처리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;999&quot; data-start=&quot;985&quot; data-ke-size=&quot;size26&quot;&gt;주요 공격 결과&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;공격 효과설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1199&quot; data-start=&quot;1001&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1199&quot; data-start=&quot;1036&quot;&gt;
&lt;tr data-end=&quot;1074&quot; data-start=&quot;1036&quot;&gt;
&lt;td data-end=&quot;1046&quot; data-start=&quot;1036&quot;&gt;요청 가로채기&lt;/td&gt;
&lt;td data-end=&quot;1074&quot; data-start=&quot;1046&quot;&gt;다른 사용자의 요청을 탈취할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1101&quot; data-start=&quot;1075&quot;&gt;
&lt;td data-end=&quot;1085&quot; data-start=&quot;1075&quot;&gt;세션 하이재킹&lt;/td&gt;
&lt;td data-end=&quot;1101&quot; data-start=&quot;1085&quot;&gt;세션 토큰 탈취 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1157&quot; data-start=&quot;1102&quot;&gt;
&lt;td data-end=&quot;1112&quot; data-start=&quot;1102&quot;&gt;캐시 포이즈닝&lt;/td&gt;
&lt;td data-end=&quot;1157&quot; data-start=&quot;1112&quot;&gt;잘못된 응답을 캐시하여 불특정 다수에게 악성 응답을 제공할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1199&quot; data-start=&quot;1158&quot;&gt;
&lt;td data-end=&quot;1170&quot; data-start=&quot;1158&quot;&gt;비인가 요청 전송&lt;/td&gt;
&lt;td data-end=&quot;1199&quot; data-start=&quot;1170&quot;&gt;관리자 페이지 접근, CSRF 보조 공격 등.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;1223&quot; data-start=&quot;1206&quot; data-ke-size=&quot;size26&quot;&gt;방어 및 대응 방법&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;대응 방법세부 설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1555&quot; data-start=&quot;1225&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1555&quot; data-start=&quot;1268&quot;&gt;
&lt;tr data-end=&quot;1336&quot; data-start=&quot;1268&quot;&gt;
&lt;td data-end=&quot;1283&quot; data-start=&quot;1268&quot;&gt;단일 길이 기준 강제화&lt;/td&gt;
&lt;td data-end=&quot;1336&quot; data-start=&quot;1283&quot;&gt;Content-Length 또는 Transfer-Encoding 중 하나만 허용.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1389&quot; data-start=&quot;1337&quot;&gt;
&lt;td data-end=&quot;1354&quot; data-start=&quot;1337&quot;&gt;HTTP 요청 일관성 검사&lt;/td&gt;
&lt;td data-end=&quot;1389&quot; data-start=&quot;1354&quot;&gt;서버 간 동일한 해석 기준 유지 (엄격한 RFC 준수).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1447&quot; data-start=&quot;1390&quot;&gt;
&lt;td data-end=&quot;1408&quot; data-start=&quot;1390&quot;&gt;최신 웹서버/프록시 업데이트&lt;/td&gt;
&lt;td data-end=&quot;1447&quot; data-start=&quot;1408&quot;&gt;nginx, Apache, HAProxy 등의 보안 패치 적용.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1505&quot; data-start=&quot;1448&quot;&gt;
&lt;td data-end=&quot;1460&quot; data-start=&quot;1448&quot;&gt;WAF 규칙 강화&lt;/td&gt;
&lt;td data-end=&quot;1505&quot; data-start=&quot;1460&quot;&gt;WAF(Web Application Firewall)에서 의심 요청 차단.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1555&quot; data-start=&quot;1506&quot;&gt;
&lt;td data-end=&quot;1528&quot; data-start=&quot;1506&quot;&gt;input validation 강화&lt;/td&gt;
&lt;td data-end=&quot;1555&quot; data-start=&quot;1528&quot;&gt;HTTP 요청 헤더와 바디를 철저히 검증.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;1572&quot; data-start=&quot;1562&quot; data-ke-size=&quot;size26&quot;&gt;덧붙여&lt;/h2&gt;
&lt;p data-end=&quot;1760&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size16&quot;&gt;HTTP Request Smuggling은 2005년에 처음 발견되었으나,&lt;br /&gt;2020년대 이후 클라우드 환경, API Gateway, Reverse Proxy 사용 증가로 인해 &lt;b&gt;다시 부각&lt;/b&gt;되었습니다.&lt;br /&gt;&lt;b&gt;특히 Android 앱에서도&lt;/b&gt; 백엔드와 통신할 때 리버스 프록시를 거치는 경우, 서버 측 대응이 매우 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;1760&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;190&quot; data-start=&quot;139&quot;&gt;추가로&lt;/h1&gt;
&lt;h1 data-end=&quot;190&quot; data-start=&quot;139&quot;&gt;Android App 관점에서 HTTP Request Smuggling 대응 가이드&lt;/h1&gt;
&lt;h2 data-end=&quot;229&quot; data-start=&quot;197&quot; data-ke-size=&quot;size26&quot;&gt;1. 앱 내부 네트워크 통신 라이브러리 설정 강화&lt;/h2&gt;
&lt;p data-end=&quot;374&quot; data-start=&quot;231&quot; data-ke-size=&quot;size16&quot;&gt;Android 앱은 보통 &lt;b&gt;OkHttp&lt;/b&gt;, &lt;b&gt;Retrofit&lt;/b&gt;, &lt;b&gt;HttpURLConnection&lt;/b&gt; 등을 통하여 서버와 통신합니다.&lt;br /&gt;이를 사용하는 경우, 기본 설정만으로는 일부 우회 시도가 가능할 수도 있으므로, 아래를 꼭 지켜야 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;403&quot; data-start=&quot;376&quot; data-ke-size=&quot;size23&quot;&gt;OkHttp / Retrofit 대응&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;555&quot; data-start=&quot;404&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;471&quot; data-start=&quot;404&quot;&gt;&lt;b&gt;HTTP/1.1&lt;/b&gt; 또는 &lt;b&gt;HTTP/2 명시적 사용&lt;/b&gt; (HTTP/0.9, HTTP/1.0은 지원 차단)&lt;/li&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;472&quot;&gt;&lt;b&gt;Transfer-Encoding: chunked&lt;/b&gt; 사용 최소화&lt;/li&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;512&quot;&gt;&lt;b&gt;Content-Length&lt;/b&gt; 헤더의 일관성 확보 (명시적 지정 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745810997148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val client = OkHttpClient.Builder()
    .protocols(listOf(Protocol.HTTP_1_1, Protocol.HTTP_2))
    .build()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;711&quot; data-start=&quot;680&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;680&quot;&gt;&lt;b&gt;Interceptor 추가&lt;/b&gt;로 비정상 요청 방어&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745811013341&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class HeaderValidationInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val headers = request.headers

        // 의심스러운 헤더 검증
        if (headers.names().any { it.equals(&quot;Transfer-Encoding&quot;, ignoreCase = true) }
            &amp;amp;&amp;amp; headers.names().any { it.equals(&quot;Content-Length&quot;, ignoreCase = true) }) {
            throw IOException(&quot;Invalid HTTP headers detected: Smuggling risk.&quot;)
        }

        return chain.proceed(request)
    }
}

// 적용 예시
val safeClient = OkHttpClient.Builder()
    .addInterceptor(HeaderValidationInterceptor())
    .build()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1402&quot; data-start=&quot;1374&quot; data-ke-size=&quot;size26&quot;&gt;2. 서버와 통신 시 HTTPS 강제 사용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1507&quot; data-start=&quot;1404&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1430&quot; data-start=&quot;1404&quot;&gt;반드시 &lt;b&gt;HTTPS 통신&lt;/b&gt;만 허용할 것.&lt;/li&gt;
&lt;li data-end=&quot;1507&quot; data-start=&quot;1431&quot;&gt;앱의 network_security_config.xml을 설정하여 **Cleartext Traffic(HTTP)**을 차단할 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745811065109&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;network-security-config&amp;gt;
    &amp;lt;base-config cleartextTrafficPermitted=&quot;false&quot;&amp;gt;
        &amp;lt;trust-anchors&amp;gt;
            &amp;lt;certificates src=&quot;system&quot; /&amp;gt;
        &amp;lt;/trust-anchors&amp;gt;
    &amp;lt;/base-config&amp;gt;
&amp;lt;/network-security-config&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1802&quot; data-start=&quot;1774&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1802&quot; data-start=&quot;1774&quot;&gt;AndroidManifest.xml에도 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1745811087285&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;application
    android:networkSecurityConfig=&quot;@xml/network_security_config&quot;
    android:usesCleartextTraffic=&quot;false&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;1961&quot; data-start=&quot;1940&quot; data-ke-size=&quot;size26&quot;&gt;3. 서버 측 검증 동시 강화&lt;/h2&gt;
&lt;p data-end=&quot;2041&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size16&quot;&gt;비록 앱에서 요청을 조심하더라도,&lt;br /&gt;**서버(백엔드)**가 최종적으로 요청을 검증하고 해석하므로 서버단에서도 반드시 다음을 해야 합니다 :&lt;/p&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;서버 측 조치설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2319&quot; data-start=&quot;2043&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2319&quot; data-start=&quot;2083&quot;&gt;
&lt;tr data-end=&quot;2133&quot; data-start=&quot;2083&quot;&gt;
&lt;td data-end=&quot;2100&quot; data-start=&quot;2083&quot;&gt;Proxy, LB 업데이트&lt;/td&gt;
&lt;td data-end=&quot;2133&quot; data-start=&quot;2100&quot;&gt;nginx, HAProxy 등을 최신 버전으로 유지.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2212&quot; data-start=&quot;2134&quot;&gt;
&lt;td data-end=&quot;2175&quot; data-start=&quot;2134&quot;&gt;Content-Length/Transfer-Encoding 혼용 차단&lt;/td&gt;
&lt;td data-end=&quot;2212&quot; data-start=&quot;2175&quot;&gt;둘 중 하나만 허용하거나, 둘 모두 존재할 경우 요청 거부.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2263&quot; data-start=&quot;2213&quot;&gt;
&lt;td data-end=&quot;2231&quot; data-start=&quot;2213&quot;&gt;Request size 제한&lt;/td&gt;
&lt;td data-end=&quot;2263&quot; data-start=&quot;2231&quot;&gt;요청 본문 크기에 상한 설정 (예: 8KB 제한).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2319&quot; data-start=&quot;2264&quot;&gt;
&lt;td data-end=&quot;2276&quot; data-start=&quot;2264&quot;&gt;경계 테스트 수행&lt;/td&gt;
&lt;td data-end=&quot;2319&quot; data-start=&quot;2276&quot;&gt;BurpSuite, OWASP ZAP 등으로 Smuggling 테스트.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;2347&quot; data-start=&quot;2326&quot; data-ke-size=&quot;size26&quot;&gt;4. 취약점 대응 주기적 점검&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2479&quot; data-start=&quot;2349&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2406&quot; data-start=&quot;2349&quot;&gt;앱과 서버 모두 대상으로 &lt;b&gt;OWASP ASVS 4.0&lt;/b&gt; 기준을 활용하여 정기 점검을 수행할 것.&lt;/li&gt;
&lt;li data-end=&quot;2479&quot; data-start=&quot;2407&quot;&gt;&lt;b&gt;OWASP HTTP Request Smuggling Cheat Sheet&lt;/b&gt;를 참조하여 공격 패턴 업데이트 및 방어할 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2627&quot; data-start=&quot;2481&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a data-end=&quot;2627&quot; data-start=&quot;2484&quot;&gt;HTTP Request Smuggling Cheat Sheet (OWASP)&lt;/a&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;2642&quot; data-start=&quot;2634&quot;&gt;맺음말&lt;/h1&gt;
&lt;blockquote data-end=&quot;2741&quot; data-start=&quot;2644&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;2741&quot; data-start=&quot;2646&quot; data-ke-size=&quot;size16&quot;&gt;&quot;애초에 요청이 올바르게 구성되도록 하고, 서버가 의심스러운 요청을 철벽같이 막아내는 것이&lt;br /&gt;HTTP Request Smuggling을 완전히 차단하는 길&quot;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2840&quot; data-start=&quot;2743&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2840&quot; data-start=&quot;2743&quot; data-ke-size=&quot;size16&quot;&gt;Android 앱에서도 '안전한 요청 생성'은 매우 중요하니,&lt;br /&gt;앱 단에서부터 안전한 통신을 기본으로 삼고, 서버와의 협력 체계를 단단히 다지는 것이 필수라 할수 있습니다.&lt;/p&gt;</description>
      <category>python/tips</category>
      <category>Smuggling</category>
      <category>vapt</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/109</guid>
      <comments>https://amnesia.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 28 Apr 2025 12:32:35 +0900</pubDate>
    </item>
    <item>
      <title>jQuery 1.4에서 jQuery 3.5 이상으로 업그레이드 Plan</title>
      <link>https://amnesia.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery 1.4에서 jQuery 3.5(또는 3.x 최신 버전)로 업그레이드하는 데 소요되는 시간은 &lt;b&gt;웹 애플리케이션의 규모, jQuery 의존도, 사용자 정의 코드의 복잡도&lt;/b&gt;에 따라 달라집니다. 다음은 일반적인 상황에서의 추정과 주요 고려사항입니다.&lt;/p&gt;
&lt;h2 data-end=&quot;169&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예상 소요 시간&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;업무 범위작업 항목예상 소요 시간
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;569&quot; data-start=&quot;171&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;569&quot; data-start=&quot;243&quot;&gt;
&lt;tr data-end=&quot;302&quot; data-start=&quot;243&quot;&gt;
&lt;td data-end=&quot;260&quot; data-start=&quot;243&quot;&gt;&lt;b&gt;사전 분석 및 계획&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;290&quot; data-start=&quot;260&quot;&gt;사용 중인 jQuery 기능 목록화, 호환성 확인&lt;/td&gt;
&lt;td data-end=&quot;302&quot; data-start=&quot;290&quot;&gt;0.5 ~ 1일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;369&quot; data-start=&quot;303&quot;&gt;
&lt;td data-end=&quot;327&quot; data-start=&quot;303&quot;&gt;&lt;b&gt;라이브러리 교체 및 기본 테스트&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;361&quot; data-start=&quot;327&quot;&gt;jQuery 3.5로 교체, Migrate 플러그인 적용&lt;/td&gt;
&lt;td data-end=&quot;369&quot; data-start=&quot;361&quot;&gt;0.5일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;464&quot; data-start=&quot;370&quot;&gt;
&lt;td data-end=&quot;387&quot; data-start=&quot;370&quot;&gt;&lt;b&gt;기능 점검 및 수정&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;454&quot; data-start=&quot;387&quot;&gt;비호환 API, deprecated 기능 수정 (예: .bind(), .size(), .live() 등)&lt;/td&gt;
&lt;td data-end=&quot;464&quot; data-start=&quot;454&quot;&gt;1 ~ 3일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;513&quot; data-start=&quot;465&quot;&gt;
&lt;td data-end=&quot;481&quot; data-start=&quot;465&quot;&gt;&lt;b&gt;UI/UX 테스트&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;503&quot; data-start=&quot;481&quot;&gt;주요 브라우저 및 기기 호환성 점검&lt;/td&gt;
&lt;td data-end=&quot;513&quot; data-start=&quot;503&quot;&gt;1 ~ 2일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;569&quot; data-start=&quot;514&quot;&gt;
&lt;td data-end=&quot;537&quot; data-start=&quot;514&quot;&gt;&lt;b&gt;최종 배포 및 리그레션 테스트&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;557&quot; data-start=&quot;537&quot;&gt;CI/CD 배포 및 회귀 테스트&lt;/td&gt;
&lt;td data-end=&quot;569&quot; data-start=&quot;557&quot;&gt;0.5 ~ 1일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;641&quot; data-start=&quot;571&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;641&quot; data-start=&quot;573&quot; data-ke-size=&quot;size16&quot;&gt;총 예상 기간: 약 3 ~ 7일 (기준: 중간 규모 단일 SPA 또는 jQuery 위주의 레거시 웹사이트 기준)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;646&quot; data-start=&quot;643&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;662&quot; data-start=&quot;648&quot; data-ke-size=&quot;size26&quot;&gt;주요 고려사항&lt;/h2&gt;
&lt;h3 data-end=&quot;697&quot; data-start=&quot;664&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;jQuery Migrate 플러그인 도입&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;793&quot; data-start=&quot;698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;756&quot; data-start=&quot;698&quot;&gt;jquery-migrate-3.4.1.js를 먼저 삽입하여 deprecated 기능을 경고로 확인&lt;/li&gt;
&lt;li data-end=&quot;793&quot; data-start=&quot;757&quot;&gt;콘솔 로그에서 호환성 경고를 통해 수정 대상 API 파악 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;815&quot; data-start=&quot;795&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;대체 API 매핑&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;제거된 기능대체 방법
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1033&quot; data-start=&quot;816&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1033&quot; data-start=&quot;863&quot;&gt;
&lt;tr data-end=&quot;888&quot; data-start=&quot;863&quot;&gt;
&lt;td data-end=&quot;875&quot; data-start=&quot;863&quot;&gt;.size()&lt;/td&gt;
&lt;td data-end=&quot;888&quot; data-start=&quot;875&quot;&gt;.length&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;937&quot; data-start=&quot;889&quot;&gt;
&lt;td data-end=&quot;915&quot; data-start=&quot;889&quot;&gt;.bind() / .unbind()&lt;/td&gt;
&lt;td data-end=&quot;937&quot; data-start=&quot;915&quot;&gt;.on() / .off()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;986&quot; data-start=&quot;938&quot;&gt;
&lt;td data-end=&quot;950&quot; data-start=&quot;938&quot;&gt;.live()&lt;/td&gt;
&lt;td data-end=&quot;986&quot; data-start=&quot;950&quot;&gt;.on() (동적 요소에 대한 이벤트 바인딩 시 주의)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1033&quot; data-start=&quot;987&quot;&gt;
&lt;td data-end=&quot;1016&quot; data-start=&quot;987&quot;&gt;.toggle() (2개 이상의 함수 인자)&lt;/td&gt;
&lt;td data-end=&quot;1033&quot; data-start=&quot;1016&quot;&gt;커스텀 함수로 대체 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1061&quot; data-start=&quot;1035&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;jQuery 플러그인 호환성&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1132&quot; data-start=&quot;1062&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1062&quot;&gt;사용하는 타사 플러그인이 jQuery 3.x와 호환되는지 확인&lt;/li&gt;
&lt;li data-end=&quot;1132&quot; data-start=&quot;1099&quot;&gt;오래된 플러그인은 최신 버전이나 다른 대안으로 교체 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1146&quot; data-start=&quot;1139&quot; data-ke-size=&quot;size26&quot;&gt;팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1333&quot; data-start=&quot;1148&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1209&quot; data-start=&quot;1148&quot;&gt;가능한 경우 jQuery 제거를 고려해도 좋습니다 (예: Vue, React, vanilla JS 대체).&lt;/li&gt;
&lt;li data-end=&quot;1271&quot; data-start=&quot;1210&quot;&gt;다수의 페이지에 공통으로 로딩되는 경우, 점진적 전환(모듈 단위)보다는 전면 교체가 효율적일 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1333&quot; data-start=&quot;1272&quot;&gt;레거시 시스템에서는 jQuery 1.x 코드 스타일이 많이 섞여 있어 예상보다 수정량이 많을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>python/tips</category>
      <category>JQuery</category>
      <author>a_mnesia</author>
      <guid isPermaLink="true">https://amnesia.tistory.com/108</guid>
      <comments>https://amnesia.tistory.com/108#entry108comment</comments>
      <pubDate>Tue, 22 Apr 2025 10:04:59 +0900</pubDate>
    </item>
  </channel>
</rss>