<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>PRDEN</title>
    <link>https://prde.tistory.com/</link>
    <description>Spring will come to me through someone else.</description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 19:39:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>prden</managingEditor>
    <image>
      <title>PRDEN</title>
      <url>https://tistory1.daumcdn.net/tistory/4665472/attach/8fefb10294384cbcb4946198e26e6b44</url>
      <link>https://prde.tistory.com</link>
    </image>
    <item>
      <title>Persistence framework for Spring Batch</title>
      <link>https://prde.tistory.com/447</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;span style=&quot;color: #ee2323; text-align: left;&quot;&gt;&amp;bull; &lt;/span&gt;&lt;b&gt;For maximum performance&lt;/b&gt;&amp;nbsp;(bulk inserts/updates): Use&amp;nbsp;&lt;b&gt;JDBC Template&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;bull;&amp;nbsp;&lt;b&gt;For a balance of performance and maintainability&lt;/b&gt;: Use&amp;nbsp;&lt;b&gt;MyBatis&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;bull;&amp;nbsp;&lt;b&gt;For ease of development and maintainability&lt;/b&gt;, where performance is not the highest priority: Use&amp;nbsp;&lt;b&gt;JPA&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For bulk data insert and select in &lt;b&gt;Spring Batch&lt;/b&gt;, the choice of persistence framework depends on your specific requirements, particularly focusing on &lt;b&gt;performance&lt;/b&gt;, &lt;b&gt;scalability&lt;/b&gt;, and &lt;b&gt;ease of use&lt;/b&gt;. Here&amp;rsquo;s a comparison of three popular options:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. JDBC Template:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Performance&lt;/b&gt;: &lt;b&gt;Highest performance&lt;/b&gt; among the three for bulk operations. Since it operates at a lower abstraction level and does not involve object-relational mapping (ORM), it is leaner and faster.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Control&lt;/b&gt;: Provides the most control over SQL queries, allowing you to fully optimize batch inserts and selects with custom SQL and tuning.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Batch Operations&lt;/b&gt;: Supports native batch operations (&lt;span&gt;batchUpdate()&lt;/span&gt;), making it highly efficient for large-scale inserts.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Trade-offs&lt;/b&gt;: Requires writing SQL manually, which increases development time and reduces maintainability compared to an ORM.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Use Case&lt;/b&gt;: Best suited for performance-critical applications where raw performance and fine-grained SQL control are required.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Recommendation&lt;/b&gt;: Use JDBC Template if you need to handle very large data volumes and performance is a primary concern, especially for bulk inserts/updates/selects.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. MyBatis:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Performance&lt;/b&gt;: Good performance, but slightly lower than JDBC Template due to its semi-ORM nature. It strikes a balance between raw SQL and object mapping.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Control&lt;/b&gt;: Offers more flexibility than JPA because you can still write custom SQL while benefiting from object mapping.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Batch Operations&lt;/b&gt;: MyBatis also supports batch operations, allowing you to perform bulk inserts and updates efficiently.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Trade-offs&lt;/b&gt;: Requires managing SQL queries but offers better maintainability compared to JDBC Template, thanks to its ability to map result sets to objects.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Use Case&lt;/b&gt;: Ideal if you need a balance between performance and the convenience of mapping objects to SQL queries, but still want more control than an ORM like JPA provides.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Recommendation&lt;/b&gt;: Use MyBatis if you want more flexibility than JPA but need better performance and fine control over the SQL queries compared to JPA.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. JPA (Hibernate):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Performance&lt;/b&gt;: Generally lower performance compared to JDBC Template and MyBatis for bulk inserts/selects because of the overhead of ORM (managing entities, change tracking, etc.).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Control&lt;/b&gt;: JPA abstracts SQL through entities, and while you can use native queries, it&amp;rsquo;s less flexible than the other two in terms of fine-tuning SQL performance.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Batch Operations&lt;/b&gt;: JPA supports batch processing, but this is not as straightforward as with JDBC Template or MyBatis. You may need to fine-tune JPA settings (e.g., setting batch size, disabling cache/flush strategies) for efficient batch processing.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Trade-offs&lt;/b&gt;: Offers the best developer productivity and maintainability due to automatic entity mapping but at the cost of raw performance, especially for bulk operations.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Use Case&lt;/b&gt;: Best suited for applications where ease of development and maintainability are more important than raw performance.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Recommendation&lt;/b&gt;: Use JPA if you prefer a higher abstraction level and are willing to trade some performance for easier development and maintainability.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;For maximum performance&lt;/b&gt; (bulk inserts/updates): Use &lt;b&gt;JDBC Template&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;For a balance of performance and maintainability&lt;/b&gt;: Use &lt;b&gt;MyBatis&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;For ease of development and maintainability&lt;/b&gt;, where performance is not the highest priority: Use &lt;b&gt;JPA&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For &lt;b&gt;Spring Batch&lt;/b&gt;, since bulk operations can have a significant impact on performance, &lt;b&gt;JDBC Template&lt;/b&gt; or &lt;b&gt;MyBatis&lt;/b&gt; would generally be the better choices over JPA for high-performance bulk operations.&lt;/p&gt;</description>
      <category>Back-end/Spring-Batch</category>
      <category>jdbc Template</category>
      <category>JPA</category>
      <category>mybatis</category>
      <category>SpringBatch</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/447</guid>
      <comments>https://prde.tistory.com/447#entry447comment</comments>
      <pubDate>Sat, 12 Oct 2024 13:32:22 +0900</pubDate>
    </item>
    <item>
      <title>JAVA의 Jar와 war의 차이점</title>
      <link>https://prde.tistory.com/184</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. &lt;b&gt;Jar&lt;/b&gt;와 war의 차이점&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Jar SpringBoot의 내장톰켓 vs. War&lt;/b&gt;&lt;b&gt;&amp;nbsp;외장톰켓, jsp 이용시&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Maven 혹은 Gradle을 통해 내려받는 라이브러리들(External Libraries)은 CLASS 파일들이 묶인 jar파일로 구성되어 있는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt; 그리고 서비스 배포시에는 프로젝트를 WAR 포맷으로 묶어서 /webapps 등의 지정된 경로에 넣고 Tomcat 등의 웹 컨테이너(Web Container)를 이용하여&amp;nbsp; deploy하는 식으로 서비스를 많이 올리곤 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;Jar&lt;/b&gt; 과 war&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;.jar&lt;/span&gt; 확장자 파일에는 Class와 같은 Java 리소스와 속성 파일,&amp;nbsp; 라이브러리 및 액세서리 파일이 포함되어 있다.&lt;/div&gt;
