<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>You Lead!!</title>
    <link>https://seaking.tistory.com/</link>
    <description>https://github.com/seaking7
https://www.linkedin.com/in/%ED%83%9C%EA%B2%BD-%EA%B9%80-70693411b/</description>
    <language>ko</language>
    <pubDate>Wed, 17 Jun 2026 07:29:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>끄적끄적</managingEditor>
    <image>
      <title>You Lead!!</title>
      <url>https://t1.daumcdn.net/tistoryfile/fs9/29_5_5_17_blog49384_attach_0_1.jpg?original</url>
      <link>https://seaking.tistory.com</link>
    </image>
    <item>
      <title>시스템적 사고</title>
      <link>https://seaking.tistory.com/256</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 시스템의 성격은 무엇이고, 그 시스템 안에서 각 객체들은 어떠한 힘들 받고 있으며 각 개체들 사이에서도 어떠한 영향을 서로 미치는지를 생각할 줄 알아야한다. 시스템 전체를 생각하지 않고 지금 당장 눈앞에 보이는 이득을 취하려 하거나 손쉬워 보이는 해결책을 실행할 경우 이익은 커녕 손해를 보거나 문제는 더 심각해 질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1990년대 초 펜실베니아와 뉴욕에서는 진료성적표 제도를 도입하였다. 진료성적표는 어떤 병원과 의사가 환자의 진료를 잘하는지를 시민들이 알게하기 위해 도입되었다. 일반 시민들은 '어떤 병원이 좋다더라'라는 풍문에 의지하기 보다는 각 병원과 의사의 공개된 성적을 통해 병원을 선택할 수 있게 되리라 기대되었다. 병원들은 경쟁의식 속에서 성적을 높이기위해 서로 높은 의료서비스를 위해 노력하리라 기대하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 예상과 달리 진료성적표는 충격적인 부작용을 야기하였다. 나쁜 성적을 받는 것이 두려워 생명이 위중한 환자를 일부러 치료하지 않고, 굳이 수술할 필요가 없는 환자들을 수술하기 시작하였다. 진료성적표는 도입취지와 정반대로 병원과 의사들이 최악의 서비스를 제공하게 했으며, 환자들은 제대로 된 치료를 받지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT회사에서 배포주기나 반영성공율 등을 지표로 관리할때에도 동일한 부작용이 나타날 수 있다. 사람들은 리스크있는 개발은 하지 않을 것이고, 불필요하고 소모적인 개발만 집중하게 될 것이다.&lt;/p&gt;</description>
      <category>책 이야기</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/256</guid>
      <comments>https://seaking.tistory.com/256#entry256comment</comments>
      <pubDate>Sun, 8 Dec 2024 15:39:22 +0900</pubDate>
    </item>
    <item>
      <title>[도서] 성장을 이끄는 팀장들</title>
      <link>https://seaking.tistory.com/255</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;관리자들이 자신이 맡은 업무의 내용(content of what they do)과 시간(timing)을 적절히 통제하지 못한다는 지적이 많다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;업무 위임과 자율의 중요성을 강조하면서, 부하 직원들의 일까지 주섬주섬 떠 맡는 경우도 적지 않다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;이른바 온갖 원숭이(monkey)들이 관리자 어깨 위에 올라 타는데도 인식하지 못한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&quot;원숭이는 언제 내 어깨에 올랐나?&quot;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;복도에서 부하 직원을 마주쳤는데, 업무에 어려움이 생겼다며 조언을 청한다. 이런 문제들에는 통상 두 가지 특징이 있다. 첫째, 상사가 해당 업무에 관여할 수 있을 만큼 잘 알고 있다. 둘째, 그러나 상사가 현장에서 바로 의사결정해줄 만큼 충분히 알고 있지는 못하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;이 상황에서 상사의 반응은 이렇게 끝나기 쉽다. &quot;이런 문제를 먼저 상의해줘서 고맙네. 그런데, 내가 다른 일을 먼저 처리해야 할 게 있어서, 내가 좀 생각해보고 나중에 알려주도록 하지.&quot; 그리고 자리를 뜬다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;일상적으로 벌어지는 상사와 직원의 대화처럼 보이지만 중요한 변화가 생겼다. 대화를 시작하기 전까지 부하 직원 어깨에 있던 &quot;원숭이(monkey)&quot;가 어느새 상사의 어깨로 자리를 옮긴다.&amp;nbsp; 상사는 부하 직원에게 후속 일(the next move)을 약속했으며, 동시에 업무에 대한 책임까지 넘겨 받았다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;부하 직원은 다음날 아침에 상사의 기억을 돕기 위해, 사무실에 들려서 경쾌한 목소리로 묻는다. &quot;어떻게 생각은 해보셨습니까?&quot; 아이러니하지만 이는 통상 업무를 감독(supervision)하는 상사가 부하 직원에게 쓰는 제스처이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&quot;왜 이런 일이 발생할까?&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;업무를 수행하는 주도권의 5가지 단계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 지시가 있을 때까지 기다린다.&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(낮은 차원)&lt;/span&gt;&lt;br /&gt;&lt;b&gt;2. 무엇을 해야 하는지 묻는다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3. 제안하고, 그에 따라 행동한다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;4. 행동하되, 즉시 보고한다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;5. 스스로 행동한 후 정기적으로&amp;nbsp; 보고한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;(높은 차원)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #2e2e2e; text-align: start;&quot;&gt;상사는 부하 직원들이 1번과 2번처럼, 낮은 차원에서 행동하지 않게끔 해야 한다. 3번 이상으로, 업무를 주도적으로 처리하도록 독려해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>책 이야기</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/255</guid>
      <comments>https://seaking.tistory.com/255#entry255comment</comments>
      <pubDate>Sat, 16 Nov 2024 11:17:25 +0900</pubDate>
    </item>
    <item>
      <title>[도서] 성과로 말하는 사람들</title>
      <link>https://seaking.tistory.com/254</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[직장]&amp;nbsp;어떻게&amp;nbsp;일에서&amp;nbsp;의미가&amp;nbsp;사라지는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 주의해야할 사례&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관리자가 구성원의 일이나 아이디어의 중요성을 무시하는 경우 : 리더가 팀 회의 등에서 수행하는 업무의 중요성을 무시하거나, 의미가 없다고 표현할 경우, 기분이 상하고 의욕을 상실할 수가 있다. 반대로 관리자가 업무에 필요한 자원이 충분한지를 묻는 등 자신이 중요하고 가치있는 일을 하고 있다는 신호를 받으면, 실무자는 전진을 위한 촉진요인을 받는다.&lt;/li&gt;
