<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Security on YuuuuuuYu</title><link>https://4d4cat.com/tags/security/</link><description>Recent content in Security on YuuuuuuYu</description><generator>Hugo -- 0.147.2</generator><language>ko-KR</language><lastBuildDate>Mon, 27 Oct 2025 16:07:14 +0900</lastBuildDate><atom:link href="https://4d4cat.com/tags/security/index.xml" rel="self" type="application/rss+xml"/><item><title>OAuth2 Deepdive</title><link>https://4d4cat.com/posts/2025/oauth2-deepdive/</link><pubDate>Sat, 18 Jan 2025 11:48:00 +0900</pubDate><guid>https://4d4cat.com/posts/2025/oauth2-deepdive/</guid><description>&lt;p>🔔 &lt;strong>Oauth2 적용 전&lt;/strong>&lt;br>
🔔 &lt;strong>Oauth2 실습&lt;/strong>&lt;/p>
&lt;h2 id="개요">&lt;strong>개요&lt;/strong>&lt;/h2>
&lt;p>최근 개인 프로젝트에서 네이버 로그인을 위해 필요한 부분을 설정하고 로직을 구현했다. 개발 가이드에 맞게 각 단계별로 진행을 했으나&amp;hellip;&lt;/p>
&lt;p>아무리 봐도 &lt;em>&lt;strong>과정 하나 하나를 내 손으로 직접 구현하는게 맞는건가?&lt;/strong>&lt;/em> 라는 의문을 시작으로 좀 더 효율적으로 구현하는 방법을 찾아봤고, 그렇게 &lt;code>Oauth 2.0&lt;/code>으로 로그인하는 방식을 찾게 되었다.&lt;/p>
&lt;h2 id="oauth2-적용-전">&lt;strong>Oauth2 적용 전&lt;/strong>&lt;/h2>
&lt;p>코드 스타일을 떠나서 지금 와서 보니 마치 &lt;code>Oauth 1.0&lt;/code>처럼 구현을 하고 있었다. 나 또한, 각 플로우마다 하드 코딩은 줄이고 변수나 함수를 재활용하기 위해, 보안 요소를 생각하면서 구현했었다.&lt;/p></description></item><item><title>OAuth2</title><link>https://4d4cat.com/posts/2025/oauth2/</link><pubDate>Fri, 17 Jan 2025 17:23:00 +0900</pubDate><guid>https://4d4cat.com/posts/2025/oauth2/</guid><description>&lt;p>🔔 &lt;strong>Oauth2? 그럼 Oauth1도?&lt;/strong>&lt;br>
🔔 &lt;strong>Oauth2 동작 과정&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>RFC6749(Oauth 2.0) 문서를 토대로 요약하여 정리한 글이니, 자세한 내용은 &lt;a href="https://datatracker.ietf.org/doc/html/rfc6749">해당 문서&lt;/a>를 참고해주시기 바랍니다.&lt;/p>&lt;/blockquote>
&lt;h2 id="what-why">&lt;strong>What? Why?&lt;/strong>&lt;/h2>
&lt;p>&lt;em>인증(authentication)&lt;/em> 이 아닌 &lt;code>인가(authorization)&lt;/code>에 초점을 맞추며, 리소스 소유자가 클라이언트에게 자신의 리소스에 대한 제한적 접근 권한을 부여할 수 있도록 하는 프레임워크&lt;/p>
&lt;h3 id="역할">&lt;strong>역할&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Resource Owner&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>보호된 리소스(Protected Resource)의 실제 소유자 혹은 주체&lt;/li>
&lt;li>ex) 사용자의 계정, 사용자 데이터&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Resource Server&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>보호된 리소스를 호스팅(저장 및 관리)하고 있는 서버&lt;/li>
&lt;li>클라이언트가 제공하는 액세스 토큰을 검증하고, 유효한 토큰이면 리소스 접근을 허용&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Client&lt;/strong>&lt;/p></description></item><item><title>스프링 시큐리티 기본</title><link>https://4d4cat.com/posts/2024/spring-security-example/</link><pubDate>Fri, 20 Dec 2024 17:50:00 +0900</pubDate><guid>https://4d4cat.com/posts/2024/spring-security-example/</guid><description>&lt;p>🔔 &lt;strong>스프링 시큐리티 개념&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://spring.io/guides/gs/securing-web">스프링 가이드&lt;/a>를 참고하여 스프링 시큐리티의 기본을 공부해보았다.&lt;/p>&lt;/blockquote>
&lt;h2 id="websecurityconfig">&lt;strong>WebSecurityConfig&lt;/strong>&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@Configuration&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@EnableWebSecurity&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">WebSecurityConfig&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Bean&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SecurityFilterChain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">securityFilterChain&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpSecurity&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Exception&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">RequestCache&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">nullRequestCache&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">NullRequestCache&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">requestCache&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">cache&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cache&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">requestCache&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nullRequestCache&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">authorizeHttpRequests&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">requests&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">requests&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">requestMatchers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;/home&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="na">permitAll&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">anyRequest&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="na">authenticated&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">formLogin&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">form&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">form&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">loginPage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/login&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">permitAll&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">logout&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">logout&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logout&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">permitAll&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">build&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Bean&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">UserDetailsService&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">userDetailsService&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">UserDetails&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">User&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">withDefaultPasswordEncoder&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">username&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">password&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;password&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">roles&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;USER&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">build&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">InMemoryUserDetailsManager&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">user&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>@EnableWebSecurity&lt;/code>를 설정하여 시큐리티를 활성화시키고 &lt;code>securityFilterChain&lt;/code>와 &lt;code>userDetailsService&lt;/code>를 구현했다.&lt;/p></description></item><item><title>AES/CBC/PKCS7</title><link>https://4d4cat.com/posts/2022/aes-cbc-pkcs7/</link><pubDate>Tue, 12 Jul 2022 14:23:00 +0900</pubDate><guid>https://4d4cat.com/posts/2022/aes-cbc-pkcs7/</guid><description>&lt;p>용어 자체가 거창해보이지만 하나씩 해석해보면&lt;/p>
&lt;p>&lt;strong>AES&lt;/strong> &lt;em>대칭키 암호화 방식&lt;/em> 중 하나이고&lt;br>
&lt;strong>CBC&lt;/strong>는 블록 단위로 암호화를 하는 &lt;em>AES 방식의 운영모드&lt;/em> 중 하나이다. &lt;br>
&lt;strong>PKCS7&lt;/strong>은 AES128 방식을 쓴다고 하면, 128비트보다 &lt;em>작은 블록이 나오면 뒤에 값을 붙여주는&lt;/em> &amp;lsquo;&lt;strong>패딩&lt;/strong>&amp;lsquo;의 한 방식이다.&lt;/p>
&lt;p>크게 암호화 방식은 대칭키, 비대칭키 방식이 있다. &lt;br>
&lt;strong>대칭키&lt;/strong>는 암호화/복호화에 쓰이는 키가 같아서 &lt;em>속도가 빠르지만&lt;/em> 해당 키값이 노출되면 문제가 생기고 관리가 쉽지 않다.&lt;/p>
&lt;p>위에서 말한 &lt;strong>AES&lt;/strong>는 DES방식의 결함이 발견되어 채택된 방식으로 128/192/256비트의 &lt;em>고정 블록 단위&lt;/em>로 암호화를 수행한다.&lt;br>
특히 블록 암호화 방식은 &lt;em>평문의 길이와 상관없이 고정된 길이&lt;/em>가 나오게 된다.&lt;/p></description></item></channel></rss>