&lt;div&gt;쉽게 JAVA 어플리케이션이 동작할 수 있도록&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바 프로젝트를 압축한 파일&lt;/b&gt;로 생각하면 된다. 실제로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;JAR 파일은 플랫폼에 귀속되는 점만 제외하면 WIN ZIP파일과 동일한 구조이다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;JAR 파일은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;원하는 구조로 구성이 가능&lt;/span&gt;하며 JDK(Java Development Kit)에 포함하고 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;JRE(Java Runtime Environment)만 가지고도 실행이 가능하다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;원하는 구성을 할 수 있는 Jar 포맷과&lt;span&gt;&amp;nbsp;&lt;/span&gt;달리 War은 WEB-INF 및 META-INF 디렉토리로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사전 정의 된 구조를 사용&lt;/b&gt;하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WAR파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹 서버 (WEB)또는 웹 컨테이너(WAS)가 필요하다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #2d4fc9;&quot;&gt;WAR 파일도 JAVA의 JAR 옵션( java - jar)을 이용해 생성하는 JAR파일의 일종&lt;/span&gt;&lt;span&gt;으로 웹어플리케이션 전체를 패키징하기 위한 JAR파일로 생각하면 된다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ifuwanna.tistory.com/224&quot;&gt;https://ifuwanna.tistory.com/224&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643442999416&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] JAR WAR 차이점 및 특징 ( + EAR )&quot; data-og-description=&quot;JAR (Java Archive) WAR (Web Application Archive) 모두 JAVA의 jar 툴을 이용하여 생성된 압축(아카이브) 파일이며 어플리케이션을 쉽게 배포하고&amp;nbsp;동작시킬&amp;nbsp;수 있도록 있도록 관련 파일(리소스, 속성파일 등).&quot; data-og-host=&quot;ifuwanna.tistory.com&quot; data-og-source-url=&quot;https://ifuwanna.tistory.com/224&quot; data-og-url=&quot;https://ifuwanna.tistory.com/224&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sboSO/hyNeCKSqAT/1klWWKpyiTh5tjw40Zx591/img.jpg?width=800&amp;amp;height=599&amp;amp;face=0_0_800_599,https://scrap.kakaocdn.net/dn/dwgELF/hyNeJcb55F/IGOGaTYEd1fHQP78i9dBjK/img.jpg?width=800&amp;amp;height=599&amp;amp;face=0_0_800_599,https://scrap.kakaocdn.net/dn/jKmHB/hyNeHemCtZ/KLYkyI5reycjTsLWxKPKA1/img.jpg?width=1350&amp;amp;height=1800&amp;amp;face=292_458_570_761&quot;&gt;&lt;a href=&quot;https://ifuwanna.tistory.com/224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ifuwanna.tistory.com/224&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sboSO/hyNeCKSqAT/1klWWKpyiTh5tjw40Zx591/img.jpg?width=800&amp;amp;height=599&amp;amp;face=0_0_800_599,https://scrap.kakaocdn.net/dn/dwgELF/hyNeJcb55F/IGOGaTYEd1fHQP78i9dBjK/img.jpg?width=800&amp;amp;height=599&amp;amp;face=0_0_800_599,https://scrap.kakaocdn.net/dn/jKmHB/hyNeHemCtZ/KLYkyI5reycjTsLWxKPKA1/img.jpg?width=1350&amp;amp;height=1800&amp;amp;face=292_458_570_761');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] JAR WAR 차이점 및 특징 ( + EAR )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JAR (Java Archive) WAR (Web Application Archive) 모두 JAVA의 jar 툴을 이용하여 생성된 압축(아카이브) 파일이며 어플리케이션을 쉽게 배포하고&amp;nbsp;동작시킬&amp;nbsp;수 있도록 있도록 관련 파일(리소스, 속성파일 등).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ifuwanna.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 스프링부트에서의 Jar와 War&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링부트 프로젝트를 새로 생성할 때, Jar(Java Archive) 또는 War(Web Application Archive) 로&lt;u&gt; 패키징 방식&lt;/u&gt;을 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jar는 class 및 설정 파일들을 압축해서 만들어진 하나의 어플리케이션 혹은 라이브러리다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;War는 JSP나 Servlet 등 WAS 컨테이너 위에서 동작하게끔 빌드된 형태이다. 웹 어플리케이션을 어떻게 설정할 지에 대한 정의가 있는 web.xml 파일을 포함(반드시는 아님 Web Application Initailizer로 대체 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAR파일에는 WAS가 내장되어 있다.( embedded tomcat을 jar에 내장해서, jar파일로도 빌드가 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기존 톰켓과 같은 컨테이너를 이용해야 했던 스프링보다 훨씬 간단하게 어플리케이션을 제작/배포할 수 있는 것입니다. 하지만 필요에 따라 외부 WAS를 이용해야할 경우도 생기는데, 이때는 WAR 파일로 패키징을 해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ SpringBoot에서 War 로 배포하는 법 : &lt;a href=&quot;https://prde.tistory.com/330&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://prde.tistory.com/330&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(출처 : &lt;a href=&quot;https://mongsil1025.github.io/til/server/warjar/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mongsil1025.github.io/til/server/warjar/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmer93.tistory.com/40&quot;&gt;https://programmer93.tistory.com/40&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670670153403&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JAR vs WAR 차이점 - 삽질중인 개발자&quot; data-og-description=&quot;JAR &amp;amp; WAR java 기반의 application의 배포 형태이다. JAVA JAR TOOL을 이용하여 압축한 압축 파일이다. ( 즉, 둘이 같은 압축 형태 ) JAR와 WAR는 사용 목적이 다르다. JAR Java ARchive path 정보를 유지한 상태로 압&quot; data-og-host=&quot;programmer93.tistory.com&quot; data-og-source-url=&quot;https://programmer93.tistory.com/40&quot; data-og-url=&quot;https://programmer93.tistory.com/40&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BBbLE/hyQQuboZpO/40wYEKNwIWWOarCD3kt6N0/img.png?width=536&amp;amp;height=437&amp;amp;face=0_0_536_437,https://scrap.kakaocdn.net/dn/bxqKgk/hyQQrTfXWq/3WHKgMQw4R5frjB2KBt0a1/img.png?width=536&amp;amp;height=437&amp;amp;face=0_0_536_437&quot;&gt;&lt;a href=&quot;https://programmer93.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmer93.tistory.com/40&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BBbLE/hyQQuboZpO/40wYEKNwIWWOarCD3kt6N0/img.png?width=536&amp;amp;height=437&amp;amp;face=0_0_536_437,https://scrap.kakaocdn.net/dn/bxqKgk/hyQQrTfXWq/3WHKgMQw4R5frjB2KBt0a1/img.png?width=536&amp;amp;height=437&amp;amp;face=0_0_536_437');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JAR vs WAR 차이점 - 삽질중인 개발자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JAR &amp;amp; WAR java 기반의 application의 배포 형태이다. JAVA JAR TOOL을 이용하여 압축한 압축 파일이다. ( 즉, 둘이 같은 압축 형태 ) JAR와 WAR는 사용 목적이 다르다. JAR Java ARchive path 정보를 유지한 상태로 압&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmer93.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hye0-log.tistory.com/27&quot;&gt;https://hye0-log.tistory.com/27&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670670902193&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot]배포 방법 비교 (JAR vs WAR)&quot; data-og-description=&quot;스프링 부트의 장점 중 하나는 실행 가능한 JAR (Executable Jar)로 빌드하여 프로젝트를 바로 실행시킬 수 있다는 점이다. 실제로 스프링부트 관련 문서를 보다 보면 &amp;quot;Executable Jar&amp;quot;라는 단어를 많이 볼&quot; data-og-host=&quot;hye0-log.tistory.com&quot; data-og-source-url=&quot;https://hye0-log.tistory.com/27&quot; data-og-url=&quot;https://hye0-log.tistory.com/27&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pnRnV/hyQQsYYDLL/mwS8C92HNSrkWecnbvWSL0/img.png?width=407&amp;amp;height=438&amp;amp;face=0_0_407_438,https://scrap.kakaocdn.net/dn/Sttg7/hyQQrTgSzE/M7uVKNiRa6DmWSHl3ef0TK/img.png?width=407&amp;amp;height=438&amp;amp;face=0_0_407_438,https://scrap.kakaocdn.net/dn/ewmzrP/hyQQuCs8x7/YZD5TOnRxqAxb8KogyIxPK/img.png?width=1177&amp;amp;height=235&amp;amp;face=0_0_1177_235&quot;&gt;&lt;a href=&quot;https://hye0-log.tistory.com/27&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hye0-log.tistory.com/27&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pnRnV/hyQQsYYDLL/mwS8C92HNSrkWecnbvWSL0/img.png?width=407&amp;amp;height=438&amp;amp;face=0_0_407_438,https://scrap.kakaocdn.net/dn/Sttg7/hyQQrTgSzE/M7uVKNiRa6DmWSHl3ef0TK/img.png?width=407&amp;amp;height=438&amp;amp;face=0_0_407_438,https://scrap.kakaocdn.net/dn/ewmzrP/hyQQuCs8x7/YZD5TOnRxqAxb8KogyIxPK/img.png?width=1177&amp;amp;height=235&amp;amp;face=0_0_1177_235');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring Boot]배포 방법 비교 (JAR vs WAR)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 부트의 장점 중 하나는 실행 가능한 JAR (Executable Jar)로 빌드하여 프로젝트를 바로 실행시킬 수 있다는 점이다. 실제로 스프링부트 관련 문서를 보다 보면 &quot;Executable Jar&quot;라는 단어를 많이 볼&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hye0-log.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 스프링부트에서의 &lt;b&gt;Jar&lt;/b&gt;와 Plain Jar 파일 차이&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1.&lt;b&gt;&amp;nbsp;batch-app-0.0.1-SNAPSHOT.jar:&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This is likely the &lt;b&gt;Spring Boot executable JAR&lt;/b&gt; that is created when you package your Spring Boot application. It typically contains:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The compiled classes of your application.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;All the dependencies required to run the application.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;A manifest with a &lt;span&gt;Main-Class&lt;/span&gt; attribute that allows the &lt;u&gt;JAR to be directly executed with the &lt;span&gt;java -jar&lt;/span&gt; command, making it a &lt;b&gt;fat JAR&lt;/b&gt; (a JAR that includes all dependencies bundled).&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This JAR is ready to be run as a self-contained application.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. batch-app-0.0.1-SNAPSHOT-plain.jar:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This is likely a &lt;b&gt;plain JAR&lt;/b&gt; file. A plain JAR:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Contains only the compiled classes of your application, without dependencies.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It is &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;not executable&lt;/b&gt;,&lt;/span&gt; meaning it cannot be run directly using &lt;span&gt;java -jar&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Typically, this type of JAR is used when the dependencies are managed separately, like in a traditional Java environment where dependencies are provided by an application server or a custom classpath.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Key Differences:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Executable JAR (&lt;/b&gt;batch-app-0.0.1-SNAPSHOT.jar&lt;b&gt;)&lt;/b&gt;: Contains everything (code + dependencies), can be run directly (&lt;span&gt;java -jar&lt;/span&gt;).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR (&lt;/b&gt;batch-app-0.0.1-SNAPSHOT-plain.jar&lt;b&gt;)&lt;/b&gt;: Contains only your code, needs additional dependencies, and cannot be run directly.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;jar, plain jar 파일 빌드시 파일 이름 변경 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728701436418&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jar {
    archiveBaseName.set(&quot;my-custom-plain-jar-name&quot;)
}