&lt;li&gt;일에 대한 구성원들의 주인의식을 무너뜨리는 경우 : 수시로 업무를 재배치하거나 할때 주인의식을 잃게된다. 거의 마무리단계까지 왔던 프로젝트를 다른 사람에게 넘겨주거나 하는 일이 반복될 경우&lt;/li&gt;
&lt;li&gt;관리자가 구성원들이 하고 있는 일이 빛을 보지 못할 것이라는 메시지를 보낼때 : 다른 대안으로 현재 하고 있는 일이 의미없을 것이라는 것을 알게 되면 누가 열심히 할 것인가&lt;/li&gt;
&lt;li&gt;우선순위가 변경되었으나 이를 제때 알리지 못한 경우 : 본인이 쏟은 시간과 노력이 시간낭비가 될 수 있는 경험을 자주하면 의욕을 상실한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로 매니징(팀원들이 제대로 일을 하고 있는지 '검사'하는 대신 팀원들의 상황을 확인해야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로 매니징 관리자의 특성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일을 할때 구성원의 자율성을 허용하지 않고, 모든 행동을 일일이 지시한다(목표를 달성하는 방법과 팀원 각자의 생각을 존중해야)&lt;/li&gt;
&lt;li&gt;팀원에게 실질적인 도움을 주지 않으면서 일에 관해 자주 물어본다.(대안적 해석의 가능성을 열어둔 채 분석을 도와야 한다)&lt;/li&gt;
&lt;li&gt;문제가 발생했을 때 개인에게 책임을 전가하는 경향이 있다.(구성원들이 정직하게 논의하기보다 숨기도록 유도된다)&lt;/li&gt;
&lt;li&gt;자신의 비밀 무기로 사용하기 위해 정보를 축적하고 공유하지 않는다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>about Web/살아가는 이야기</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/254</guid>
      <comments>https://seaking.tistory.com/254#entry254comment</comments>
      <pubDate>Sat, 2 Nov 2024 11:10:08 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security CSRF와 CORS</title>
      <link>https://seaking.tistory.com/251</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CSRF(Cross Site Request Forgery)&lt;/b&gt; : 사용자가 웹에 로그인 한 상태에서 악성 스크립트 등을 통해 원하지 않는 변경(POST, PUT, DELETE)를 할 수 있는 것을 대비하기 위한 기능이다. (예시로, 페이스북에 로그인된 상태에서 원하지 않는 광고글이 게시되는 등)&lt;/li&gt;
&lt;li&gt;GET호출시에 CSRF 토큰을 발급하며, 변경(POST등) 메서드를 하고자 할 경우에는 헤더에 X_CSRF_TOKEN에 토큰값을 넘겨줘야 정상적으로 변경을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CH10_F02_Spilca.png&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfkplV/btsud1v3W5e/95pFWmIhhIIK9HhUpuvGB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfkplV/btsud1v3W5e/95pFWmIhhIIK9HhUpuvGB1/img.png&quot; data-alt=&quot;CSRF 처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfkplV/btsud1v3W5e/95pFWmIhhIIK9HhUpuvGB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfkplV%2Fbtsud1v3W5e%2F95pFWmIhhIIK9HhUpuvGB1%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;1033&quot; height=&quot;610&quot; data-filename=&quot;CH10_F02_Spilca.png&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CSRF 처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 hidden값으로 클라이언트에서 변경시 token값을 올려주도록 구현할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1694952007487&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html lang=&quot;en&quot; xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;form action=&quot;/product/add&quot; method=&quot;post&quot;&amp;gt;
            &amp;lt;span&amp;gt;Name:&amp;lt;/span&amp;gt;
            &amp;lt;span&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; /&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;span&amp;gt;&amp;lt;button type=&quot;submit&quot;&amp;gt;Add&amp;lt;/button&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;input type=&quot;hidden&quot;
                    th:name=&quot;${_csrf.parameterName}&quot;
                    th:value=&quot;${_csrf.token}&quot; /&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CORS(Cross-Origin Resource Sharing)&lt;/b&gt; : 보안상의 이유로 브라우저는 동일출처(도메인, 포트)가 아니면 호출을 제한한다. 이를 허용해 주기 위한 공유이다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Access-Control-Allow-Origin : 접근할 수 있는 외부 도메인 지정&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Methods : 특정 HTTP 방식만 허용&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Headers : 특정요청에 이용할 수 있는 헤더 제한 추가&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CH10_F13_Spilca.png&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p1KfK/btsuk4yvl4w/F2KACY1lfDDvCy7ixaenF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p1KfK/btsuk4yvl4w/F2KACY1lfDDvCy7ixaenF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p1KfK/btsuk4yvl4w/F2KACY1lfDDvCy7ixaenF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp1KfK%2Fbtsuk4yvl4w%2FF2KACY1lfDDvCy7ixaenF0%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;1021&quot; height=&quot;432&quot; data-filename=&quot;CH10_F13_Spilca.png&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;허용방법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller에 @CrossOrigin 추가&lt;/li&gt;
&lt;li&gt;CorsConfigurer로 전체적으로 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694953434539&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors(c -&amp;gt; {
            CorsConfigurationSource source = request -&amp;gt; {
                CorsConfiguration config = new CorsConfiguration();
                config.setAllowedOrigins(List.of(&quot;*&quot;));
                config.setAllowedMethods(List.of(&quot;*&quot;));
                return config;
            };
            c.configurationSource(source);
        });

        http.csrf().disable();

        http.authorizeRequests()
                .anyRequest().permitAll();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바/Spring</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/251</guid>
      <comments>https://seaking.tistory.com/251#entry251comment</comments>
      <pubDate>Sun, 17 Sep 2023 21:24:32 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security Filter</title>
      <link>https://seaking.tistory.com/250</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 FilterChain 내에서 앞뒤로 원하는 Filter를 붙일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694949762710&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class RequestValidationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
        ServletException {
        var httpRequest = (HttpServletRequest) request;
        var httpResponse = (HttpServletResponse) response;
        String requestId = httpRequest.getHeader(&quot;Request-Id&quot;);
        // if (requestId == null || requestId.isBlank()) {
        //     httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        //     return;
        // }

        filterChain.doFilter(request, response);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에 붙일 필터를 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694949774018&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class AuthenticationLoggingFilter implements Filter {

    private final Logger logger =
            Logger.getLogger(AuthenticationLoggingFilter.class.getName());

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
        ServletException {
        var httpRequest = (HttpServletRequest) request;
        String requestId = httpRequest.getHeader(&quot;Request-Id&quot;);
        logger.info(&quot;Successfully authenticated request with id &quot; +  requestId);
        filterChain.doFilter(request, response);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 BasicAuthenticationFilter 앞 뒤로 원하는 필터 주입할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1694949795123&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    return http
        .csrf(AbstractHttpConfigurer::disable)
        .addFilterBefore(new RequestValidationFilter(), BasicAuthenticationFilter.class)
        .addFilterAfter(new AuthenticationLoggingFilter(), BasicAuthenticationFilter.class)&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;아래는 Header에 키를 체크하는 필터의 예시&lt;/p&gt;
&lt;pre id=&quot;code_1694950242775&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class StaticKeyAuthenticationFilter implements Filter {

    @Value(&quot;${authorization.key}&quot;)
    private String authorizationKey;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        var httpRequest = (HttpServletRequest) request;
        var httpResponse = (HttpServletResponse) response;

        String authentication = httpRequest.getHeader(&quot;Authorization&quot;);

        if (authorizationKey.equals(authentication)) {
            filterChain.doFilter(request, response);
        } else {
            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바/Spring</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/250</guid>
      <comments>https://seaking.tistory.com/250#entry250comment</comments>
      <pubDate>Sun, 17 Sep 2023 20:31:40 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security Authorization(권한 부여)</title>
      <link>https://seaking.tistory.com/249</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Authority&lt;/b&gt; : String형태(Read, Write 등)의 권한을 정의하거나 ROLE(Autority에는 ROLE_권한형태로 저장) 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AuthorizationFilter&lt;/b&gt;에서 &lt;b&gt;AuthorizationManager&lt;/b&gt;(주로 AuthorityAuthorizationManager)에 의해 체크됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;권한체크.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8oV6k/btst7uZ7yuX/LaO5xBak2zpRmLJGp7B6BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8oV6k/btst7uZ7yuX/LaO5xBak2zpRmLJGp7B6BK/img.png&quot; data-alt=&quot;AuthorizationFilter&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8oV6k/btst7uZ7yuX/LaO5xBak2zpRmLJGp7B6BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8oV6k%2Fbtst7uZ7yuX%2FLaO5xBak2zpRmLJGp7B6BK%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;1132&quot; height=&quot;235&quot; data-filename=&quot;권한체크.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AuthorizationFilter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;authorizationfilter.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxSSm/btsudSMJYlG/FLEilCKbzukAMFvKf34bR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxSSm/btsudSMJYlG/FLEilCKbzukAMFvKf34bR1/img.png&quot; data-alt=&quot;권한부여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxSSm/btsudSMJYlG/FLEilCKbzukAMFvKf34bR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxSSm%2FbtsudSMJYlG%2FFLEilCKbzukAMFvKf34bR1%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;728&quot; height=&quot;391&quot; data-filename=&quot;authorizationfilter.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한부여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mvcMatchers : *는 한 경로 이름 대체, **는 여러 경로이름 대체, 정규식 가능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;antMatchers : 사용법은 유사하나 /hello 경로에 지정할 경우 /hello/ 경로는 제외된다(mvcMatcher는 둘다 포함됨)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694947387773&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http.authorizeRequests()
    .mvcMatchers(HttpMethod.GET, &quot;/a&quot;).authenticated()
    .mvcMatchers(HttpMethod.POST, &quot;/a&quot;).permitAll()
    .anyRequest().denyAll();
                
http.authorizeRequests()
    .mvcMatchers( &quot;/a/b/**&quot;).authenticated()
    .anyRequest().permitAll();
    
http.authorizeRequests()
    .mvcMatchers( &quot;/product/{code:^[0-9]*$}&quot;).permitAll()
    .anyRequest().denyAll();&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바/Spring</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/249</guid>
      <comments>https://seaking.tistory.com/249#entry249comment</comments>
      <pubDate>Sun, 17 Sep 2023 20:06:16 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security Authentication(인증)</title>
      <link>https://seaking.tistory.com/248</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Authentication(인증)&lt;/span&gt;&lt;/b&gt; : 사용자가 맞는지 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FormLogin&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;loginurlauthenticationentrypoint.png&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh2lLF/btst88PW0Tp/t1nWf0rLJebdhgZpOpzNyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh2lLF/btst88PW0Tp/t1nWf0rLJebdhgZpOpzNyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh2lLF/btst88PW0Tp/t1nWf0rLJebdhgZpOpzNyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh2lLF%2Fbtst88PW0Tp%2Ft1nWf0rLJebdhgZpOpzNyk%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;772&quot; height=&quot;343&quot; data-filename=&quot;loginurlauthenticationentrypoint.png&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AccessDeniedException.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eklYc6/btst847QA9W/cRQSKjYsjKjSAYDkbyRBTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eklYc6/btst847QA9W/cRQSKjYsjKjSAYDkbyRBTk/img.png&quot; data-alt=&quot;AuthorizationFilter에서 AccessDeniedException 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eklYc6/btst847QA9W/cRQSKjYsjKjSAYDkbyRBTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeklYc6%2Fbtst847QA9W%2FcRQSKjYsjKjSAYDkbyRBTk%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;788&quot; height=&quot;153&quot; data-filename=&quot;AccessDeniedException.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AuthorizationFilter에서 AccessDeniedException 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;usernamepasswordAuthenticationFilter.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HuxWc/btst89uAkkI/rqhxb4kmXDG7IQmPgCNCZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HuxWc/btst89uAkkI/rqhxb4kmXDG7IQmPgCNCZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HuxWc/btst89uAkkI/rqhxb4kmXDG7IQmPgCNCZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHuxWc%2Fbtst89uAkkI%2Frqhxb4kmXDG7IQmPgCNCZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;431&quot; data-filename=&quot;usernamepasswordAuthenticationFilter.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FilterChainProxy&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;securityfilterchain.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buBWv1/btst7SfzNHu/Z5mwPkedIx5Kk6Y5L9Qwdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buBWv1/btst7SfzNHu/Z5mwPkedIx5Kk6Y5L9Qwdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buBWv1/btst7SfzNHu/Z5mwPkedIx5Kk6Y5L9Qwdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuBWv1%2Fbtst7SfzNHu%2FZ5mwPkedIx5Kk6Y5L9Qwdk%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;596&quot; height=&quot;441&quot; data-filename=&quot;securityfilterchain.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FilterChainProxy에 보면 정의된 filters를 리스트로 가지고 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;filterchainProxy.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SequZ/btst85lC54E/03MKRoOOrfLsn3p0mU3ft0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SequZ/btst85lC54E/03MKRoOOrfLsn3p0mU3ft0/img.png&quot; data-alt=&quot;FilterChainProxy에 보면 filters를 가지고 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SequZ/btst85lC54E/03MKRoOOrfLsn3p0mU3ft0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSequZ%2Fbtst85lC54E%2F03MKRoOOrfLsn3p0mU3ft0%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;759&quot; height=&quot;371&quot; data-filename=&quot;filterchainProxy.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FilterChainProxy에 보면 filters를 가지고 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&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;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;AuthenticationManager(인증관리자) : 주로 ProviderManager 사용됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ProviderManager&lt;/b&gt; 는 다음 Build된 Provider를 이용해서 인증을 수행&lt;/li&gt;
&lt;li&gt;OTP인증 등 인증방법을 변경하고 싶으면 &lt;a href=&quot;https://medium.com/@abhishekranjandev/creating-authentication-using-phone-number-and-otp-with-spring-boot-spring-security-c516df4ad8a0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Provider를 별도로 만들어서 추가해주자(HttpSecurity.authenticationProvider)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;providermanager.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUJ1MC/btst6NFob50/lzpL5o2rZdYR7Ig9JyPHzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUJ1MC/btst6NFob50/lzpL5o2rZdYR7Ig9JyPHzk/img.png&quot; data-alt=&quot;ProviderManager에서 Provider의 authenticate 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUJ1MC/btst6NFob50/lzpL5o2rZdYR7Ig9JyPHzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUJ1MC%2Fbtst6NFob50%2FlzpL5o2rZdYR7Ig9JyPHzk%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;576&quot; height=&quot;280&quot; data-filename=&quot;providermanager.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ProviderManager에서 Provider의 authenticate 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;provider.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVJoi/btsufmGqZbs/pD4GqrOo4HJNGfVKEjqrfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVJoi/btsufmGqZbs/pD4GqrOo4HJNGfVKEjqrfk/img.png&quot; data-alt=&quot;ProviderManager에서 사용하는 Provider 들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVJoi/btsufmGqZbs/pD4GqrOo4HJNGfVKEjqrfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVJoi%2FbtsufmGqZbs%2FpD4GqrOo4HJNGfVKEjqrfk%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;742&quot; height=&quot;252&quot; data-filename=&quot;provider.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ProviderManager에서 사용하는 Provider 들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CH03_F01_Spilca.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3iGBr/btsuqC2Inkd/LKWz7SLX9HSjWKtoIULMVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3iGBr/btsuqC2Inkd/LKWz7SLX9HSjWKtoIULMVk/img.png&quot; data-alt=&quot;authentication Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3iGBr/btsuqC2Inkd/LKWz7SLX9HSjWKtoIULMVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3iGBr%2FbtsuqC2Inkd%2FLKWz7SLX9HSjWKtoIULMVk%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;977&quot; height=&quot;748&quot; data-filename=&quot;CH03_F01_Spilca.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;authentication Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;abstractauthenticationprocessingfilter.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb3Ybi/btsubKVE3Us/BdaeBokmnTWUQVQahGGPK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb3Ybi/btsubKVE3Us/BdaeBokmnTWUQVQahGGPK1/img.png&quot; data-alt=&quot;인증 성공/실패에 따른 후속처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb3Ybi/btsubKVE3Us/BdaeBokmnTWUQVQahGGPK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb3Ybi%2FbtsubKVE3Us%2FBdaeBokmnTWUQVQahGGPK1%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;786&quot; height=&quot;714&quot; data-filename=&quot;abstractauthenticationprocessingfilter.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인증 성공/실패에 따른 후속처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SecurityContextHolder&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 인증된 사용자 세부정보 저장하는 곳. 어떻게 채워지는지는 신경쓰지 않음&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;securitycontextholder.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFBbdb/btsueNqEKSX/iHDv73WuQL1GNrMTvokrlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFBbdb/btsueNqEKSX/iHDv73WuQL1GNrMTvokrlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFBbdb/btsueNqEKSX/iHDv73WuQL1GNrMTvokrlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFBbdb%2FbtsueNqEKSX%2FiHDv73WuQL1GNrMTvokrlk%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;445&quot; height=&quot;164&quot; data-filename=&quot;securitycontextholder.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SecurityContext&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Authentication 객체가 담겨있음. Principal(사용자정보), Credentials(비밀번호), Authorities(권한)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;securityContext.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWQNxz/btst7Sfm7Zz/i99bqVndUtREhpaCpqURKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWQNxz/btst7Sfm7Zz/i99bqVndUtREhpaCpqURKK/img.png&quot; data-alt=&quot;SecurityContext 안에는 authentication 객체가 담겨있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWQNxz/btst7Sfm7Zz/i99bqVndUtREhpaCpqURKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWQNxz%2Fbtst7Sfm7Zz%2Fi99bqVndUtREhpaCpqURKK%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;1200&quot; height=&quot;565&quot; data-filename=&quot;securityContext.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SecurityContext 안에는 authentication 객체가 담겨있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;소스로 살펴보는 인증 흐름&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBrAB7/btst7RU9eof/Ecg9c4U73ia5PUvhTI1oG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBrAB7/btst7RU9eof/Ecg9c4U73ia5PUvhTI1oG0/img.png&quot; data-alt=&quot;1. AbstractAuthenticationProcessingFilter&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBrAB7/btst7RU9eof/Ecg9c4U73ia5PUvhTI1oG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBrAB7%2Fbtst7RU9eof%2FEcg9c4U73ia5PUvhTI1oG0%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;977&quot; height=&quot;557&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1. AbstractAuthenticationProcessingFilter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babOIJ/btsudOp0fWY/rqHs5qkP5ojqEDeSZ0Ughk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babOIJ/btsudOp0fWY/rqHs5qkP5ojqEDeSZ0Ughk/img.png&quot; data-alt=&quot;2. UsernamePasswordAuthenticationFilter&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babOIJ/btsudOp0fWY/rqHs5qkP5ojqEDeSZ0Ughk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbabOIJ%2FbtsudOp0fWY%2FrqHs5qkP5ojqEDeSZ0Ughk%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;978&quot; height=&quot;536&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2. UsernamePasswordAuthenticationFilter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFQrU1/btsufm7wVdo/ekECubGRT6S0Fc9JGK7V8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFQrU1/btsufm7wVdo/ekECubGRT6S0Fc9JGK7V8K/img.png&quot; data-alt=&quot;3. ProviderManager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFQrU1/btsufm7wVdo/ekECubGRT6S0Fc9JGK7V8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFQrU1%2Fbtsufm7wVdo%2FekECubGRT6S0Fc9JGK7V8K%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;855&quot; height=&quot;579&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3. ProviderManager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cox6uq/btsudPPWDwO/dvCp3JW1KWlDRNKMhXjukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cox6uq/btsudPPWDwO/dvCp3JW1KWlDRNKMhXjukk/img.png&quot; data-alt=&quot;4. AbstractUserDetailsAuthenticationProvider&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cox6uq/btsudPPWDwO/dvCp3JW1KWlDRNKMhXjukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcox6uq%2FbtsudPPWDwO%2FdvCp3JW1KWlDRNKMhXjukk%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;961&quot; height=&quot;545&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4. AbstractUserDetailsAuthenticationProvider&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3Z28/btsugTcS5a8/XpFQRU0jhfN9BE8obPKtmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3Z28/btsugTcS5a8/XpFQRU0jhfN9BE8obPKtmK/img.png&quot; data-alt=&quot;5. DaoAuthenticationProvider&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3Z28/btsugTcS5a8/XpFQRU0jhfN9BE8obPKtmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3Z28%2FbtsugTcS5a8%2FXpFQRU0jhfN9BE8obPKtmK%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;953&quot; height=&quot;468&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;5. DaoAuthenticationProvider&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bylqjr/btsudYMNQp1/yScyJhfw5EWRAv3kfWiFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bylqjr/btsudYMNQp1/yScyJhfw5EWRAv3kfWiFm1/img.png&quot; data-alt=&quot;6. UserDetailsService 에서 User 찾기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bylqjr/btsudYMNQp1/yScyJhfw5EWRAv3kfWiFm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbylqjr%2FbtsudYMNQp1%2FyScyJhfw5EWRAv3kfWiFm1%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;1035&quot; height=&quot;461&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;6. UserDetailsService 에서 User 찾기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>자바/Spring</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/248</guid>
      <comments>https://seaking.tistory.com/248#entry248comment</comments>
      <pubDate>Sun, 17 Sep 2023 13:11:55 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security 3.1.1 적용</title>
      <link>https://seaking.tistory.com/247</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SecurityFilterChain : &lt;/b&gt;기존에 2.x버전에서 WebSecurityConfigurerAdapter 상속받아 configure 재정의하던 방식에서 @Bean으로 생성하도록 변경되었다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694867524243&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Bean
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

		return http
			.csrf((csrf) -&amp;gt; csrf.disable())
			.authorizeHttpRequests(request -&amp;gt; request.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
				.requestMatchers(staticPath.toArray(new String[0])).permitAll()
				.requestMatchers(&quot;/&quot;, &quot;/inventory/**&quot;,  &quot;/account/**&quot;, &quot;/api/**&quot;)
				.permitAll()
				.requestMatchers(&quot;/admin/**&quot;, &quot;/report/**&quot;).hasAnyRole( AdminRole.MANAGER.name(), AdminRole.ADMIN.name())
				.requestMatchers(&quot;/manage/**&quot;).hasAnyRole(AdminRole.USER.name(), AdminRole.ADMIN.name())
				.anyRequest()
				.authenticated())
			.formLogin(Customizer.withDefaults())
			.build();
	}&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;&lt;b&gt;PasswordEncoder&lt;/b&gt; : @Bean으로 생성해줘야 한다. 주로 BCryptPasswordEncoder 를 많이 사용한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;BCryptPasswordEncoder&lt;/b&gt; 는 해쉬값이 동일한 것을 방지하기 위해, 해쉬처리의 반복과 솔트처리(원문에 임의의 문자열 붙이기)를 이용&lt;/li&gt;
&lt;li&gt;strengh는 반복횟수에 영향을 주어 크게 줄 경우 해쉬작업이 오래걸릴 수 있음. salt처리를 통해&amp;nbsp;&lt;/li&gt;
&lt;li&gt;BCryptPasswordEncoder&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 생성할때 strength(4~31)와 random 값을 줄 수 있는데,&lt;br /&gt;특별히 지정하지 않으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;strength 는 10을 사용하고, random값은 자체적으로 SecureRandom을 주입해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694866921575&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public BCryptPasswordEncoder(BCryptVersion version, int strength, SecureRandom random) {
		if (strength != -1 &amp;amp;&amp;amp; (strength &amp;lt; BCrypt.MIN_LOG_ROUNDS || strength &amp;gt; BCrypt.MAX_LOG_ROUNDS)) {
			throw new IllegalArgumentException(&quot;Bad strength&quot;);
		}
		this.version = version;
		this.strength = (strength == -1) ? 10 : strength;
		this.random = random;
	}

	private String getSalt() {
		if (this.random != null) {
			return BCrypt.gensalt(this.version.getVersion(), this.strength, this.random);
		}
		return BCrypt.gensalt(this.version.getVersion(), this.strength);
	}
    

	public static String gensalt(String prefix, int log_rounds) throws IllegalArgumentException {
		return gensalt(prefix, log_rounds, new SecureRandom());
	}&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;&lt;b&gt;UserDetailsService&lt;/b&gt; 를 구현한 Bean을 등록해줘야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694867730263&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@Service
public class AuthorizationService implements UserDetailsService {

    private final UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = userRepository.findById(username).get();
        Set&amp;lt;GrantedAuthority&amp;gt; grantedAuthority = new HashSet&amp;lt;&amp;gt;();
        grantedAuthority.add(new SimpleGrantedAuthority(user.getRoleKey()));
        return new org.springframework.security.core.userdetails.User(user.getUserId(), user.getPassword(), grantedAuthority);
    }
}&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;추가로 로그인 성공시 동작을 구현할 수 있다. AuthenticationSuccessHandler&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694868824486&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@Service
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

	private final HttpSession httpSession;
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
		Authentication authentication) throws IOException, ServletException {
		UserDetails userDetails = (UserDetails) authentication.getPrincipal();
		httpSession.setAttribute(&quot;login_user&quot;, userDetails.getUsername());
		response.sendRedirect(&quot;redirect:/&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바/Spring</category>
      <category>spring security</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/247</guid>
      <comments>https://seaking.tistory.com/247#entry247comment</comments>
      <pubDate>Sat, 16 Sep 2023 21:54:17 +0900</pubDate>
    </item>
    <item>
      <title>[도서] 유연함의 힘</title>
      <link>https://seaking.tistory.com/246</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;유연함의힘.jpeg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BNzdR/btsuejC36Cx/moukpkLE9Lj4LW7KNRWiGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BNzdR/btsuejC36Cx/moukpkLE9Lj4LW7KNRWiGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BNzdR/btsuejC36Cx/moukpkLE9Lj4LW7KNRWiGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBNzdR%2FbtsuejC36Cx%2FmoukpkLE9Lj4LW7KNRWiGK%2Fimg.jpg&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;164&quot; height=&quot;243&quot; data-filename=&quot;유연함의힘.jpeg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;마인드셋의 차이&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;학습마인드셋.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b76hAA/btsv7ja9yOQ/PrSrZgtVFXiSNDDdYBUqE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b76hAA/btsv7ja9yOQ/PrSrZgtVFXiSNDDdYBUqE1/img.png&quot; data-alt=&quot;성과증명 마인드셋과 학습 마인드셋&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b76hAA/btsv7ja9yOQ/PrSrZgtVFXiSNDDdYBUqE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb76hAA%2Fbtsv7ja9yOQ%2FPrSrZgtVFXiSNDDdYBUqE1%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;800&quot; height=&quot;705&quot; data-filename=&quot;학습마인드셋.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성과증명 마인드셋과 학습 마인드셋&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;학습마인드셋 실천방법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;유연성 강화&lt;/b&gt; : 개선하고 학습하기 위해 구체적(누군가에게 지시하면 무엇을 해야할지 알아들을 정도로)이고, 진짜 목표가 되도록(그것을 달성하면 원하는 능력을 얻을 수 있도록) 목표를 세우기 : 글로 써야 효과 증대&lt;/li&gt;
&lt;li&gt;&lt;b&gt;피드백의 중요성&lt;/b&gt; : 형식적 피드백보다는 편하고 진솔하게 주고받을 수 있는 피드백 공유 문화형성 필요. 피드백을 통해 성장목표와 학습계획을 수립해야 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성찰의 중요성&lt;/b&gt; : 성찰을 기피하고 바쁘게 행동만 하려는 경향을 대부분의 사람들이 가짐. 성찰을 통해 고통과 취약성을 드러내고, 자신의 경험을 체계적으로 성찰해야 함.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;경험은 단순히 당신에게 일어난 일이 아니다. 당신에게 일어난 일로 무엇을 하는가가 바로 경험이다&quot; - 올더스 레너드 헉슬리&lt;/li&gt;
&lt;li&gt;프로젝트에서 회고, 장애 포스트모텀 등이 중요한 것과 같다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;성과지향 조직에서 보이는 대표적인 특징&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;회사는 동료들보다 특출한 재능이 있다고 여기는 소수의 스타 직원이 이룬 성취를 추켜세우고 칭송함&lt;/li&gt;
&lt;li&gt;직원 채용의 주된 기준이 성장 잠재력이 아니라 지원자의 측정 가능한 인지적 능력으로 평가&lt;/li&gt;
&lt;li&gt;회사가 표창, 상여 등의 형태로 포상할 때 노력과 헌신이 아니라 정량적 성과를 주된 선발 기준으로 삼음&lt;/li&gt;
&lt;li&gt;회사는 직원이 실수하고 실패했을때 그 일로 교훈을 얻을 기회를 주는 대신 잘잘못을 따져 처별하는데 치중&lt;/li&gt;
&lt;li&gt;직원들은 자신의 실수를 감추고, 자신의 프로젝트가 더 성공적으로 보이게 결과를 조작하고, 직무 성과가 돋보이도록 포장하느라 기를 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;마이크로소프트(사티아 나델라 취임이후)의 맥박체크시 질문리스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;당신이 현재 추진하는 모든 프로젝트를 설명하세요.&lt;/li&gt;
&lt;li&gt;그 프로젝트에서 당신이 어떤 진전을 이루었는지 설명하세요.&lt;/li&gt;
&lt;li&gt;당신은 회사에서 다른 직원의 프로젝트나 성공을 어떤 식으로 활용했습니까?&lt;/li&gt;
&lt;li&gt;당신은 회사에서 다양성과 포용성을 어떤 방식으로 구현했습니까?&lt;/li&gt;
&lt;li&gt;당신은 회사에서 성장 마인드셋을 어떻게 실천했습니까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;마이크로소프트에서 리더가 직원들에게 면담시 묻는 질문&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;지난번 대화이후에 당신은 무엇을 했습니까?&lt;/li&gt;
&lt;li&gt;만약 그 일에서 배운 게 있다면 무엇입니까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;※ 이런 질문을 반복적으로 받다보면 일상적인 업무 중에도 지속적인 학습과 성장에 관해 생각하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;실수나 실패로 좌절하는 구성원에게 하는 질문&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;당신은 이 일에서 무엇을 잘했습니까?&lt;/li&gt;
&lt;li&gt;당신은 이 일에서 무엇을 다르게 할 수 있었을까요?&lt;/li&gt;
&lt;li&gt;당신은 이 일에서 어떤 교훈을 얻었습니까? 또는 무엇을 다시 배웠습니까?&lt;/li&gt;
&lt;li&gt;당신은 다음 번에 어떤 교훈을 실천하겠습니까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;당신의 임금곡선보다 학습 곡선에 더 신경쓰세요&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>책 이야기</category>
      <category>유연함</category>
      <category>학습마인드</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/246</guid>
      <comments>https://seaking.tistory.com/246#entry246comment</comments>
      <pubDate>Sat, 16 Sep 2023 17:00:04 +0900</pubDate>
    </item>
    <item>
      <title>[영화] 패러다이스</title>
      <link>https://seaking.tistory.com/244</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;패러다이스2.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qrbhk/btsp7Vtbyrk/e7Q7TuZ7nHzwtiyPV9PccK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qrbhk/btsp7Vtbyrk/e7Q7TuZ7nHzwtiyPV9PccK/img.png&quot; data-alt=&quot;패러다이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qrbhk/btsp7Vtbyrk/e7Q7TuZ7nHzwtiyPV9PccK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqrbhk%2Fbtsp7Vtbyrk%2Fe7Q7TuZ7nHzwtiyPV9PccK%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;528&quot; height=&quot;735&quot; data-filename=&quot;패러다이스2.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;패러다이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netflix에서 패러다이스를 보았다. 미래에 사람들간에 수명을 사고 팔수 있는 기술이 개발되었을때 어떤 일이 벌어질 수 있을지를 그려볼 수 있는 영화다. 가난한 사람은 자신의 수명을 10년, 20년 팔아서 그 돈으로 빨리 늙기는 했지만, 남은 여생을 좀더 낫게 살아갈 수 있게 된다. 부자는 자신이 가진 돈으로 젊음을 사게되어 영생을 추구할 수 있는 시대다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼핏 보면 말이 되는 얘기같지만, 사람들의 욕심으로 인해, 이민자들을 불법적으로 납치해서 수술을 하거나, 기증자를 얻기위해 일부러 파산하게 만드는 조작을 저지르는등 부작용이 속출한다. AI,로봇, 생명공학 등 기술이 발전하지만 그 이면에서 벌어질 부작용에 대해서도 깊이 고민해야 한다는 것을 시사해 주는 영화다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;패러다이스.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cywdWY/btsqj3i6EMv/BeMhcE7cr7l4QCNRP3w0PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cywdWY/btsqj3i6EMv/BeMhcE7cr7l4QCNRP3w0PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cywdWY/btsqj3i6EMv/BeMhcE7cr7l4QCNRP3w0PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcywdWY%2Fbtsqj3i6EMv%2FBeMhcE7cr7l4QCNRP3w0PK%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;586&quot; height=&quot;496&quot; data-filename=&quot;패러다이스.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>about Web/살아가는 이야기</category>
      <category>패러다이스</category>
      <author>끄적끄적</author>
      <guid isPermaLink="true">https://seaking.tistory.com/244</guid>
      <comments>https://seaking.tistory.com/244#entry244comment</comments>
      <pubDate>Sun, 6 Aug 2023 20:27:16 +0900</pubDate>
    </item>
  </channel>
</rss>