<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>보안 on Korobopolly's Dev Blog</title><link>https://korobopolly.github.io/series/%EB%B3%B4%EC%95%88/</link><description>Recent content in 보안 on Korobopolly's Dev Blog</description><generator>Hugo</generator><language>ko</language><lastBuildDate>Mon, 16 Feb 2026 13:25:00 +0900</lastBuildDate><atom:link href="https://korobopolly.github.io/series/%EB%B3%B4%EC%95%88/index.xml" rel="self" type="application/rss+xml"/><item><title>암호화 기초 - AES, RSA, 디지털 서명, 패스워드 해싱, 하이브리드 암호화</title><link>https://korobopolly.github.io/posts/security-encryption-basics/</link><pubDate>Mon, 16 Feb 2026 13:25:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/security-encryption-basics/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;현대 소프트웨어 시스템에서 데이터 보안은 선택이 아닌 필수입니다. 사용자 비밀번호, 개인정보, 금융 데이터 등 민감한 정보를 안전하게 보호하려면 암호화 기술을 올바르게 이해하고 적용해야 합니다.&lt;/p&gt;
&lt;p&gt;이 글에서는 대칭키 암호화(AES), 비대칭키 암호화(RSA), 디지털 서명의 원리와 Java 구현을 실전 예제와 함께 다룹니다.&lt;/p&gt;
&lt;h2 id="암호화가-필요한-이유"&gt;암호화가 필요한 이유&lt;/h2&gt;
&lt;h3 id="보호해야-할-데이터"&gt;보호해야 할 데이터&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;저장 데이터(Data at Rest)&lt;/strong&gt;: 데이터베이스의 비밀번호, 개인정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전송 데이터(Data in Transit)&lt;/strong&gt;: HTTPS 통신, API 요청/응답&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;처리 데이터(Data in Use)&lt;/strong&gt;: 메모리 상의 민감 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="암호화-없이-발생하는-문제"&gt;암호화 없이 발생하는 문제&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 위험한 예: 평문 저장&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String password &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;user1234&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;db.&lt;span style="color:#89b4fa"&gt;save&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;INSERT INTO users (password) VALUES (&amp;#39;&amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; password &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;&amp;#39;)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// DB 유출 시 모든 비밀번호 노출&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 위험한 예: 평문 전송&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HttpClient.&lt;span style="color:#89b4fa"&gt;get&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;http://api.example.com/user?apiKey=secret123&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 중간자 공격(MITM)으로 API 키 탈취 가능&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="암호화-적용-후"&gt;암호화 적용 후&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 안전한 예: 암호화 저장&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String encrypted &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; AESUtil.&lt;span style="color:#89b4fa"&gt;encrypt&lt;/span&gt;(password, secretKey);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;db.&lt;span style="color:#89b4fa"&gt;save&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;INSERT INTO users (password) VALUES (&amp;#39;&amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; encrypted &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;&amp;#39;)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// DB 유출되어도 암호화된 상태&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 안전한 예: HTTPS 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HttpClient.&lt;span style="color:#89b4fa"&gt;get&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;https://api.example.com/user?apiKey=secret123&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// TLS/SSL로 암호화된 통신&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="대칭키-암호화-aes"&gt;대칭키 암호화 (AES)&lt;/h2&gt;
&lt;p&gt;같은 키로 암호화와 복호화를 수행하는 방식입니다. 빠르고 효율적이지만 키 공유 문제가 있습니다.&lt;/p&gt;</description></item><item><title>JWT 인증 시스템 - Spring Security 통합, Refresh Token, 보안 설정</title><link>https://korobopolly.github.io/posts/security-jwt-authentication/</link><pubDate>Mon, 16 Feb 2026 13:24:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/security-jwt-authentication/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;웹 애플리케이션에서 사용자 인증은 가장 기본적이면서도 중요한 기능입니다. 전통적인 세션 기반 인증 방식은 서버에 상태를 저장하기 때문에 확장성과 분산 환경에서 한계가 있습니다. JWT(JSON Web Token)는 이러한 문제를 해결하는 토큰 기반 인증 방식으로, 최근 REST API와 마이크로서비스 환경에서 널리 사용되고 있습니다.&lt;/p&gt;
&lt;p&gt;이 글에서는 JWT의 원리부터 Spring Boot와 프론트엔드에서의 실전 구현까지 다룹니다.&lt;/p&gt;
&lt;h2 id="세션-기반-vs-토큰-기반-인증"&gt;세션 기반 vs 토큰 기반 인증&lt;/h2&gt;
&lt;h3 id="세션-기반-인증"&gt;세션 기반 인증&lt;/h3&gt;
&lt;p&gt;전통적인 방식으로, 서버가 세션 정보를 메모리나 DB에 저장합니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. 사용자 로그인 → 서버가 세션 ID 생성 → 메모리/DB 저장
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. 클라이언트에 세션 ID 쿠키 전송
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. 이후 요청마다 쿠키로 세션 ID 전송 → 서버가 세션 저장소 조회
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>