bootJar {
    archiveBaseName.set(&quot;my-custom-executable-jar-name&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Purpose of a Plain JAR File&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Lightweight Packaging&lt;/b&gt;: Plain JAR files only contain your application&amp;rsquo;s classes without bundling external dependencies. This can be useful when you don&amp;rsquo;t want to include large dependencies in the JAR (e.g., when dependencies are already managed elsewhere, like in an application server).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Separation of Concerns&lt;/b&gt;: In enterprise environments, plain JARs are used when the infrastructure is already set up to manage and provide the dependencies. This is typical in environments like:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Application Servers&lt;/b&gt;: These servers (e.g., Tomcat, JBoss, WebSphere) often manage dependencies and classpaths, so you only need to deploy the application JAR without its dependencies.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Shared Libraries&lt;/b&gt;: If your project depends on common libraries that are shared across multiple applications, using a plain JAR ensures you don&amp;rsquo;t duplicate dependencies.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;For Libraries or APIs&lt;/b&gt;: When you&amp;rsquo;re building a reusable library or API for other projects to consume, you usually create a plain JAR. Consumers of your library are expected to manage dependencies on their own.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Testing and Smaller Modules&lt;/b&gt;: Sometimes plain JARs are generated for smaller, non-executable modules in a larger system where each module is responsible for different functionality. You might not need an executable JAR for each part.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In short, plain JARs are useful when you have a structured environment that already handles classpath management and dependencies, or when you&amp;rsquo;re building reusable components or libraries.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.&amp;nbsp; Jar, palin Jar, War 차이&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A &lt;b&gt;plain JAR file&lt;/b&gt; and a &lt;b&gt;WAR file&lt;/b&gt; (Web Application Archive) serve different purposes, even though both are forms of archives for Java applications. Here are the key differences and similarities between them:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Purpose:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;A &lt;b&gt;JAR&lt;/b&gt; (Java ARchive) is typically used for &lt;b&gt;standalone applications&lt;/b&gt; or &lt;b&gt;libraries&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It can contain Java class files, resources (like images or properties files), and manifest files.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR files&lt;/b&gt; specifically do not bundle dependencies or configuration to run the application directly (like a Spring Boot &amp;ldquo;fat JAR&amp;rdquo; does).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;A &lt;b&gt;WAR&lt;/b&gt; (Web Application Archive) is used for &lt;b&gt;web applications&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It is designed to be deployed in a &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Servlet container&lt;/b&gt; like &lt;b&gt;Tomcat&lt;/b&gt;, &lt;b&gt;Jetty&lt;/b&gt;, &lt;b&gt;JBoss&lt;/b&gt;&lt;/span&gt;, etc.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;A WAR contains web-related resources like &lt;span&gt;WEB-INF/&lt;/span&gt;, JSPs, servlets, HTML files, JavaScript, etc., along with the application&amp;rsquo;s classes and libraries.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Structure:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Typically contains just your application&amp;rsquo;s &lt;span&gt;.class&lt;/span&gt; files and resources.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It may have a manifest file but doesn&amp;rsquo;t contain any web-specific configurations like &lt;span&gt;web.xml&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It does &lt;b&gt;not bundle external dependencies&lt;/b&gt; unless it&amp;rsquo;s a &amp;ldquo;fat&amp;rdquo; or executable JAR.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Has a defined structure for web applications, including:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WEB-INF/&lt;/span&gt; directory for deployment descriptors (like &lt;span&gt;web.xml&lt;/span&gt;), classes, and libraries (&lt;span&gt;WEB-INF/lib&lt;/span&gt;).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Static resources like HTML, JSP, CSS, JavaScript files in the root directory.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Typically includes dependencies within &lt;span&gt;WEB-INF/lib&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Deployment:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR files are not web-deployable&lt;/b&gt;. You run them using the &lt;span&gt;java -cp&lt;/span&gt; command or by adding them to another application&amp;rsquo;s classpath.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;You cannot deploy a plain JAR directly into a servlet container (like Tomcat), unless you wrap it in a WAR or an executable JAR.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR files are specifically designed for web deployments&lt;/b&gt; and can be deployed in a servlet container or an application server.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The servlet container manages the lifecycle and classloading of the WAR.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Main Class and Execution:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Usually requires a &lt;span&gt;Main-Class&lt;/span&gt; entry in its manifest if you want to run it as an application (via &lt;span&gt;java -jar&lt;/span&gt; or &lt;span&gt;java -cp&lt;/span&gt;).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;But it &lt;b&gt;cannot be run directly as a web application&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Contains no &lt;span&gt;Main-Class&lt;/span&gt; and isn&amp;rsquo;t run directly.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Instead, it relies on the servlet container to load and execute the web application.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Use Cases:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Plain JAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Used for standalone desktop or console applications.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Can be a library used by other Java applications.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;WAR File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Used for web applications with dynamic web pages (servlets, JSPs, etc.).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Deployable to servlet containers like Tomcat or Jetty.&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;4. JVM, JDK, JRE의 차이점&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.strephonsays.com/what-is-the-difference-between-jdk-and-jre&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.strephonsays.com/what-is-the-difference-between-jdk-and-jre&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 컴파일러가 컴파일하고 JVM이 읽어서 OS에게 명령~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Java 컴파일러 : java 프로그램을 바이트코드라는 중간 코드로 변환 -&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) JVM : Java Virtual Machine 으로 바이트 코드를 기계어 코드로 변환하는 추상 기계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우의 JVM은 다르다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서 도 동작시킬 수 있다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 소스코드는 CPU가 이해할 수 없고, 프로그래머만 이해 가능 ( Java Compiler가 소스코드 -&amp;gt; 바이트코드로 변환&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM이 바이트 코드 기계어 코드로 변환 따라서 CPU가 프로그램의 주어진 명령에 따라 작업 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) JRE : 자바 런타임 환경으로 JVM, Java 클래스 라이브러리 및 Java 응용 프로그램을 실행하는데 필요한 기타 파일의 조합이다. 따라서 JRE를 설치하면 Java 프로그램만 실행할 수 있다.(프로그램 개발은 불가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) JDK : 자바 개발 킷트 : JRE + 기타 개발도구(컴파일러(javac), 아카이버(jar), 문서생성기(javadoc))로 구성됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/257&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643789998325&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;A2 JVM, JRE, JDK의 차이&quot; data-og-description=&quot;자바에서 사용하는 용어 중 혼동하기 쉬운 JVM, JRE, JDK에 대해서 정리해 보자. ### JVM JVM은 자바 가상머신(Java Virtual Machine)의 ...&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/257&quot; data-og-url=&quot;https://wikidocs.net/257&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Fe8OM/hyNhUp5FCi/phecnOnMLuo9aVuY4dBAO1/img.gif?width=70&amp;amp;height=129&amp;amp;face=0_0_70_129&quot;&gt;&lt;a href=&quot;https://wikidocs.net/257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/257&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Fe8OM/hyNhUp5FCi/phecnOnMLuo9aVuY4dBAO1/img.gif?width=70&amp;amp;height=129&amp;amp;face=0_0_70_129');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;A2 JVM, JRE, JDK의 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 사용하는 용어 중 혼동하기 쉬운 JVM, JRE, JDK에 대해서 정리해 보자. ### JVM JVM은 자바 가상머신(Java Virtual Machine)의 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qklct/btrr6z9Xhw2/6UcRKvuz6KJKmflr8Bybt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qklct/btrr6z9Xhw2/6UcRKvuz6KJKmflr8Bybt1/img.png&quot; data-alt=&quot;https://m.blog.naver.com/duqrlwjddns1/221770110714&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qklct/btrr6z9Xhw2/6UcRKvuz6KJKmflr8Bybt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqklct%2Fbtrr6z9Xhw2%2F6UcRKvuz6KJKmflr8Bybt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;602&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://m.blog.naver.com/duqrlwjddns1/221770110714&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/duqrlwjddns1/221770110714&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.blog.naver.com/duqrlwjddns1/221770110714&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643790616063&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] JDK? JRE? JVM?&quot; data-og-description=&quot;자바를 공부하면서 헷갈리는 용어를 발견해 정리하고 넘어가고자 합니다. 설명에 앞서 Java의 철학은 다음...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/duqrlwjddns1/221770110714&quot; data-og-url=&quot;https://blog.naver.com/duqrlwjddns1/221770110714&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PUrkZ/hyNgdx2hFn/NDYsBgLqL2vxKhAMYDTtm1/img.png?width=416&amp;amp;height=406&amp;amp;face=0_0_416_406&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/duqrlwjddns1/221770110714&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/duqrlwjddns1/221770110714&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PUrkZ/hyNgdx2hFn/NDYsBgLqL2vxKhAMYDTtm1/img.png?width=416&amp;amp;height=406&amp;amp;face=0_0_416_406');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] JDK? JRE? JVM?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바를 공부하면서 헷갈리는 용어를 발견해 정리하고 넘어가고자 합니다. 설명에 앞서 Java의 철학은 다음...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/Java Language</category>
      <category>jar</category>
      <category>plain jar</category>
      <category>War</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/184</guid>
      <comments>https://prde.tistory.com/184#entry184comment</comments>
      <pubDate>Sat, 12 Oct 2024 11:51:54 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins - spring batch</title>
      <link>https://prde.tistory.com/446</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Jenkins와 Spring Batch&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;1) Jenkins의 스케쥴링 크론탭&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 잡의 병렬처리&amp;nbsp; :&amp;nbsp; jar을 동일 포트에서 여러개 병렬로 돌린다면 포트 중복이 일어날텐데 ?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Setting &lt;/b&gt;&lt;span&gt;server.port=0&lt;/span&gt; effectively disables the HTTP listener in Spring Boot, which is generally unnecessary for Spring Batch jobs that run independently without a web interface.&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Since Spring Batch jobs typically don&amp;rsquo;t require an HTTP server, this is a safe way to avoid port collisions while running multiple batch jobs concurrently.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;port = 0으로 할당하기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728442499984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server.port=0

server.port=8081 (for one of the jobs, and different for the other if needed)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잡 내의 병렬처리 : 다중 스레드 스탭을 이용해 잡 나누기, 병렬 스텝을 통해 잡 나누기, 비동기 ItemProcessor/ItemWirter를 이용해 병렬 처리하기, 원격 청킹을 통해 Read -&amp;gt; RabitMQ -&amp;gt; Write, 파티셔닝을 통해 병렬처리하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/Spring-Batch</category>
      <category>jenkins</category>
      <category>spring Batch</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/446</guid>
      <comments>https://prde.tistory.com/446#entry446comment</comments>
      <pubDate>Mon, 7 Oct 2024 22:45:59 +0900</pubDate>
    </item>
    <item>
      <title>ifconfig 명령어 및 네트워크 인터페이스 카드</title>
      <link>https://prde.tistory.com/445</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. ifconfig로 퍼블릭 아이피, 로컬 아이피&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;the &lt;span&gt;ifconfig&lt;/span&gt; command does not display your &lt;b&gt;public IP address&lt;/b&gt;. It only shows the &lt;b&gt;local IP addresses&lt;/b&gt; assigned to your network interfaces, like the ones on your LAN (Local Area Network) or loopback interface.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here&amp;rsquo;s a quick explanation of why:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Local IP addresses (Private IPs)&lt;/b&gt;: These are the addresses you see in the &lt;span&gt;ifconfig&lt;/span&gt; output, such as &lt;span&gt;192.168.x.x&lt;/span&gt; or &lt;span&gt;172.x.x.x&lt;/span&gt;. These are used within your local network and are not directly visible to the outside world. For example, &lt;span&gt;192.168.0.108&lt;/span&gt; in your output is your local IP on the Ethernet interface.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Public IP address&lt;/b&gt;: This is the IP address assigned to your router (or network device) by your Internet Service Provider (ISP) for communication over the internet. It is not shown in &lt;span&gt;ifconfig&lt;/span&gt; because &lt;span&gt;ifconfig&lt;/span&gt; only shows the addresses of your machine&amp;rsquo;s interfaces on the internal network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼블릭 아이피 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl&amp;nbsp;ifconfig.me&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;2. ifconfig 확인 - 네트워크 인터페이스 카드&amp;nbsp;&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;&lt;b&gt;1. br-a336ff40d8cd&lt;/b&gt; and &lt;b&gt;br-b16b276dfbfa&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;These interfaces are &lt;b&gt;bridge interfaces&lt;/b&gt;, typically created by Docker or similar virtualization tools. A bridge interface connects multiple network interfaces together, allowing communication between containers and the host.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;: Shows the IP address assigned to this bridge interface. For example, &lt;span&gt;172.19.0.1&lt;/span&gt; and &lt;span&gt;172.18.0.1&lt;/span&gt; are the IP addresses for &lt;span&gt;br-a336ff40d8cd&lt;/span&gt; and &lt;span&gt;br-b16b276dfbfa&lt;/span&gt;, respectively.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ether&lt;/span&gt;: This represents the MAC (Media Access Control) address of the interface, a unique identifier for network interfaces used in Ethernet communications.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;These bridges are likely being used for networking between containers, with their IP ranges (172.x.x.x) often used in private internal network&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;the &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;br-*&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; interfaces in your &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ifconfig&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; output are created by &lt;/span&gt;&lt;b&gt;Docker&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; or &lt;/span&gt;&lt;b&gt;Docker Compose&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;. These &lt;/span&gt;&lt;b&gt;bridge&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; interfaces are used by Docker to manage networking between containers and the host machine.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&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;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;docker0&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Another bridge interface, &lt;span&gt;docker0&lt;/span&gt; is the default Docker bridge. Docker uses this bridge to route container traffic from the host to the external network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;: IP address assigned to this interface is &lt;span&gt;172.17.0.1&lt;/span&gt;, which is within Docker&amp;rsquo;s default subnet range.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ether&lt;/span&gt;: The MAC address for this interface is &lt;span&gt;02:42:b3:90:07:28&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Like the other bridges, this interface enables container networking.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;enp3s0&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;This is likely the &lt;b&gt;physical Ethernet network interface&lt;/b&gt; on your machine. It&amp;rsquo;s the actual hardware that connects to your local network (wired Ethernet connection).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;: The IP address &lt;span&gt;192.168.0.108&lt;/span&gt; is the IP assigned to this interface by your router in the local network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;: This is the IPv6 address for this interface (&lt;span&gt;fe80::4fd2:f37b:47b7:e95f&lt;/span&gt;), used for communication over IPv6 networks.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ether&lt;/span&gt;: The MAC address &lt;span&gt;7c:10:c9:d3:1b:ee&lt;/span&gt; identifies this physical network interface card (NIC).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The &lt;span&gt;RX&lt;/span&gt; and &lt;span&gt;TX&lt;/span&gt; fields show the received and transmitted packets, indicating network traffic passing through this NIC.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;lo (Loopback interface)&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lo&lt;/span&gt; is the &lt;b&gt;loopback interface&lt;/b&gt;. It is a special network interface used for local machine communication.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;: &lt;span&gt;127.0.0.1&lt;/span&gt; is the loopback IP address (also known as &amp;ldquo;localhost&amp;rdquo;), used to communicate with services running on the same machine.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;: &lt;span&gt;::1&lt;/span&gt; is the loopback address for IPv6.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Traffic sent to this interface only travels within your local machine and does not leave your device.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) Loopback is why Loopback&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The term &lt;b&gt;&amp;ldquo;loopback&amp;rdquo;&lt;/b&gt; refers to a special network interface used to &lt;span style=&quot;color: #ee2323;&quot;&gt;route traffic back to the same device &lt;span style=&quot;color: #000000;&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;h&lt;/span&gt;at sent it. It is a logical network interface that allows the system to communicate with itself, commonly used for testing and local inter-process communication.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why is it called &amp;ldquo;Loopback&amp;rdquo;?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The word &amp;ldquo;loopback&amp;rdquo; comes from the idea of &lt;b&gt;&amp;ldquo;looping back&amp;rdquo;&lt;/b&gt; network traffic:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;&amp;ldquo;Loop&amp;rdquo;&lt;/b&gt;: A loop is a circular path, meaning the data goes out and comes right back.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;&amp;ldquo;Back&amp;rdquo;&lt;/b&gt;: Refers to the fact that the data is sent back to the same system, rather than being transmitted to another device over the network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Essentially, the data sent to the loopback interface &lt;b&gt;loops back&lt;/b&gt; to the machine itself, instead of leaving the machine.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Practical Uses of Loopback:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Local Communication&lt;/b&gt;: The loopback interface allows applications running on the same machine to communicate with each other using the networking stack without the need for a physical network connection. For example, web servers like Apache or Nginx can be accessed at &lt;span&gt;127.0.0.1&lt;/span&gt; (localhost) to test locally without going over the network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Testing&lt;/b&gt;: Developers often use the loopback interface to test network applications and services without involving external networks.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Localhost&lt;/b&gt;: The IP address &lt;span&gt;127.0.0.1&lt;/span&gt; (for IPv4) or &lt;span&gt;::1&lt;/span&gt; (for IPv6) is reserved for the loopback interface. It is commonly known as &lt;b&gt;localhost&lt;/b&gt;, and any traffic sent to this address is routed back to the same machine.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When you ping &lt;span&gt;127.0.0.1&lt;/span&gt; or &lt;span&gt;localhost&lt;/span&gt;, the traffic is sent out and immediately returned to your system, demonstrating that the network stack is functioning correctly. It&amp;rsquo;s a quick way to test if the local network configuration is working.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why It&amp;rsquo;s Special:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlike other network interfaces that connect to external networks, the loopback interface &lt;b&gt;does not require any physical hardware&lt;/b&gt; and exists purely for internal communication within the machine. It ensures that the system can route data to itself without needing a real network card or external connection.&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;3. http://localhost VS. http:127.0.0.1&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;The issue where &lt;span&gt;http://localhost&lt;/span&gt; doesn&amp;rsquo;t work while &lt;span&gt;http://127.0.0.1&lt;/span&gt; does, especially in browser testing modes (like mobile testing mode), is due to the differences between how &lt;span&gt;localhost&lt;/span&gt; and &lt;span&gt;127.0.0.1&lt;/span&gt; are resolved and handled by various systems and configurations.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Key Differences Between localhost and 127.0.0.1:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Name Resolution&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt; is a &lt;b&gt;hostname&lt;/b&gt; that the operating system needs to resolve to an IP address (usually to &lt;span&gt;127.0.0.1&lt;/span&gt; for IPv4 or &lt;span&gt;::1&lt;/span&gt; for IPv6). This resolution is handled either by a system&amp;rsquo;s DNS resolver or through the &lt;b&gt;hosts file&lt;/b&gt; (e.g., &lt;span&gt;/etc/hosts&lt;/span&gt; on Linux and macOS or &lt;span&gt;C:\Windows\System32\drivers\etc\hosts&lt;/span&gt; on Windows).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;127.0.0.1&lt;/span&gt; is the &lt;b&gt;direct IP address&lt;/b&gt; of the loopback interface and doesn&amp;rsquo;t require name resolution.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Network Stack Handling&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Some applications or network configurations treat &lt;span&gt;localhost&lt;/span&gt; and &lt;span&gt;127.0.0.1&lt;/span&gt; differently. &lt;span&gt;localhost&lt;/span&gt; can sometimes be affected by &lt;b&gt;DNS settings&lt;/b&gt;, browser behavior, or even firewall rules.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Mobile testing modes&lt;/b&gt; (or virtual devices) in browsers might treat &lt;span&gt;localhost&lt;/span&gt; as a device-specific name that resolves differently in a mobile or isolated environment.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reasons localhost Might Not Work While 127.0.0.1 Does:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;DNS or Hosts File Issues&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The &lt;span&gt;localhost&lt;/span&gt; name might not resolve properly due to a misconfigured &lt;b&gt;hosts file&lt;/b&gt; or other name resolution issues.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;If &lt;span&gt;localhost&lt;/span&gt; is missing or incorrectly mapped in the &lt;span&gt;hosts&lt;/span&gt; file, it won&amp;rsquo;t resolve to &lt;span&gt;127.0.0.1&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;IPv6 vs. IPv4&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Modern systems might try to resolve &lt;span&gt;localhost&lt;/span&gt; to the &lt;b&gt;IPv6&lt;/b&gt; address &lt;span&gt;::1&lt;/span&gt; by default, but if your server is only listening on an &lt;b&gt;IPv4&lt;/b&gt; interface (127.0.0.1), it won&amp;rsquo;t work.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;127.0.0.1&lt;/span&gt; forces an &lt;b&gt;IPv4 connection&lt;/b&gt;, while &lt;span&gt;localhost&lt;/span&gt; could attempt either IPv6 (&lt;span&gt;::1&lt;/span&gt;) or IPv4, depending on the configuration.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Browser Behavior in Testing Modes&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;When testing in mobile emulation mode, some browsers or virtual machines might treat &lt;span&gt;localhost&lt;/span&gt; as a special name and may not map it correctly to &lt;span&gt;127.0.0.1&lt;/span&gt;. This can be due to isolation or containerization of the test environment.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Mobile emulation modes&lt;/b&gt; may use different internal DNS settings that affect how &lt;span&gt;localhost&lt;/span&gt; resolves compared to &lt;span&gt;127.0.0.1&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Proxy or Firewall Settings&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;If you&amp;rsquo;re using any proxies or firewalls, they might behave differently for &lt;span&gt;localhost&lt;/span&gt; versus &lt;span&gt;127.0.0.1&lt;/span&gt;. For instance, &lt;span&gt;localhost&lt;/span&gt; traffic might be blocked or rerouted through a proxy, while &lt;span&gt;127.0.0.1&lt;/span&gt; goes directly to the loopback interface.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How to Fix or Investigate:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Check the Hosts File&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ensure that &lt;span&gt;localhost&lt;/span&gt; is correctly mapped to &lt;span&gt;127.0.0.1&lt;/span&gt; in your system&amp;rsquo;s hosts file. For example:&lt;/p&gt;
&lt;pre id=&quot;code_1726986790215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;127.0.0.1 localhost
::1       localhost&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Force IPv4 in Your Application&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you suspect IPv6 is causing the issue, ensure your application is bound to both IPv4 and IPv6, or specifically to &lt;span&gt;127.0.0.1&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Try Disabling Proxies&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you&amp;rsquo;re using a browser with mobile testing mode, check if there are any proxy settings enabled that might treat &lt;span&gt;localhost&lt;/span&gt; differently.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Use &lt;/b&gt;&lt;span&gt;127.0.0.1&lt;/span&gt;&lt;b&gt; Directly&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In cases where &lt;span&gt;localhost&lt;/span&gt; doesn&amp;rsquo;t work and you need to test quickly, just use &lt;span&gt;http://127.0.0.1&lt;/span&gt; directly in your browser.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt; might not work in certain scenarios because of DNS resolution issues, IPv6/IPv4 mismatches, or browser-specific handling in testing modes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Using &lt;span&gt;127.0.0.1&lt;/span&gt; bypasses these issues since it is a direct IP address that doesn&amp;rsquo;t require name resolution and explicitly uses IPv4.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* DNS name resolution&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- name resolution : 도메인 이름에 대응하는 IP 주소 찾아내는 작업&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>ifconfig</category>
      <category>nic</category>
      <category>네트워크 인터페이스 카드</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/445</guid>
      <comments>https://prde.tistory.com/445#entry445comment</comments>
      <pubDate>Sun, 22 Sep 2024 14:58:59 +0900</pubDate>
    </item>
    <item>
      <title>Capturing network requests</title>
      <link>https://prde.tistory.com/444</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Catching (or &lt;b&gt;capturing&lt;/b&gt;) network requests to a server is often referred to as &lt;b&gt;packet sniffing&lt;/b&gt; or &lt;b&gt;network traffic analysis&lt;/b&gt;. This process can be used to monitor, inspect, and analyze the data packets being sent across a network, including requests to a specific server. Here&amp;rsquo;s a general overview of how to capture these requests and the tools you can use.&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;1. Using Wireshark (Packet Sniffing)&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;Wireshark is a popular open-source network protocol analyzer that allows you to capture and inspect data packets in real time. It&amp;rsquo;s widely used for troubleshooting, network analysis, and security auditing.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Steps to Capture Requests to a Server:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Install Wireshark&lt;/b&gt;: Download and install Wireshark on your machine from &lt;a href=&quot;https://www.wireshark.org/&quot;&gt;wireshark.org&lt;/a&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Start a Capture&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Open Wireshark and select the &lt;b&gt;network interface&lt;/b&gt; (e.g., Ethernet or Wi-Fi) you want to monitor.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Start the capture by clicking the &lt;b&gt;blue shark fin&lt;/b&gt; icon in the top-left corner.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Filter Traffic&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;If you want to capture requests to a specific server (e.g., &lt;span&gt;example.com&lt;/span&gt; or its IP), you can set a filter to narrow down the traffic.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Use the following filter syntax:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;To capture traffic to a specific &lt;b&gt;IP address&lt;/b&gt;: ip.addr&amp;nbsp;==&amp;nbsp;&amp;lt;server_IP_address&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;To capture traffic on a specific &lt;b&gt;port&lt;/b&gt; (e.g., port 80 for HTTP or port 443 for HTTPS): tcp.port&amp;nbsp;==&amp;nbsp;80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;To capture &lt;b&gt;HTTP requests&lt;/b&gt;:http.request&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;For a &lt;b&gt;specific protocol&lt;/b&gt; (e.g., HTTPS, DNS, FTP):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ssl&amp;nbsp;||&amp;nbsp;tls&amp;nbsp;&amp;nbsp;#&amp;nbsp;for&amp;nbsp;HTTPS&lt;br /&gt;dns&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;for&amp;nbsp;DNS&amp;nbsp;traffic&lt;br /&gt;ftp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;for&amp;nbsp;FTP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;These filters help isolate the specific requests and responses to/from the server you are interested in.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Analyze the Packets&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;After stopping the capture, Wireshark will display all captured packets. You can inspect each packet to see the details, including:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Source IP address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Destination IP address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Protocol used (TCP, UDP, HTTP, etc.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Request type (GET, POST, etc.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Payload data (for unencrypted requests)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;For encrypted traffic like HTTPS, you will see encrypted data unless you have access to the decryption keys (e.g., in a controlled environment or using an SSL proxy).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Save or Export Data&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;You can save captured traffic for later analysis or export specific packet data in various formats.&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;2. Using tcpdump (Command-Line Tool)&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;If you prefer a command-line tool, &lt;span&gt;tcpdump&lt;/span&gt; is a powerful utility for capturing network packets. It&amp;rsquo;s commonly used on Linux and macOS.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Steps to Use tcpdump:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Install tcpdump&lt;/b&gt; (if not already installed):&lt;/p&gt;</description>
      <category>CS/Network</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/444</guid>
      <comments>https://prde.tistory.com/444#entry444comment</comments>
      <pubDate>Sat, 21 Sep 2024 22:16:21 +0900</pubDate>
    </item>
    <item>
      <title>Telnet vs. SSH</title>
      <link>https://prde.tistory.com/443</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Telnet (TELecommunication NETwork):&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;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Purpose&lt;/b&gt;: Telnet is used to access remote devices over a network by providing a command-line interface (CLI). It allows you to log in and execute commands on remote devices as if you were physically present.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Security&lt;/b&gt;: Telnet sends all data, including login credentials and commands, in &lt;b&gt;plain text&lt;/b&gt;. This means anyone who intercepts the traffic can read the information.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Port&lt;/b&gt;: By default, Telnet operates over &lt;b&gt;port 23&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Encryption&lt;/b&gt;: &lt;b&gt;No encryption&lt;/b&gt; is provided, making it insecure for transmitting sensitive information over the internet.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Use Case&lt;/b&gt;: Telnet is now largely deprecated due to its lack of security. &lt;span style=&quot;color: #ee2323;&quot;&gt;It may still be used in controlled or private networks where security is less of a concern,&lt;/span&gt; but it&amp;rsquo;s generally avoided for internet-facing applications.&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;2. SSH (Secure Shell):&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;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Purpose&lt;/b&gt;: SSH is used for secure remote login to a system over an untrusted network (e.g., the internet). Like Telnet, it allows you to execute commands on remote machines, but it does so securely.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Security&lt;/b&gt;: SSH encrypts the session, including login credentials and data, making it much more secure than Telnet.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Port&lt;/b&gt;: By default, SSH operates over &lt;b&gt;port 22&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Encryption&lt;/b&gt;: SSH uses strong encryption (e.g., RSA, DSA, or ECDSA) to secure the communication, making it safe to use even over the internet.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Use Case&lt;/b&gt;: SSH is the preferred method for remote access in almost all modern systems due to its security features. It&amp;rsquo;s widely used for system administration, secure file transfers, and tunneling.&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;3. 그럼에도 Telnet을 사용하는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그냥 구닥다리 시스템 or port 연결 테스트 정도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Despite Telnet&amp;rsquo;s well-known security issues, it is still used in certain situations, often due to its simplicity, legacy support, and specific use cases where security is less of a concern. Here are some reasons why developers or network administrators might still use Telnet:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Legacy Systems:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Older Devices&lt;/b&gt;: Some older network devices, hardware, and embedded systems only support Telnet and do not have SSH capabilities. For example, &lt;span style=&quot;color: #ee2323;&quot;&gt;older routers, switches, or industrial equipment&lt;/span&gt; may rely on Telnet for remote access.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Compatibility&lt;/b&gt;: In environments where upgrading systems is costly or complex, organizations may continue to use Telnet because it&amp;rsquo;s the only supported protocol on those devices.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Closed or Private Networks:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Low-Risk Environments&lt;/b&gt;: In some cases, Telnet is used within highly controlled or private networks where security risks are minimal (e.g., lab environments, closed local networks). If there&amp;rsquo;s no internet exposure, the lack of encryption may not be as critical.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Testing Environments&lt;/b&gt;: In development or testing environments, where speed and ease of use are prioritized over security, Telnet might be chosen for basic connectivity checks or diagnostics.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Simple Connectivity Testing:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Quick Diagnostics&lt;/b&gt;: Telnet is sometimes used for simple &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;port connectivity tests&lt;/b&gt;. For example, it can quickly check if a specific port on a remote system is open, especially for troubleshooting purposes&lt;/span&gt; (e.g., firewall issues, network latency).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Basic Troubleshooting&lt;/b&gt;: Some administrators use Telnet to troubleshoot services like web servers or mail servers. For example, Telnet can be used to test HTTP, SMTP, or FTP connections by establishing a raw connection and sending manual commands.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Lightweight and Easy:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;No Overhead&lt;/b&gt;: Telnet is lightweight, with no need for key exchange, encryption, or complex configurations. This can make it attractive in situations where performance or simplicity is prioritized, such as in real-time or resource-constrained environments.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Welfare or Health Checks (Like you suggested):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Open-Check Usage&lt;/b&gt;: In some environments, Telnet can be used for &lt;b&gt;basic health checks&lt;/b&gt; on devices or services. It allows quick access to verify that a service is running, especially if no critical data is being transmitted.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Legacy Monitoring Tools&lt;/b&gt;: Some older monitoring or management tools may rely on Telnet for simple pings or to verify service availability without requiring modern protocols like SSH.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Educational Purposes:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Learning Tool&lt;/b&gt;: Telnet can be used in educational settings to demonstrate the workings of basic network communication. It&amp;rsquo;s a simple way to introduce students to the concepts of command-line access, networking, and protocol behavior.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why It Should Be Avoided in Most Cases:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Even though there are scenarios where Telnet is still used, it should generally be avoided, especially in production environments, for the following reasons:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Security Risks&lt;/b&gt;: Telnet&amp;rsquo;s plain-text transmission makes it highly vulnerable to &lt;b&gt;man-in-the-middle attacks&lt;/b&gt;, &lt;b&gt;eavesdropping&lt;/b&gt;, and &lt;b&gt;credential theft&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;No Encryption&lt;/b&gt;: Modern security standards demand encryption for remote access to prevent unauthorized access and data breaches.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Compliance Issues&lt;/b&gt;: Many security standards (e.g., PCI-DSS, HIPAA) require the use of encrypted communication, which makes Telnet non-compliant in many regulated industries.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Alternatives for Specific Use Cases:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;For Legacy Devices&lt;/b&gt;: Some organizations set up &lt;b&gt;VPNs&lt;/b&gt; or &lt;b&gt;jump hosts&lt;/b&gt; to tunnel Telnet sessions securely.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;For Port Checking&lt;/b&gt;: Tools like &lt;span&gt;nc&lt;/span&gt; (netcat) or SSH-based port-forwarding can provide similar port-checking functionality in a secure manner.&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>kafka</category>
      <category>SpringBoot</category>
      <category>websocketconfig</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/443</guid>
      <comments>https://prde.tistory.com/443#entry443comment</comments>
      <pubDate>Sat, 21 Sep 2024 20:57:30 +0900</pubDate>
    </item>
    <item>
      <title>7장 HTTPS</title>
      <link>https://prde.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. HTTP의 약점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 평문(암호화하지 않은) 통신이기 때문에 도청 가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 자신을 암호화하는 기능이 없기 때문에 통신 전체가 암호화되지 않는다. 즉, 평문으로 HTTP메시지를 보내게 된다. 이를 방지하기 위해 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;a.&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;통신 암호화&lt;/span&gt;&lt;/b&gt;(SSL이나 TLS이라는 다른 프로토콜을 조합해서 HTTP 통신 내용을 암호화할 수 있다.)나&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; b. 콘텐츠 암호화&lt;/span&gt;&lt;/b&gt;(콘텐츠 내용 자체를 암호화하는 방법)등을 이용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 통신 상대를 확인하지 않기 때문에 위장 가능하다.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP를 사용한 리퀘스트나 리스폰스에서는 통신 상대를 확인하지 않는다. 따라서 누구든지 리퀘스트를 보낼 수 있고 누구든지 리스폰스를 반환할 수 있다. 이를 보완하기 위해 상대를 확인하는 증명서의 기능을 하는 SSL을 활용할 수 있다. SSL은 암호화뿐만 아니라 상대를 확인하는 수단으로 증명서를 제공한다. 이 증명서는 제3 기관에 의해 발행되는 것이기 때문에 위조하는 것이 거의 불가능하다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 완전성을 증명할 수 없기 때문에 변조 가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;HTTP가 완전성을 증명할 수 없다는 뜻은 만약 리퀘스트나 리스폰스가 발신된 후에 &lt;u&gt;상대가 수신할 때까지의 사이에 변조되었다고 하더라도 이 사실을 알 수 없다&lt;/u&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;2. HTTPS( HTTP + 암호화 + 인증 + 완전성 보호 = HTTPS)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 문제점을 해결하기 위해 HTTP에 &lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;암호화나&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;인증 등의 구조&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;를 더한 것을 HTTPS라고 부른다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS는 통신을 하는 소켓 부분을 SSl(SecureSocketLayer)이나 TLS(Transport LayerSecurity)라는 프로토콜로 대체하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;즉, HTTP는 SSL과 통신하고 SSL이 TCP와 통신한다. SSl이라는 껍질을 덮어쓴 HTTP가 HTTPS이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 공개 키 암호화 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화와 복호화에 하나의 키를 같이 사용하는 방식을 공통키 암호라고 부른다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통 키 암호의 딜레마로 나온 것이 두 개의 키를 사용하는 공개키 암호이다. 공개키 암호를 사용한 암호화는 암호를 보내는 측이 상대의 공개키를 사용해 암호화한다. 그리고 암호화된 정보를 받아들인 상대는 자신의 비밀키를 사용해 복호화를 실시한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) HTTP는 하이브리드 암호 시스템&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개키 암호는 공통 키 암호에 비해 처리 속도가 늦다. HTTP는 공개키와 공통 키 암호의 양쪽 장점을 살릴 수 있도록 각각의 방식을 조합해서 통신한다. 키를 교환하는 곳에서는 공개키 암호를 사용하고 그 후의 통신에서 메시지를 교환하는 곳에서는 공통 키 암호를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 공개키가 정확한지 아닌지 증명하는 증명서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 서버와 공개키 암호를 사용해서 통신을 하려고 할 때 공개키가 본래 의도한 서버에서 발행한 공개키인지 확신할 수가 없다. 이를 위해 제3기 관인 인증기관을 이용해 안전성을 확보한다. (공개키 인증서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS에서는 클라이언트 증명서도 이용할 수 있다. &lt;span style=&quot;color: #ee2323;&quot;&gt;클라이언트 증명서를 이용해 서버 증명서와 같이 통신하고 있는 상대가 의도한 클라이언트인 것을 증명하는 클라이언트 인증을 할 수 있다&lt;/span&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;3. 항상 HTTPS를 사용하지 않는이유?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 통신이 지연되는 이유에는 두 가지가 있다. 하나는 통신 속도가 떨어지는 것과 다른 하나는 CPU나 메모리 등의 리소스를 다량으로 소비하며 처리가 느려지는 것이다. 네트워크 부하는 HTTP를 사용하는 경우에 비해 2배에서 100배 정도 느려질 수 있다. TCP 접속과 HTTP 리퀘스트, 리스폰스 이외에 &lt;span style=&quot;color: #ee2323;&quot;&gt;SSL에 필요한 통신이 추가되어 처리해야 할 통신이 증가하기 때문이다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 항상 HTTPS를 사용하지 않는 이유는 암호화 통신은 CPU와 메모리 등 리소스를 많이 필요로 하기 때문이다. 특히 액세스가 많은 웹 사이트 등에서 암호화를 하면 그 부하가 상당하기 때문에 암호화를 사용하는 경우에는 모든 콘텐츠를 암호화하는 것이 아니라 숨겨야 할 정보만 암호화하면서 리소스를 절약한다. 추가적으로 HTTPS를 사용하기 위해서 증명서가 필요하지만, 이를 사용하기 위해서 구매해야 한다. 이 비용 또한 상당하기 때문에 HTTP만 선택하는 경우도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 대칭키 암호화와 비대칭키 암호화&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;대칭키 암호화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;클라이언트와 서버가 동일한 키를 사용해 암/복호화 진행&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;키가 노출되면 매우 위험, 연산 속도가 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비대칭키 암호화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1개의 쌍으로 구성된 공개키와 개인키를 암호화/복호화 하는데 사용함&lt;/li&gt;
&lt;li&gt;키가 노출되어도 비교적 안전하지만 연산 속도가 느림.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Pem file의 역할 SSL/TLS&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the context of SSL/TLS certificates, &lt;span&gt;.pem&lt;/span&gt; files are typically used to store the SSL certificate and the associated private key. Let&amp;rsquo;s break down the role of each file in your example:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;b&gt;1.&lt;span&gt; abc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.com_20240610A2C12.crt.pem&lt;span&gt; (Certificate file):&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;This file contains the &lt;b&gt;public SSL certificate&lt;/b&gt; for your domain (&lt;b&gt;&lt;span&gt;abc&lt;/span&gt;&lt;/b&gt;&lt;span&gt;.com&lt;/span&gt; in this case).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The certificate is used by clients (e.g., browsers) to establish a secure connection with the server, ensuring that the server is who it claims to be. It may include information such as the domain name, the issuing Certificate Authority (CA), the validity period, and the public key.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The certificate is presented to clients during the SSL/TLS handshake to verify the server&amp;rsquo;s identity.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;b&gt;2.&lt;span&gt; &lt;b&gt;&lt;span&gt;abc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.com_20240610A2C12.key.pem&lt;span&gt; (Private key file):&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;This file contains the &lt;b&gt;private key&lt;/b&gt; associated with the public SSL certificate.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The private key is used by the server to decrypt the encrypted data sent by clients. It also helps in signing data during the SSL handshake, ensuring that the server holds the private key corresponding to the public key in the certificate.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;This key is highly sensitive and must be kept secure because anyone with access to it can impersonate the server.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How They Work Together:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;When a client (e.g., a web browser) attempts to connect to your server, the server sends the public certificate (&lt;span&gt;.crt.pem&lt;/span&gt;) to the client.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The client uses the public key from the certificate to encrypt data and send it back to the server.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The server uses its &lt;b&gt;private key&lt;/b&gt; (stored in the &lt;span&gt;.key.pem&lt;/span&gt; file) to decrypt this data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The private key is never shared, while the certificate (public key) is sent to clients.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Both files are essential for enabling SSL/TLS on a server: the certificate file proves the server&amp;rsquo;s identity, and the private key enables encrypted communication.&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;6. AES-256, SHA-256, BCrypt, 공개키(비대칭키), 대칭키&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;1) Hashing의 의미&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Hashing&lt;/b&gt; is the process of taking an input (or &amp;ldquo;message&amp;rdquo;) and generating &lt;span style=&quot;color: #ee2323;&quot;&gt;a fixed-size string of characters&lt;/span&gt;&lt;b&gt;,&lt;/b&gt; which is typically a &amp;ldquo;digest&amp;rdquo; that represents the original data. Hashing is commonly used in computer science for various purposes, such as verifying data integrity, storing passwords, and enabling efficient data retrieval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Key Characteristics of Hashing:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Fixed-Length Output&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Regardless of the size of the input data, the hash function produces &lt;span style=&quot;color: #ee2323;&quot;&gt;a fixed-length output.&lt;/span&gt; For example, &lt;b&gt;SHA-256&lt;/b&gt; always generates a 256-bit (32-byte) hash value, even if the input is one byte or one gigabyte.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Deterministic&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The same input will always produce &lt;span style=&quot;color: #ee2323;&quot;&gt;the same hash output. &lt;/span&gt;This consistency is crucial for uses like verifying data integrity.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;One-Way Function&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Hash functions are designed to be &lt;b&gt;one-way&lt;/b&gt;, meaning &lt;span style=&quot;color: #ee2323;&quot;&gt;it&amp;rsquo;s practically impossible to reverse the process&lt;/span&gt; and determine the original input from the hash. This property makes hashing useful for things like storing passwords securely.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Avalanche Effect&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;A small change in the input results in a &lt;span style=&quot;color: #ee2323;&quot;&gt;significantly different hash output&lt;/span&gt;. This ensures that even similar inputs generate very different hashes, which is vital for security purposes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Collision Resistance&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It&amp;rsquo;s difficult (though not impossible) to find two different inputs that produce the same hash value. This property, called &lt;b&gt;collision resistance&lt;/b&gt;, is essential for maintaining the uniqueness of hashes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Common Uses of Hashing:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Data Integrity Verification&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Hashes are used to verify that data hasn&amp;rsquo;t been altered. For example, when you download a file, its hash is often provided by the source so you can check if the file was modified or corrupted during transfer.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Password Storage&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Hashing is used to securely store passwords. Instead of storing &lt;span style=&quot;color: #ee2323;&quot;&gt;plain-text passwords in a database, systems store hashed passwords.&lt;/span&gt; When a user logs in, the system hashes the entered password and compares it to the stored hash.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Digital Signatures&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Hashing plays a crucial role in digital signatures. A document&amp;rsquo;s hash is encrypted with a private key to generate a digital signature, ensuring both the document&amp;rsquo;s integrity and the authenticity of the signer.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Hash Tables and Data Structures&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Hashing is also used in data structures like &lt;b&gt;hash tables&lt;/b&gt;, where it helps in quickly retrieving data by mapping input keys to specific locations in memory.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Hashing vs. Encryption:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Hashing&lt;/b&gt; is a &lt;b&gt;one-way&lt;/b&gt; process, meaning you cannot recover the original input from the hash. It&amp;rsquo;s typically used for integrity checks and securing sensitive data like passwords.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Encryption&lt;/b&gt;, on the other hand, is &lt;b&gt;reversible&lt;/b&gt;. Data is transformed using an encryption key, and the original data can be decrypted using a decryption key.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Common Hashing Algorithms:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;SHA-256&lt;/b&gt; (Secure Hash Algorithm)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;MD5&lt;/b&gt; (Message Digest Algorithm 5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;SHA-1&lt;/b&gt; (Secure Hash Algorithm 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;BCrypt&lt;/b&gt; (designed for password hashing, with salting and cost factor features)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) BCrypt&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BCrypt&lt;/b&gt; is also a hashing algorithm, but it is specifically designed for &lt;b&gt;secure password hashing&lt;/b&gt; and differs in key ways from general-purpose hashing algorithms like SHA-256. Here&amp;rsquo;s a breakdown of BCrypt and its purpose:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;What is BCrypt?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;BCrypt&lt;/b&gt; is a cryptographic hash function designed for securely hashing passwords. It is based on the &lt;b&gt;Blowfish&lt;/b&gt; cipher and was created with the goal of being slow and computationally expensive, making it much harder for attackers to perform brute force or dictionary attacks.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How BCrypt Differs from Algorithms Like SHA-256:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Purpose&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;SHA-256&lt;/b&gt; and other cryptographic hash functions (e.g., MD5, SHA-1) are designed for general data integrity verification, not specifically for passwords.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;BCrypt&lt;/b&gt; is purpose-built for &lt;b&gt;password hashing&lt;/b&gt;. It&amp;rsquo;s designed to make brute-force attacks much more difficult by being deliberately slow.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Key Features of BCrypt&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Adaptive Cost Factor&lt;/b&gt;: BCrypt allows for a configurable &amp;ldquo;work factor,&amp;rdquo; which makes the hash computation slower. As computing power increases over time, you can increase the cost factor to ensure that password hashing remains computationally expensive.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Salting&lt;/b&gt;: BCrypt automatically adds a unique &lt;b&gt;salt&lt;/b&gt; (random value) to each password before hashing, which helps defend against rainbow table attacks. Even if two users have the same password, their BCrypt hashes will be different due to the unique salt.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Slowness&lt;/b&gt;: By being slower than traditional hash functions like SHA-256, BCrypt is more resistant to brute-force attacks, where attackers try many possible passwords to guess the correct one.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Password Hashing vs. General Hashing&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;General Hashing (SHA-256)&lt;/b&gt;: Primarily used for data integrity checks, digital signatures, and other purposes where speed is important. It&amp;rsquo;s fast and deterministic but not designed to be slow or handle the specific security needs of password storage.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Password Hashing (BCrypt)&lt;/b&gt;: BCrypt is designed to be slow and resistant to attacks targeting passwords. The added cost factor and salting mechanisms make it more secure for password storage.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why BCrypt is Preferred for Password Hashing:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Slows Down Attackers&lt;/b&gt;: BCrypt is computationally expensive, meaning that brute-force attempts to guess passwords will take significantly longer. This makes it much more secure than using fast hash functions like SHA-256 for passwords.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Built-in Salting&lt;/b&gt;: Each password hash generated with BCrypt contains a random salt, preventing attackers from using precomputed hash databases (rainbow tables) to crack passwords.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yes, BCrypt is a hashing algorithm, but it is specifically designed for securely hashing &lt;b&gt;passwords&lt;/b&gt;. It includes features like salting, adjustable cost, and deliberate slowness to provide stronger protection against password-cracking attacks. It is commonly recommended for password storage, whereas general-purpose algorithms like SHA-256 are better suited for data integrity checks and cryptographic applications.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Hashing 알고리즘 적용 된 값에서 평문 끄집어 낼 수 있나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why You Can&amp;rsquo;t Reverse a Hash:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;One-way Function&lt;/b&gt;: Hash functions like &lt;b&gt;SHA-256&lt;/b&gt; (which your example hash appears to be from) are designed to be &lt;b&gt;one-way functions&lt;/b&gt;. This means that once data is hashed, it cannot be reversed to obtain the original input. The process is non-reversible by design.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Collision Resistance&lt;/b&gt;: Although theoretically possible, finding two different inputs that generate the same hash (called a collision) is extremely difficult with strong hash functions like SHA-256 due to their mathematical complexity.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Preimage Resistance&lt;/b&gt;: Given a hash output, it is computationally infeasible to find any input that produces that hash. In other words, starting with a hash like &lt;span&gt;3a7bd3e2360a3d80af0a359baf9be82678a4a01a8aae4c6f326f6ffb16c25b23&lt;/span&gt;, there&amp;rsquo;s no efficient way to determine what input (plain text) produced it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Methods People Might Try:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Brute Force Attack&lt;/b&gt;: One could theoretically try every possible combination of input text, hash it, and compare the result with the given hash until they find a match. However, if the original text was sufficiently complex (long, containing various characters), this would take an infeasible amount of time, especially for strong hashing algorithms like SHA-256.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Rainbow Tables&lt;/b&gt;: These are precomputed tables of common inputs and their corresponding hash values. However, modern security practices use techniques like &lt;b&gt;salting&lt;/b&gt; (adding random data to the input before hashing) to make rainbow tables ineffective.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) AES-256 = 대칭키 암호화 알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AES-256&lt;/b&gt; (Advanced Encryption Standard with a 256-bit key) is not a public key encryption method. It is a &lt;b&gt;symmetric key encryption algorithm&lt;/b&gt;, meaning the same key is used for both encryption and decryption of data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Key Differences Between Symmetric and Public-Key (Asymmetric) Encryption:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Symmetric Encryption (like AES-256)&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Same key&lt;/b&gt; is used for both encryption and decryption.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The key must be securely shared between the parties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;It&amp;rsquo;s faster and efficient for encrypting large amounts of data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Example algorithms: AES, DES, RC4.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Asymmetric (Public-Key) Encryption&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Two keys&lt;/b&gt; are used: one for encryption (public key) and one for decryption (private key).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;The public key can be shared openly, but the private key is kept secret.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Asymmetric encryption is generally slower and used for smaller data, such as encrypting the symmetric key (for hybrid encryption systems).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Example algorithms: RSA, ECC (Elliptic Curve Cryptography), DSA.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AES-256 Role:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;AES-256 is often used in combination with asymmetric encryption in a &lt;b&gt;hybrid encryption system&lt;/b&gt;. For example, the symmetric AES key might be encrypted using a public-key algorithm like RSA, while AES-256 handles the actual data encryption due to its speed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In short, AES-256 is a &lt;b&gt;symmetric encryption&lt;/b&gt; method, not a public-key (asymmetric) one.&lt;/p&gt;</description>
      <category>개발관련 도서/Http&amp;amp;Network Basic</category>
      <category>crt.pem</category>
      <category>https</category>
      <category>key.pem</category>
      <category>공개키암호화</category>
      <category>공통키암호화</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/108</guid>
      <comments>https://prde.tistory.com/108#entry108comment</comments>
      <pubDate>Sat, 21 Sep 2024 16:56:45 +0900</pubDate>
    </item>
    <item>
      <title>NoSQL MongoDB</title>
      <link>https://prde.tistory.com/438</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 데이터 모델링과 인덱싱&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) 컬렉션 사이의 관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 객체 내부에 또 다른 객체를 두어 배열 형식으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;임베디드 방식&lt;/span&gt;으로 관리할지 vs. RDB 처럼 FK를 두어서 &lt;span style=&quot;color: #ee2323;&quot;&gt;레퍼런스 방식&lt;/span&gt;으로 관리할지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 장단점 p270(맛있는 Mongo DB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In MongoDB, when modeling a &amp;ldquo;Catalog&amp;rdquo; database (or any related schema design), the decision between &lt;b&gt;embedding&lt;/b&gt; and &lt;b&gt;referencing&lt;/b&gt; depends on the specific use case and the nature of your data. Here&amp;rsquo;s an overview of when to use each approach:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Embedding&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this approach, related data is stored within the same document as nested sub-documents. This method is often referred to as &lt;b&gt;denormalization&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;When to Use:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;One-to-few relationships&lt;/b&gt;: When the related data is small and unlikely to grow significantly.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Read-heavy operations&lt;/b&gt;: Embedding can improve read performance since all data is retrieved in a single query.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Data that&amp;rsquo;s tightly coupled&lt;/b&gt;: If the embedded data will always be retrieved and updated together with the parent document.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Low update frequency&lt;/b&gt;: Embedded documents are best when you don&amp;rsquo;t frequently need to update individual pieces of the embedded data.&lt;/p&gt;
&lt;pre id=&quot;code_1726647006690&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;_id&quot;: 1,
  &quot;name&quot;: &quot;Product 1&quot;,
  &quot;category&quot;: {
    &quot;id&quot;: 101,
    &quot;name&quot;: &quot;Electronics&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this example, the &lt;b&gt;category&lt;/b&gt; is embedded directly within the product document.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pros of Embedding:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Faster reads&lt;/b&gt;: All related data is in one place.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Atomic updates&lt;/b&gt;: Modifying a document updates both the main document and its embedded documents at once.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cons:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Document size&lt;/b&gt;: MongoDB has a document size limit of 16MB. If embedded data grows too large, you might hit this limit.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Duplication&lt;/b&gt;: In cases where the embedded data (like categories) is reused across multiple documents, changes in one embedded sub-document might require updating multiple parent documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Referencing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this approach, documents reference each other by storing the &lt;b&gt;ObjectId&lt;/b&gt; or some unique identifier of the related document. This method is akin to &lt;b&gt;normalization&lt;/b&gt; in relational databases.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;When to Use:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;One-to-many or many-to-many relationships&lt;/b&gt;: When the related data can grow indefinitely or if you need flexibility.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Write-heavy operations&lt;/b&gt;: If you need to update the related data frequently, keeping it in a separate document avoids overwriting large parent documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Data that&amp;rsquo;s loosely coupled&lt;/b&gt;: If the related data is only occasionally needed or can change independently from the main document.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Avoiding duplication&lt;/b&gt;: If the same related data (e.g., categories) is used across many parent documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726647052003&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Products collection:
{
  &quot;_id&quot;: 1,
  &quot;name&quot;: &quot;Product 1&quot;,
  &quot;categoryId&quot;: 101
}

Categories collection:
{
  &quot;_id&quot;: 101,
  &quot;name&quot;: &quot;Electronics&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here, the product document references the category by &lt;span&gt;categoryId&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pros of Referencing:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Scalability&lt;/b&gt;: Since referenced data is in a separate document, you avoid the document size limit and can scale your collections independently.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Data consistency&lt;/b&gt;: Updates to the referenced document (like a category) are reflected across all related documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cons:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Slower reads&lt;/b&gt;: You might need to perform multiple queries (or a &lt;span&gt;$lookup&lt;/span&gt; operation) to fetch related documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Data fragmentation&lt;/b&gt;: If documents are spread across different collections, maintaining consistency in relationships can be more complex.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Best Practices&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Embed when data is tightly coupled and grows moderately&lt;/b&gt;: For example, embedding category data into products makes sense if categories rarely change and you always retrieve the product with its category.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Reference when data is loosely coupled or grows large&lt;/b&gt;: If categories are shared among many products, and categories can be updated independently, referencing will prevent duplication and large document sizes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Hybrid approach&lt;/b&gt;: In some cases, you can combine both. For example, you can embed frequently accessed, immutable fields of a related document (like the name of the category) and reference less frequently used or mutable fields.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example of Hybrid Approach:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1726647107050&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;_id&quot;: 1,
  &quot;name&quot;: &quot;Product 1&quot;,
  &quot;category&quot;: {
    &quot;name&quot;: &quot;Electronics&quot;
  },
  &quot;categoryId&quot;: 101
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this case, you store the category name directly for quick reads but also reference the &lt;span&gt;categoryId&lt;/span&gt; for updates or deeper queries.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Embedding&lt;/b&gt; is best when you have &lt;b&gt;tight coupling&lt;/b&gt; and &lt;b&gt;frequent read&lt;/b&gt; operations with little need for updates to the embedded data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Referencing&lt;/b&gt; is better for &lt;b&gt;flexible, loosely coupled relationships&lt;/b&gt;, especially when data grows or is frequently updated.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Consider a &lt;b&gt;hybrid approach&lt;/b&gt; for balancing read performance with flexibility, especially in cases of shared or frequently updated data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;By understanding your data access patterns, frequency of updates, and the relationship between the entities, you can choose the best approach for your catalog database modeling.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Each Document within a collection has a 16MB size limit.&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in MongoDB, each &lt;b&gt;document&lt;/b&gt; within a collection has a &lt;b&gt;16MB size limit&lt;/b&gt;. This means that the total size of a single document, including its embedded data and subdocuments, cannot exceed 16MB.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Key Points:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Document Size&lt;/b&gt;: Each individual document in MongoDB is capped at 16MB. This includes the entire document&amp;rsquo;s data, including any nested or embedded subdocuments.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Collection Size&lt;/b&gt;: &lt;span style=&quot;color: #ee2323;&quot;&gt;There&amp;rsquo;s no explicit size limit on an entire &lt;b&gt;collection&lt;/b&gt;, which can grow to multiple terabytes. The limit applies only at the &lt;b&gt;document&lt;/b&gt; level.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Workarounds&lt;/b&gt;: If you need to store larger amounts of data:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Referencing&lt;/b&gt;: Break the data into smaller documents and use references between them.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;GridFS&lt;/b&gt;: For very large files (e.g., large media files), you can use MongoDB&amp;rsquo;s &lt;b&gt;GridFS&lt;/b&gt;, which allows you to store and retrieve files larger than 16MB by splitting them into smaller chunks.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you embed too much data in a document and exceed the 16MB limit, MongoDB will throw an error when you try to insert or update that document. Therefore, it&amp;rsquo;s essential to monitor document sizes and use referencing or alternative strategies when necessary.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) 인덱싱&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 복제&lt;/b&gt;&lt;/h2&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;3. 샤딩&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/DataBase</category>
      <category>mongodb</category>
      <category>NoSQL</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/438</guid>
      <comments>https://prde.tistory.com/438#entry438comment</comments>
      <pubDate>Wed, 18 Sep 2024 17:15:17 +0900</pubDate>
    </item>
    <item>
      <title>세션 클러스터링</title>
      <link>https://prde.tistory.com/331</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 세션 클러스터링&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;Session clustering in the &lt;b&gt;Spring Framework&lt;/b&gt; allows session data to be shared and synchronized across multiple application server instances in a clustered environment. This ensures that a user&amp;rsquo;s session is maintained regardless of which server in the cluster handles their request, enabling session failover and load balancing.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why Use Session Clustering?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In a distributed system, requests from the same user may be routed to different servers. Without session clustering, if a user&amp;rsquo;s session is stored in memory on one server, and the next request goes to another server, the session data would be lost. To solve this, session clustering ensures that session data is shared across all servers.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How Session Clustering Works&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In Spring, you can implement session clustering using external storage to share session data between nodes, ensuring that user sessions are available regardless of the node that handles the request.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here are a few common approaches to session clustering in the Spring Framework:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Using an External Session Store (e.g., Redis, Hazelcast)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Using Spring Session (Redis or JDBC Store)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Tomcat/Jetty Session Replication&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I&amp;rsquo;ll focus on &lt;b&gt;Spring Session with Redis&lt;/b&gt;, which is a popular solution for session clustering in Spring Boot applications.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example: Spring Session Clustering with Redis&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Redis&lt;/b&gt; is an in-memory key-value store that is commonly used for sharing session data across a cluster of servers.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step-by-Step Implementation of Session Clustering Using Redis in Spring Boot:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Add Dependencies&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To use Spring Session with Redis, you&amp;rsquo;ll need to add the following dependencies to your &lt;span&gt;pom.xml&lt;/span&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1726379456672&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.session&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-session-data-redis&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Configure Redis&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In your &lt;span&gt;application.properties&lt;/span&gt; or &lt;span&gt;application.yml&lt;/span&gt;, configure Redis as the session store.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;For &lt;/span&gt;application.properties&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1726379473687&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Redis configuration
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_redis_password

# Session configuration
spring.session.store-type=redis
spring.session.timeout=1800s  # Session timeout (30 minutes)

spring:
  redis:
    host: localhost
    port: 6379
    password: your_redis_password

  session:
    store-type: redis
    timeout: 1800s  # 30 minutes session timeout&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;In your main Spring Boot application class, you can enable Redis-backed session management by adding the &lt;span&gt;@EnableRedisHttpSession&lt;/span&gt; annotation:&lt;/p&gt;
&lt;pre id=&quot;code_1726379516654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableRedisHttpSession
public class SessionClusteringApplication {
    public static void main(String[] args) {
        SpringApplication.run(SessionClusteringApplication.class, args);
    }
}&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;his annotation automatically configures Redis as the session store.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Optional: Configure Redis Connection Factory&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You may also define a custom Redis connection factory in a configuration class, which allows you to control aspects like connection pool size or timeout.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726379568248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        // You can configure Redis connection properties here
        return new LettuceConnectionFactory(&quot;localhost&quot;, 6379);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Handling Sessions in Controllers&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring automatically handles session management for you. For example, you can store and retrieve session attributes in your controllers as usual:&lt;/p&gt;
&lt;pre id=&quot;code_1726379582035&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
public class SessionController {
    
    @GetMapping(&quot;/session&quot;)
    public String sessionExample(HttpSession session) {
        session.setAttribute(&quot;name&quot;, &quot;John Doe&quot;);
        return &quot;Session ID: &quot; + session.getId() + &quot; | Name: &quot; + session.getAttribute(&quot;name&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When requests hit different nodes in the cluster, Spring will still retrieve the session data from Redis, ensuring that the session remains consistent across all nodes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Start Multiple Application Instances&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Now you can start multiple instances of your Spring Boot application, and all of them will share session data using Redis.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can start your application with different ports like this:&lt;/p&gt;
&lt;pre id=&quot;code_1726379603688&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Start the first instance on port 8080
java -jar -Dserver.port=8080 session-clustering.jar

# Start the second instance on port 8081
java -jar -Dserver.port=8081 session-clustering.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. Test the Session Clustering&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Access the first instance at &lt;span&gt;http://localhost:8080/session&lt;/span&gt;. This will create a session and store the session ID in Redis.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Then, access the second instance at &lt;span&gt;http://localhost:8081/session&lt;/span&gt;. You should still see the session data retrieved from Redis, even though you hit a different server instance.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How Spring Session with Redis Works&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Session Storage in Redis:&lt;/b&gt; When a user logs in or interacts with the system, their session data is saved in Redis. This is achieved through a key-value pair, where the key is the session ID and the value is the session data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Session Synchronization:&lt;/b&gt; Each time a new request comes in, the session ID is sent in the HTTP request (usually via cookies). The server retrieves the session data from Redis, regardless of which node in the cluster the request goes to. This allows all instances in the cluster to have a consistent view of the user&amp;rsquo;s session.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Failover:&lt;/b&gt; If one server fails, the user&amp;rsquo;s session is not lost because it&amp;rsquo;s stored in Redis. The user&amp;rsquo;s session will continue to work on other nodes in the cluster.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Alternative Methods for Session Clustering&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Hazelcast:&lt;/b&gt; Hazelcast is another in-memory data grid used for sharing session data across a cluster.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;You can use Spring Session with Hazelcast as an alternative to Redis.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;Similar setup to Redis, just different dependencies and configuration.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;JDBC-Based Session Storage:&lt;/b&gt; Instead of Redis, you can store sessions in a relational database using Spring Session with JDBC. The sessions are stored in a database, and each server in the cluster can access the same session data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Tomcat Session Replication:&lt;/b&gt; If you&amp;rsquo;re using Tomcat as the servlet container, it has built-in support for session replication. You can configure Tomcat to replicate sessions across all nodes in the cluster using multicast or a dedicated session manager.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Advantages of Spring Session Clustering with Redis&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Scalability:&lt;/b&gt; Redis is extremely fast and scalable. It handles session storage with high throughput, which is ideal for applications that need to scale horizontally across many nodes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Fault Tolerance:&lt;/b&gt; By using Redis as a distributed session store, user sessions are not lost when a server fails.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;bull;&lt;span&gt; &lt;/span&gt;&lt;b&gt;Stateless Servers:&lt;/b&gt; With Redis handling session data, your servers become stateless, which simplifies scaling and reduces server resource usage.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Session clustering in the Spring Framework can be easily achieved using &lt;b&gt;Spring Session&lt;/b&gt; with &lt;b&gt;Redis&lt;/b&gt;, allowing multiple application instances to share session data. This approach helps ensure that user sessions are consistent, even when requests are routed to different servers in a clustered environment. The Redis-backed session store is a common solution due to its speed and scalability, but alternatives like Hazelcast or JDBC can also be used depending on your application&amp;rsquo;s needs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://kku-jun.tistory.com/44&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://kku-jun.tistory.com/44&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;세션 클러스터링이란?&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;세션 클러스터링이란? 세션 클러스터링이란 WAS가 2대 이상 설치가 되어있을 경우 세션을 공유하여 대체된 WAS에도 동일한 세션을 관리하는 것을 의미합니다. 예를 들어 L4 스위치가 사용자를 접&quot; data-og-host=&quot;kku-jun.tistory.com&quot; data-og-source-url=&quot;https://kku-jun.tistory.com/44&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fnRCG/hyQRVFxwjx/PjXkPhmc7K8066WK4KTrv1/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539,https://scrap.kakaocdn.net/dn/czcxZM/hyQROflrp4/WjgRnFkFf39s6RJZ8fshxK/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539,https://scrap.kakaocdn.net/dn/ors8n/hyQQpaqWqV/yFH98fknXqXstxDYZNQIt0/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539&quot; data-og-url=&quot;https://kku-jun.tistory.com/44&quot;&gt;&lt;a href=&quot;https://kku-jun.tistory.com/44&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kku-jun.tistory.com/44&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fnRCG/hyQRVFxwjx/PjXkPhmc7K8066WK4KTrv1/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539,https://scrap.kakaocdn.net/dn/czcxZM/hyQROflrp4/WjgRnFkFf39s6RJZ8fshxK/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539,https://scrap.kakaocdn.net/dn/ors8n/hyQQpaqWqV/yFH98fknXqXstxDYZNQIt0/img.png?width=532&amp;amp;height=539&amp;amp;face=0_0_532_539');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;세션 클러스터링이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;세션 클러스터링이란? 세션 클러스터링이란 WAS가 2대 이상 설치가 되어있을 경우 세션을 공유하여 대체된 WAS에도 동일한 세션을 관리하는 것을 의미합니다. 예를 들어 L4 스위치가 사용자를 접&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kku-jun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://junshock5.tistory.com/91&quot;&gt;https://junshock5.tistory.com/91&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;세션 클러스터링 이란?&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;세션 클러스터링 이란? 두 대 이상의 WAS를 이용하는 경우 로드 밸런싱(대용량 트래픽 처리시 분산시키는 것), 또는 failover(장애 발생시 예비시스템으로 자동전환, 서버 이중화), auto scaling(AWS에서 &quot; data-og-host=&quot;junshock5.tistory.com&quot; data-og-source-url=&quot;https://junshock5.tistory.com/91&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yz8RU/hyQQB9M8p0/vOMP8YaFQBRL3rgYColuw1/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/cviCU0/hyQQp9iVig/wG6THFfWSo0wf7wmqG9IqK/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/enQBFk/hyQQtcNVuV/kv2ViUsLz3zl4CmAjpZCn0/img.png?width=913&amp;amp;height=527&amp;amp;face=0_0_913_527&quot; data-og-url=&quot;https://junshock5.tistory.com/91&quot;&gt;&lt;a href=&quot;https://junshock5.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://junshock5.tistory.com/91&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yz8RU/hyQQB9M8p0/vOMP8YaFQBRL3rgYColuw1/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/cviCU0/hyQQp9iVig/wG6THFfWSo0wf7wmqG9IqK/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/enQBFk/hyQQtcNVuV/kv2ViUsLz3zl4CmAjpZCn0/img.png?width=913&amp;amp;height=527&amp;amp;face=0_0_913_527');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;세션 클러스터링 이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;세션 클러스터링 이란? 두 대 이상의 WAS를 이용하는 경우 로드 밸런싱(대용량 트래픽 처리시 분산시키는 것), 또는 failover(장애 발생시 예비시스템으로 자동전환, 서버 이중화), auto scaling(AWS에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;junshock5.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. JBoss Infinispan&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonobject.tistory.com/441&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jsonobject.tistory.com/441&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670737149800&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Boot, JBoss Infinispan을 이용한 분산 캐시 적용하기&quot; data-og-description=&quot;개요 마이크로서비스의 유행과 함께 NoSQL 저장소의 사용이 필수인 시대가 되었다. 이제는 전통적인 RDBMS 저장소 만으로는 복잡한 비즈니스 로직과 병렬적인 빠른 동시성 처리 요구를 수용하기 &quot; data-og-host=&quot;jsonobject.tistory.com&quot; data-og-source-url=&quot;https://jsonobject.tistory.com/441&quot; data-og-url=&quot;https://jsonobject.tistory.com/441&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eCw3P/hyQRNOhTI1/jEPqZs9A5Ufpn152ecJkNk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eszvtN/hyQRJd2Owu/0gNgbKVYKbFhsJysnHjgC0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jsonobject.tistory.com/441&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsonobject.tistory.com/441&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eCw3P/hyQRNOhTI1/jEPqZs9A5Ufpn152ecJkNk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eszvtN/hyQRJd2Owu/0gNgbKVYKbFhsJysnHjgC0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot, JBoss Infinispan을 이용한 분산 캐시 적용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요 마이크로서비스의 유행과 함께 NoSQL 저장소의 사용이 필수인 시대가 되었다. 이제는 전통적인 RDBMS 저장소 만으로는 복잡한 비즈니스 로직과 병렬적인 빠른 동시성 처리 요구를 수용하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsonobject.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 로그인 인증방식 Session VS. JWT&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>JWT</category>
      <category>session</category>
      <category>세션</category>
      <category>세션 클러스터링</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/331</guid>
      <comments>https://prde.tistory.com/331#entry331comment</comments>
      <pubDate>Sun, 15 Sep 2024 14:53:43 +0900</pubDate>
    </item>
    <item>
      <title>우분투 Wake on Lan 설정</title>
      <link>https://prde.tistory.com/441</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. BIOS에서 Wake On Lan 설정 Enable&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. ethtool, net-tools, wakeonlan 설치하기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1726057754160&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt-get install net-tools ethtool wakeonlan&lt;/code&gt;&lt;/pre&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;3. ifconfig 네트워크 카드 이름 확인 후&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726058102930&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ethtool -s 네트워크카드이름 wol g
sudo ethtool 네트워크카드 이름

Wake-on : g 확인&lt;/code&gt;&lt;/pre&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;4. 설정 추가&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726058177611&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/network/interfaces

post-up /sbin/ethtool -s 네트워크카드이름 wol g
post-down /sbin/ethtool -s 네트워크카드이름 wol g&lt;/code&gt;&lt;/pre&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;5. 서비스 설정&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726058204167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/systemd/system/wol.service

[Unit]
Description=Configure Wake-up on LAN

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s 인터페이스명 wol g

[Install]
WantedBy=basic.target&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@deogicorgi/우분투Ubuntu-홈서버-구축기1-WOL-설정&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@deogicorgi/우분투Ubuntu-홈서버-구축기1-WOL-설정&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>wol설정</category>
      <category>전원을 공유기로</category>
      <author>prden</author>
      <guid isPermaLink="true">https://prde.tistory.com/441</guid>
      <comments>https://prde.tistory.com/441#entry441comment</comments>
      <pubDate>Wed, 11 Sep 2024 21:35:26 +0900</pubDate>
    </item>
  </channel>
</rss>