<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>한울이</title>
    <link>https://algorithm-master.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 18 Jul 2026 20:51:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>gksdnf050</managingEditor>
    <item>
      <title>[AWS X-Ray] Tail Sampling with OpenTelemetry</title>
      <link>https://algorithm-master.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;문제상황&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;상용환경에서 aws xray 비용이 많이 나오는 이슈가 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;ECS&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;AWS Distro for Opentelemetry Collector&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #6c6c80; text-align: start;&quot;&gt;3. 현재 상황 및 해결&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #6c6c80; text-align: start;&quot;&gt;X-Ray remote sampling 을 사용하면서 비율을 설정해서 사용 중&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #6c6c80; text-align: start;&quot;&gt;새로운 api 들이 추가 될 때 마다 비율을 생각해서 추가 해줬어야 함&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #6c6c80; text-align: start;&quot;&gt;ex) 계속 polling 하는 api 는 비율을 어떻게 해야할지..?&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;color: #6c6c80;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;sampling 비율을 낮게 하면 원하는 trace 를 못 보는 경우도 생김&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;color: #6c6c80;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;높게 하면 비용이 문제가 됨&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #6c6c80;&quot;&gt;팀에서 분산 추적을 사용하는 목적은 error 가 났을 때 확인 하기 위한 용도&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;opentelemetry processor 중 tail sampling processor 를 사용하여 error 인 경우만 샘플링하여 처리하기로 결정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;a href=&quot;https://opentelemetry.io/blog/2022/tail-sampling/&quot;&gt;https://opentelemetry.io/blog/2022/tail-sampling/&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;AWS Distro for Opentelemetry Collector 에서도 지원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/about-aws/whats-new/2023/05/aws-distro-opentelemetry-advanced-sampling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws.amazon.com/ko/about-aws/whats-new/2023/05/aws-distro-opentelemetry-advanced-sampling/&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;&lt;a href=&quot;https://aws-otel.github.io/docs/components/processors&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws-otel.github.io/docs/components/processors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #5c5c5c;&quot;&gt;예시 config.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722592584406&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extensions:
  health_check:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  awsxray:
    endpoint: 0.0.0.0:2000
    transport: udp

processors:
  batch/traces:
    timeout: 1s
    send_batch_size: 50
  batch/metrics:
    timeout: 60s
  tail_sampling:
    decision_wait: 10s
    num_traces: 100
    expected_new_traces_per_sec: 10
    policies:
      [          
          {
                  name: trace-status-policy,
                  type: status_code,
                  status_code: { status_codes: [ERROR] },           
          },                   
      ]

exporters:
  awsxray:
  awsemf:

service:
  pipelines:
    traces:
      receivers: [otlp,awsxray]
      processors: [tail_sampling,batch/traces]
      exporters: [awsxray]
    metrics:
      receivers: [otlp]
      processors: [batch/metrics]
      exporters: [awsemf]

  extensions: [health_check]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PROGRAMMING</category>
      <category>AWS</category>
      <category>openTelemetry</category>
      <category>tailsamplingprocessor</category>
      <category>X-ray</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/179</guid>
      <comments>https://algorithm-master.tistory.com/179#entry179comment</comments>
      <pubDate>Fri, 2 Aug 2024 18:49:10 +0900</pubDate>
    </item>
    <item>
      <title>[AWS RDS] aws rds scale up</title>
      <link>https://algorithm-master.tistory.com/178</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;span&gt;1. &lt;/span&gt;문제상황&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;상용환경에 트래픽이 몰리면서 rds 인스턴스의 cpu 사용량이 99% 를 사용하는 이슈가 발생
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;rds 의 부하가 걸리면서 연관 서비스들에서 connection timeout 이 발생&amp;nbsp;&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;스크린샷 2024-07-22 오후 7.23.25.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JwGF7/btsIKc97A4X/ttDvsxePBzs1hRBanRtLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JwGF7/btsIKc97A4X/ttDvsxePBzs1hRBanRtLK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JwGF7/btsIKc97A4X/ttDvsxePBzs1hRBanRtLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJwGF7%2FbtsIKc97A4X%2FttDvsxePBzs1hRBanRtLK0%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;1844&quot; height=&quot;170&quot; data-filename=&quot;스크린샷 2024-07-22 오후 7.23.25.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt; Spring boot 3.2&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;AWS aurora mysql (multi az)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;ECS&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;3. 해결 과정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;대기 인스턴스 (리더 인스턴스) 먼저 scale up&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;failover 를 통한 라이터 인스턴스와 리더 인스턴스 교체&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;3-1. 해결 과정 중 이슈&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt; 연관된 서비스가 클러스터 엔드포인트를 바라보고 있는 상황에서 &lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;failover 를 통해 인스턴스가 교체되었는데 인식을 못함&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;mysql jdbc driver 에서 제대로 지원을 안해서 발생한다고함 -&amp;gt; aws-mysql-jdbc 사용해야 한다고 함 (&lt;a href=&quot;https://github.com/awslabs/aws-mysql-jdbc&quot;&gt;https://github.com/awslabs/aws-mysql-jdbc&lt;/a&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;우선 서버 재배포를 통해 해결&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;4. 추가 작업&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;성능향상 모니터링 기능을 켜서 어떤 쿼리가 부하를 많이 주는지 확인 후 담당 개발자에게 이슈 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING</category>
      <category>Aurora</category>
      <category>AWS</category>
      <category>aws-mysql-jdbc</category>
      <category>Failover</category>
      <category>RDS</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/178</guid>
      <comments>https://algorithm-master.tistory.com/178#entry178comment</comments>
      <pubDate>Mon, 22 Jul 2024 19:39:02 +0900</pubDate>
    </item>
    <item>
      <title>[GITHUB ACTIONS] github actions no space left on device error</title>
      <link>https://algorithm-master.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;1. 문제상황&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;github actions 에서&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;ci/cd 진행중에 no&amp;nbsp;space&amp;nbsp;left&amp;nbsp;on&amp;nbsp;device&amp;nbsp;error&lt;/span&gt;&lt;/span&gt;&amp;nbsp;가 나면서 실패함&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;github actions 에서 self hosted runner 로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;ec2&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용 중&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;3. 해결 과정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;검색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;no space left on device error 가 발생하는 이유는 ec2 에 저장공간이 부족해서 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;ec2 에 build 한 docker 이미지가 계속 남아 있어서 저장공간이 부족&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;ec2 에 cron 을 설정해서 주기적으로 도커 이미지를 삭제하도록 설정&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;sudo yum -y install cronie&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;sudo systemctl start crond&lt;/li&gt;
&lt;li&gt;sudo systemctl status crond&lt;/li&gt;
&lt;li&gt;sudo crontab -e
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0 * * * * echo y | docker system prune -a &amp;gt; /usr/bin/cron.log 2&amp;gt;&amp;amp;1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>PROGRAMMING</category>
      <category>github</category>
      <category>github actions</category>
      <category>self-hosted runners</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/176</guid>
      <comments>https://algorithm-master.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 16 Mar 2024 21:49:46 +0900</pubDate>
    </item>
    <item>
      <title>[GITHUB ACTIONS] github actions ec2 self hosted runner no basic auth credentials Error</title>
      <link>https://algorithm-master.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;1. 문제상황&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;github actions 에서 &lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;가끔식 ci/cd 진행중에&amp;nbsp;&lt;/span&gt;&lt;/span&gt;no basic auth credentials Error 가 나면서 실패함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;github actions 에서 self hosted runner 로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;ec2&lt;span&gt;&lt;span&gt; &lt;/span&gt;사용 중&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;aws-actions/amazon-ecr-login 사용 중&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;&lt;span&gt;3. 해결 과정&lt;/span&gt;&lt;/span&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aws-actions/amazon-ecr-login&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/aws-actions/amazon-ecr-login&lt;/a&gt;&amp;nbsp;이슈 탭에서 에러 검색&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aws-actions/amazon-ecr-login/issues/431&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/aws-actions/amazon-ecr-login/issues/431&lt;/a&gt;&amp;nbsp;똑같은 에러가 나는 상황 발견&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: left;&quot;&gt;aws-actions/amazon-ecr-login 를 사용하지 않고 aws cli 를 사용하여 ecr 로그인을 하도록 변경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>PROGRAMMING</category>
      <category>amazon-ecr-login</category>
      <category>github</category>
      <category>github actions</category>
      <category>self-hosted runners</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/175</guid>
      <comments>https://algorithm-master.tistory.com/175#entry175comment</comments>
      <pubDate>Sat, 16 Mar 2024 21:36:16 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] Spring security ChangeSessionIdAuthenticationStrategy 이슈</title>
      <link>https://algorithm-master.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제상황&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;spring security 를 사용하여 인증 인가 시스템을 구현해 놓은 프로젝트에서 로그인을 하던중 'creationTime key must not be null' 이라는 error 가 발생&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;스크린샷 2023-10-13 오후 1.37.20.png&quot; data-origin-width=&quot;3480&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NZB72/btsyeqy2mSl/ydNPJynPFI3JAunAoQSXyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NZB72/btsyeqy2mSl/ydNPJynPFI3JAunAoQSXyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NZB72/btsyeqy2mSl/ydNPJynPFI3JAunAoQSXyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNZB72%2Fbtsyeqy2mSl%2FydNPJynPFI3JAunAoQSXyK%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;3480&quot; height=&quot;502&quot; data-filename=&quot;스크린샷 2023-10-13 오후 1.37.20.png&quot; data-origin-width=&quot;3480&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로젝트 설정 상태&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring security, RedisIndexedSessionRepository 사용 중&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 해결 과정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구글링을 통해 error 가 발생한 원인을 찾아보던 중 비슷한 이슈가 발생한 사례를 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/spring-projects/spring-session/issues/2021&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697172719731&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Allow Customizing Redis Session Mapper &amp;middot; Issue #2021 &amp;middot; spring-projects/spring-session&quot; data-og-description=&quot;Describe the bug We are using redis to save sessions in spring cloud gateway, and see some missing key errors in the log. Versions: spring-session-data-redis:2.3.3.RELEASE 2022-02-08 01:04:07.219,E...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; data-og-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TXN4G/hyUdUpW86Q/xn9dOhaTquckwzb7y7ruA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TXN4G/hyUdUpW86Q/xn9dOhaTquckwzb7y7ruA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Allow Customizing Redis Session Mapper &amp;middot; Issue #2021 &amp;middot; spring-projects/spring-session&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug We are using redis to save sessions in spring cloud gateway, and see some missing key errors in the log. Versions: spring-session-data-redis:2.3.3.RELEASE 2022-02-08 01:04:07.219,E...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이슈를 읽어 보다가&amp;nbsp;동시 요청이 발생 했을 때 이러한 error 가 나타난다는 힌트를 얻었다.&lt;/li&gt;
&lt;li&gt;그리고 이슈가 발생한 사람들의 설정이 ChangeSessionIdAuthenticationStrategy 를 사용하고 있다는 것을 알게되었다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 알게된 내용을 토대로 debugging 을 시작했는데 현재 프로젝트도 ChangeSessionIdAuthenticationStrategy 를 사용하고 있었다. 따라서 ChangeSessionIdAuthenticationStrategy 의 applySessionFixation 메소드에 break point (쓰레드 단위로) 를 걸고 2개의 같은 로그인 요청을 하고 debuggin 을 시작했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-13 오후 2.05.22.png&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ8F4c/btsys5zSK7l/46iPBaP1ZeeSlln8JIIdWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ8F4c/btsys5zSK7l/46iPBaP1ZeeSlln8JIIdWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ8F4c/btsys5zSK7l/46iPBaP1ZeeSlln8JIIdWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ8F4c%2Fbtsys5zSK7l%2F46iPBaP1ZeeSlln8JIIdWK%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;2068&quot; height=&quot;790&quot; data-filename=&quot;스크린샷 2023-10-13 오후 2.05.22.png&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;break point 부터 천천히 코드를 따라가다가&lt;span&gt;&amp;nbsp;&lt;/span&gt;RedisIndexedSessionRepository 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;saveChangeSessionId() 메소드에서 원인을 찾았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.35.13.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OTLaH/btsykoBiNOf/eLCk2BxRyn82bQKspl4vw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OTLaH/btsykoBiNOf/eLCk2BxRyn82bQKspl4vw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTLaH/btsykoBiNOf/eLCk2BxRyn82bQKspl4vw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTLaH%2FbtsykoBiNOf%2FeLCk2BxRyn82bQKspl4vw0%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;1986&quot; height=&quot;778&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.35.13.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 요청 과 두번째 요청 둘다 같은 originalSessionIdKey 값을 가지고 있는데 첫번째 요청이 먼저 완료되고 나서 (session key 값 변경 완료) 두번째 요청에서 rename 을 하려고 할때 originalSessionIdKey 에 해당하는 session 이 없어서 rename 이 실패하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 두번째 요청은 변경 된 sessionId 값을 가지고 saveChangeSessionId() 이후에 saveDelta() 로 delta 에 저장되어 있던 값만 저장하는 session 이 생기게 되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫번째 요청으로 변경된 session&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;스크린샷 2023-10-13 오후 3.42.46.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VfcEx/btsyeqe875X/GWrrbyJJdn2gxumzpioYHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VfcEx/btsyeqe875X/GWrrbyJJdn2gxumzpioYHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VfcEx/btsyeqe875X/GWrrbyJJdn2gxumzpioYHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVfcEx%2Fbtsyeqe875X%2FGWrrbyJJdn2gxumzpioYHk%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;1240&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.42.46.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;248&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;동시에 접근한 두번째 요청으로 새로 생성된 session&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;스크린샷 2023-10-13 오후 3.42.08.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EtVQd/btsyerSE70n/KlqkFLIJZA7ysk7jhxR7vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EtVQd/btsyerSE70n/KlqkFLIJZA7ysk7jhxR7vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EtVQd/btsyerSE70n/KlqkFLIJZA7ysk7jhxR7vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEtVQd%2FbtsyerSE70n%2FKlqkFLIJZA7ysk7jhxR7vk%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;1694&quot; height=&quot;186&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.42.08.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 두번째 session 에 creationTime 필드가 없어서 이후에 다시 로그인을 할 때 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'creationTime key must not be null' 이라는 error 가 발생했 던 것이었다.&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;4. 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionFixation protection 전략 들중 changeSessionId 대신 migrateSession 을 사용하도록 변경 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;migrateSession 을 사용하면 아예 새로운 세션을 만들고 기존의 세션의 attribute를 migration 해주는 방식이라 이전 세션의 키값이 변경되어서 발생 했던 문제가 나타나지 않게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.58.59.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rq6fE/btsyquN2xQh/U3DyFCc89p5F27HuNvXXq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rq6fE/btsyquN2xQh/U3DyFCc89p5F27HuNvXXq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rq6fE/btsyquN2xQh/U3DyFCc89p5F27HuNvXXq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frq6fE%2FbtsyquN2xQh%2FU3DyFCc89p5F27HuNvXXq0%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;160&quot; data-filename=&quot;스크린샷 2023-10-13 오후 3.58.59.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&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;&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;a href=&quot;https://docs.spring.io/spring-security/reference/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-security/reference/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697180432526&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;Spring Security :: Spring Security&quot; data-og-description=&quot;If you are ready to start securing an application see the Getting Started sections for servlet and reactive. These sections will walk you through creating your first Spring Security applications. If you want to understand how Spring Security works, you can&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-security/reference/index.html&quot; data-og-url=&quot;https://docs.spring.io/spring-security/reference/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-security/reference/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-security/reference/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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 Security :: Spring Security&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you are ready to start securing an application see the Getting Started sections for servlet and reactive. These sections will walk you through creating your first Spring Security applications. If you want to understand how Spring Security works, you can&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&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://github.com/spring-projects/spring-session/issues/2021&quot;&gt;https://github.com/spring-projects/spring-session/issues/2021&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697180437214&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Allow Customizing Redis Session Mapper &amp;middot; Issue #2021 &amp;middot; spring-projects/spring-session&quot; data-og-description=&quot;Describe the bug We are using redis to save sessions in spring cloud gateway, and see some missing key errors in the log. Versions: spring-session-data-redis:2.3.3.RELEASE 2022-02-08 01:04:07.219,E...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; data-og-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TXN4G/hyUdUpW86Q/xn9dOhaTquckwzb7y7ruA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-session/issues/2021&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TXN4G/hyUdUpW86Q/xn9dOhaTquckwzb7y7ruA0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Allow Customizing Redis Session Mapper &amp;middot; Issue #2021 &amp;middot; spring-projects/spring-session&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug We are using redis to save sessions in spring cloud gateway, and see some missing key errors in the log. Versions: spring-session-data-redis:2.3.3.RELEASE 2022-02-08 01:04:07.219,E...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>PROGRAMMING</category>
      <category>Session Fixation Protection</category>
      <category>Spring</category>
      <category>Spring Security</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/174</guid>
      <comments>https://algorithm-master.tistory.com/174#entry174comment</comments>
      <pubDate>Fri, 13 Oct 2023 16:00:45 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] Spring Authorization Server Default Session Registry</title>
      <link>https://algorithm-master.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Spring authorization server 를 사용해서 oauth2 provider 서버를 구성한 후 access token 을 발급 받아 봤는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;local 과 개발환경에서 oidc token 의 claim 값이 다른 현상 발견 (sid, auth_time)&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;2. &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;debugging&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;- 목적: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;local 에서 테스트 했을 땐 oidc token claim에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;sid, auth_time 값이 있고 개발환경 서버에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;oidc token 을 발급 받았을 땐 왜 claim 값에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;sid, auth_time 값이 없는지 ?&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;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;- OAuth2AuthorizationCodeAuthenticationProvider&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbQqO/btspjXsG97e/Kgz3tQiNkkqKvGuEEM1IG1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;714&quot; data-filename=&quot;스크린샷 2023-07-31 오후 2.44.53.png&quot; /&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;- JwtGenerator&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-31 오후 2.46.45.png&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjvrQh/btspE5aPjPT/7XdYkPuPlzlJDZZXR421iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjvrQh/btspE5aPjPT/7XdYkPuPlzlJDZZXR421iK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjvrQh/btspE5aPjPT/7XdYkPuPlzlJDZZXR421iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjvrQh%2FbtspE5aPjPT%2F7XdYkPuPlzlJDZZXR421iK%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;2044&quot; height=&quot;704&quot; data-filename=&quot;스크린샷 2023-07-31 오후 2.46.45.png&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring authorization server 에서는 sessionInformation 값이 있으면 sid, auth_time 값을 oidc claim에 넣어서 만들어주고 있음.&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;1. 개발환경 서버에 원격 디버깅을 할 수 없는 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. library 에서 발생한 것이라 log 를 원하는 곳에 남길 수 없는 상황&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;같은 코드에서 환경에 따라 다른 결과 값이 나오고 있어서 코드가 아닌 인프라 (db, redis 등등...) 문제라고 생각했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 local 과 개발환경의 db 테이블을 모두 비교 했음 -&amp;gt; 이상 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경 인프라를 local 에서 붙어서 테스트 -&amp;gt; local 인프라와 테스트 할 때와 같은 결과값이 나옴&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 style=&quot;color: #333333; text-align: start;&quot;&gt;jwt claim에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;sid, auth_time 값이 포함된 oidc token 이 발급되는 걸 확인&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;개발환경에서 간헐적으로 local 과 같은 현상이 일어난 다는 것을 보고 깨달은 것이 local 은 단일 서버이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경은 pod 가 여러개가 떠있는 상황(쿠버네티스 사용중) 인걸 인지함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 즉 session clustering 이 이뤄지지 않고 있다고 생각함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; spring authorization server 에서 사용하고 있는 session registry 를 확인해봄&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;- OAuth2AuthorizationServerConfigurer&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-31 오후 3.03.46.png&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZBHG/btspmKzu5Yc/xhLCW34XKNaBkwU7bxmsp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZBHG/btspmKzu5Yc/xhLCW34XKNaBkwU7bxmsp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZBHG/btspmKzu5Yc/xhLCW34XKNaBkwU7bxmsp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZBHG%2FbtspmKzu5Yc%2FxhLCW34XKNaBkwU7bxmsp1%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;1952&quot; height=&quot;462&quot; data-filename=&quot;스크린샷 2023-07-31 오후 3.03.46.png&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRegistry bean 이 없다면 기본적으로 SessionRegistryImpl (server의 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clustered 환경에서 spring session 으로부터 session 정보를 가져오도록 SpringSessionBackedSessionRegistry bean 을 등록함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-31 오후 3.11.06.png&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oPb9s/btspxqftNeW/tX1Tvtlu2Q3KkQknvKRKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPb9s/btspxqftNeW/tX1Tvtlu2Q3KkQknvKRKWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPb9s/btspxqftNeW/tX1Tvtlu2Q3KkQknvKRKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPb9s%2FbtspxqftNeW%2FtX1Tvtlu2Q3KkQknvKRKWK%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;1594&quot; height=&quot;390&quot; data-filename=&quot;스크린샷 2023-07-31 오후 3.11.06.png&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&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;참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spring.io/projects/spring-boot&quot;&gt;https://spring.io/projects/spring-boot&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697180464791&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;Spring Boot&quot; data-og-description=&quot;&quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/projects/spring-boot&quot; data-og-url=&quot;https://spring.io/projects/spring-boot&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9Dt34/hyUdMMe0hX/1TsaUEhKXeiBGj345zauIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bKBad1/hyT9EPToIL/gci3lXeJZkBn3roZ8yraBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://spring.io/projects/spring-boot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/projects/spring-boot&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9Dt34/hyUdMMe0hX/1TsaUEhKXeiBGj345zauIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bKBad1/hyT9EPToIL/gci3lXeJZkBn3roZ8yraBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.io&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>PROGRAMMING</category>
      <category>Session Registry</category>
      <category>Spring</category>
      <category>Spring Authorization Server</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/173</guid>
      <comments>https://algorithm-master.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 31 Jul 2023 15:12:06 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] ConcurrentSessionControlAuthenticationStrategy session expire 실패</title>
      <link>https://algorithm-master.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제상황&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;spring security maximum session 10으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부하 테스트 도중 session을 expire 시킬 수 없다는 log 가 찍힘&lt;/p&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;2726&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkhYn3/btr53IlvjVN/mps7BmloDwLmhnkOcVpyG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkhYn3/btr53IlvjVN/mps7BmloDwLmhnkOcVpyG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkhYn3/btr53IlvjVN/mps7BmloDwLmhnkOcVpyG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkhYn3%2Fbtr53IlvjVN%2Fmps7BmloDwLmhnkOcVpyG0%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;2726&quot; height=&quot;48&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. debugging&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring security 는 ConcurrentSessionControlAuthenticationStrategy 에서 동일한 유저의 maximunm session 을 처리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session registry를 통해 모든 session을 가져온 후 maximum session count 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SpringSessionBackedSessionRegistry 사용중)&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;2392&quot; data-origin-height=&quot;1342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q0EfN/btr5OQsvGUJ/tFOAuc3ok7UPmKEhsY5awK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q0EfN/btr5OQsvGUJ/tFOAuc3ok7UPmKEhsY5awK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q0EfN/btr5OQsvGUJ/tFOAuc3ok7UPmKEhsY5awK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq0EfN%2Fbtr5OQsvGUJ%2FtFOAuc3ok7UPmKEhsY5awK%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;2392&quot; height=&quot;1342&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;1342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 설정한 maximum session count 를 초과하면 가장 오래된 session을 만료시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(spring security에서 초과된 session 을 만료시킬 때 삭제 하는게 아니고 session attribute 에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expire attribute를 추가함)&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;2134&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D8WPN/btr5Zkyy4E6/UhpYEnAC7uKIzdIpdE7nYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D8WPN/btr5Zkyy4E6/UhpYEnAC7uKIzdIpdE7nYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D8WPN/btr5Zkyy4E6/UhpYEnAC7uKIzdIpdE7nYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD8WPN%2Fbtr5Zkyy4E6%2FUhpYEnAC7uKIzdIpdE7nYK%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;2134&quot; height=&quot;680&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분에서 session 을 가져와서 expire 시키려 할때 session 이 null인 상황 (SpringSessionBackedSessionInformation 사용중)&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;1830&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bENBtd/btr5RgwZYy2/jZEgtCcpmvywpV6unBRLq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bENBtd/btr5RgwZYy2/jZEgtCcpmvywpV6unBRLq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bENBtd/btr5RgwZYy2/jZEgtCcpmvywpV6unBRLq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbENBtd%2Fbtr5RgwZYy2%2FjZEgtCcpmvywpV6unBRLq0%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;1830&quot; height=&quot;710&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;710&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 계정 로그인으로 부하테스트 중이므로 동시에 로그인 시도 요청이 왔을 거고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 SpringSessionBackedSessionRegistry 를 통해 가져온 세션 list 를 동시에 여러명이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expire 하려고 하니 이미 expire 되어서 이러한 상황이 발생 할 것이라고 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(RedisIndexedSessionRepository 사용중)&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;944&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEOT12/btr5OQlKNRe/5MOc9A3p3lICti0mV1RPw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEOT12/btr5OQlKNRe/5MOc9A3p3lICti0mV1RPw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEOT12/btr5OQlKNRe/5MOc9A3p3lICti0mV1RPw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEOT12%2Fbtr5OQlKNRe%2F5MOc9A3p3lICti0mV1RPw0%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;944&quot; height=&quot;242&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bybMe3/btr5RZ2Qe9M/5suGKAeGPK7IlAEOOSv8k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bybMe3/btr5RZ2Qe9M/5suGKAeGPK7IlAEOOSv8k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bybMe3/btr5RZ2Qe9M/5suGKAeGPK7IlAEOOSv8k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbybMe3%2Fbtr5RZ2Qe9M%2F5suGKAeGPK7IlAEOOSv8k1%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;1962&quot; height=&quot;598&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loaded.isExpired() 이 부분에서 session 이 이미 expire되어서 null 을 리턴하므로 발생 했을 것이라고 생각&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loaded.isExpired()는 session 값을 가져와서 expire attribute를 확인 하는 것이 아닌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session을 가져와서 시간을 비교해서 expired가 되었는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 위에서 null 을 return 했다는 것은 애초에 session이 없다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 어디선가 session을 삭제 했다는 것 (expire 를 시킨 것이 아님 - expire attribute를 넣은 것이 아님)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3pysC/btr5YVMelPc/GD8WeNyTx1IinKfxETFZtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3pysC/btr5YVMelPc/GD8WeNyTx1IinKfxETFZtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3pysC/btr5YVMelPc/GD8WeNyTx1IinKfxETFZtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3pysC%2Fbtr5YVMelPc%2FGD8WeNyTx1IinKfxETFZtK%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;1658&quot; height=&quot;292&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;292&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인을 계속 찾아보던 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이미 로그인 되어있던 session cookie 를 가지고 또 로그인을 시도하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 session cookie 값을 삭제 시킨다는 것을 알게됨&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;maximum session 에 도달 했을 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBDRw/btr5O9FkvJg/cNrnCK0U2By4xtOqK3YCsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBDRw/btr5O9FkvJg/cNrnCK0U2By4xtOqK3YCsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBDRw/btr5O9FkvJg/cNrnCK0U2By4xtOqK3YCsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBDRw%2Fbtr5O9FkvJg%2FcNrnCK0U2By4xtOqK3YCsK%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;1844&quot; height=&quot;644&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionFixationProtectionStrategy 으로 인해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청한 session 값을 삭제하고 새로운 session 값을 발행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhBKyi/btr590lT2hU/KeOwIKeoLYKQWugodgXg2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhBKyi/btr590lT2hU/KeOwIKeoLYKQWugodgXg2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhBKyi/btr590lT2hU/KeOwIKeoLYKQWugodgXg2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhBKyi%2Fbtr590lT2hU%2FKeOwIKeoLYKQWugodgXg2k%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;1764&quot; height=&quot;792&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부하테스트를 할때 header에 cookie 값을 넣지 않고 로그인 요청을 보냈는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉 이전 session cookie 값이 없으므로 이전 session cookie 값을 삭제 하지 않을 거라고 생각했음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동적으로 response 로 받은 cookie 값을 포함해서 요청을 보내고 있었다.&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 을 다른 스레드에서 또 삭제하려고 하니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byML9k/btr5RgKue86/N7JZ67BbaBaGAZxKpUHUM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byML9k/btr5RgKue86/N7JZ67BbaBaGAZxKpUHUM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byML9k/btr5RgKue86/N7JZ67BbaBaGAZxKpUHUM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyML9k%2Fbtr5RgKue86%2FN7JZ67BbaBaGAZxKpUHUM1%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;2726&quot; height=&quot;48&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 log 가 찍힌 것이었다.&lt;/p&gt;</description>
      <category>PROGRAMMING</category>
      <category>ConcurrentSessionControlAuthenticationStrategy</category>
      <category>Session</category>
      <category>Spring</category>
      <category>Spring Security</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/172</guid>
      <comments>https://algorithm-master.tistory.com/172#entry172comment</comments>
      <pubDate>Sun, 26 Mar 2023 15:50:21 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] Session</title>
      <link>https://algorithm-master.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Servlet session&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. session 이 없을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RequestFacade.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.06.04.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tmxuh/btr3lDHyESe/5RbxbEs96RqvwKOpeEPUkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tmxuh/btr3lDHyESe/5RbxbEs96RqvwKOpeEPUkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tmxuh/btr3lDHyESe/5RbxbEs96RqvwKOpeEPUkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTmxuh%2Fbtr3lDHyESe%2F5RbxbEs96RqvwKOpeEPUkK%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;1558&quot; height=&quot;704&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.06.04.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connector.java/Request&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.05.47.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FOuEO/btr3dbr4KHc/t8mcmeFSKQrgKoKAM5GrjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FOuEO/btr3dbr4KHc/t8mcmeFSKQrgKoKAM5GrjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FOuEO/btr3dbr4KHc/t8mcmeFSKQrgKoKAM5GrjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFOuEO%2Fbtr3dbr4KHc%2Ft8mcmeFSKQrgKoKAM5GrjK%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;1670&quot; height=&quot;616&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.05.47.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.53.31.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DfdQk/btr3uElAgqq/5JjOpKPIcnXi5MDgxOEN81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DfdQk/btr3uElAgqq/5JjOpKPIcnXi5MDgxOEN81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DfdQk/btr3uElAgqq/5JjOpKPIcnXi5MDgxOEN81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDfdQk%2Fbtr3uElAgqq%2F5JjOpKPIcnXi5MDgxOEN81%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;2160&quot; height=&quot;1208&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.53.31.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.53.56.png&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PU6ui/btr3oeHxcZo/Yvu5dkHg0gARowhDkOKCQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PU6ui/btr3oeHxcZo/Yvu5dkHg0gARowhDkOKCQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PU6ui/btr3oeHxcZo/Yvu5dkHg0gARowhDkOKCQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPU6ui%2Fbtr3oeHxcZo%2FYvu5dkHg0gARowhDkOKCQK%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;1862&quot; height=&quot;754&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.53.56.png&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ManagerBase.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.07.54.png&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;1494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brFIP5/btr3c3HAMUU/yaWfLzEXmFS7h2olJ2piCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brFIP5/btr3c3HAMUU/yaWfLzEXmFS7h2olJ2piCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brFIP5/btr3c3HAMUU/yaWfLzEXmFS7h2olJ2piCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrFIP5%2Fbtr3c3HAMUU%2FyaWfLzEXmFS7h2olJ2piCk%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;1696&quot; height=&quot;1494&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.07.54.png&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;1494&quot;/&gt;&lt;/span&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;1-2. session 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connect.java/Request&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.51.35.png&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co30qE/btr3eCimoyS/sGYDkEN3flWS5RVu92sPC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co30qE/btr3eCimoyS/sGYDkEN3flWS5RVu92sPC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co30qE/btr3eCimoyS/sGYDkEN3flWS5RVu92sPC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco30qE%2Fbtr3eCimoyS%2FsGYDkEN3flWS5RVu92sPC0%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;2090&quot; height=&quot;1064&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.51.35.png&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1064&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Spring session with redis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1. session 없을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringHttpSessionConfiguration.java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SessionRepositoryFilter 등록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.13.50.png&quot; data-origin-width=&quot;2170&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQxd9/btr3vOaD4M8/qr5ZSA5BWwnJr0crf3mfl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQxd9/btr3vOaD4M8/qr5ZSA5BWwnJr0crf3mfl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQxd9/btr3vOaD4M8/qr5ZSA5BWwnJr0crf3mfl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQxd9%2Fbtr3vOaD4M8%2Fqr5ZSA5BWwnJr0crf3mfl0%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;2170&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.13.50.png&quot; data-origin-width=&quot;2170&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRepositoryFilter.java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRepositryRequsetWrapper 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.21.57.png&quot; data-origin-width=&quot;2020&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b341bE/btr3ogeirZn/gOnRqEAthkxGyu5zXkNQC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b341bE/btr3ogeirZn/gOnRqEAthkxGyu5zXkNQC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b341bE/btr3ogeirZn/gOnRqEAthkxGyu5zXkNQC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb341bE%2Fbtr3ogeirZn%2FgOnRqEAthkxGyu5zXkNQC1%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;2020&quot; height=&quot;708&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.21.57.png&quot; data-origin-width=&quot;2020&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&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;스크린샷 2023-03-12 오후 11.16.10.png&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvP8nS/btr3uEMFEyC/MXhMMRAlKPYv31xlFvRjyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvP8nS/btr3uEMFEyC/MXhMMRAlKPYv31xlFvRjyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvP8nS/btr3uEMFEyC/MXhMMRAlKPYv31xlFvRjyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvP8nS%2Fbtr3uEMFEyC%2FMXhMMRAlKPYv31xlFvRjyk%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;2232&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.16.10.png&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.16.27.png&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqxF5/btr3dFl7FPT/pq5lKMUY4egchiI448wQA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqxF5/btr3dFl7FPT/pq5lKMUY4egchiI448wQA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqxF5/btr3dFl7FPT/pq5lKMUY4egchiI448wQA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqxF5%2Fbtr3dFl7FPT%2Fpq5lKMUY4egchiI448wQA0%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;2098&quot; height=&quot;1060&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.16.27.png&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1060&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.18.48.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wbJZU/btr3dDPpYcR/o0FY5ZaakLPSXju2oQJmWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wbJZU/btr3dDPpYcR/o0FY5ZaakLPSXju2oQJmWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wbJZU/btr3dDPpYcR/o0FY5ZaakLPSXju2oQJmWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwbJZU%2Fbtr3dDPpYcR%2Fo0FY5ZaakLPSXju2oQJmWk%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;2048&quot; height=&quot;366&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.18.48.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedisIndexedSessionRepository.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.20.06.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crAk03/btr3c31UDKZ/BgASz7xj2auuQ8Z2jMG1WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crAk03/btr3c31UDKZ/BgASz7xj2auuQ8Z2jMG1WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crAk03/btr3c31UDKZ/BgASz7xj2auuQ8Z2jMG1WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrAk03%2Fbtr3c31UDKZ%2FBgASz7xj2auuQ8Z2jMG1WK%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;1446&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.20.06.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRepositoryFilter.java (이 부분은 session 있을 때 / 없을 때 둘다 적용 - 세션 저장)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.47.39.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHnNq/btr3Bw8B8fq/DupQVJkkgv4SmPWPZI3J4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHnNq/btr3Bw8B8fq/DupQVJkkgv4SmPWPZI3J4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHnNq/btr3Bw8B8fq/DupQVJkkgv4SmPWPZI3J4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHnNq%2Fbtr3Bw8B8fq%2FDupQVJkkgv4SmPWPZI3J4K%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;2094&quot; height=&quot;718&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.47.39.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRepositoryFilter.java/SessionRepositryRequestWrapper&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.37.59.png&quot; data-origin-width=&quot;2500&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVUsk/btr3dDPqo6u/HBNSp4wNGU5YIksRv8ppBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVUsk/btr3dDPqo6u/HBNSp4wNGU5YIksRv8ppBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVUsk/btr3dDPqo6u/HBNSp4wNGU5YIksRv8ppBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVUsk%2Fbtr3dDPqo6u%2FHBNSp4wNGU5YIksRv8ppBk%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;2500&quot; height=&quot;800&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.37.59.png&quot; data-origin-width=&quot;2500&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedisIndexedSessionRepository.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.41.16.png&quot; data-origin-width=&quot;2020&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6N3pG/btr3BvIC7vi/frmNvkouZkvfIUS1gql0R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6N3pG/btr3BvIC7vi/frmNvkouZkvfIUS1gql0R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6N3pG/btr3BvIC7vi/frmNvkouZkvfIUS1gql0R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6N3pG%2Fbtr3BvIC7vi%2FfrmNvkouZkvfIUS1gql0R1%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;2020&quot; height=&quot;224&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.41.16.png&quot; data-origin-width=&quot;2020&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.43.56.png&quot; data-origin-width=&quot;2254&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZDR7r/btr3prUoBZN/L5aHyXeBIyT89rLK6H6cQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZDR7r/btr3prUoBZN/L5aHyXeBIyT89rLK6H6cQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZDR7r/btr3prUoBZN/L5aHyXeBIyT89rLK6H6cQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZDR7r%2Fbtr3prUoBZN%2FL5aHyXeBIyT89rLK6H6cQ1%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;2254&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.43.56.png&quot; data-origin-width=&quot;2254&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.45.41.png&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJcqYz/btr3kx1I0tF/g0Qt7MyKwO1n6Bk3RKXrR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJcqYz/btr3kx1I0tF/g0Qt7MyKwO1n6Bk3RKXrR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJcqYz/btr3kx1I0tF/g0Qt7MyKwO1n6Bk3RKXrR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJcqYz%2Fbtr3kx1I0tF%2Fg0Qt7MyKwO1n6Bk3RKXrR0%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;2074&quot; height=&quot;1518&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.45.41.png&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2. session 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionRepositoryFilter.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.17.20.png&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bESkM8/btr3vNJyY4O/NbbK47vcCRnEIAJDEBE6v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bESkM8/btr3vNJyY4O/NbbK47vcCRnEIAJDEBE6v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bESkM8/btr3vNJyY4O/NbbK47vcCRnEIAJDEBE6v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbESkM8%2Fbtr3vNJyY4O%2FNbbK47vcCRnEIAJDEBE6v1%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;2162&quot; height=&quot;810&quot; data-filename=&quot;스크린샷 2023-03-12 오후 11.17.20.png&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&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;RedisIndexedSessionRepository.java&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.05.39.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7QDMv/btsFX3uGac9/5NK2SIbo4stWvSVZmdJPvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7QDMv/btsFX3uGac9/5NK2SIbo4stWvSVZmdJPvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7QDMv/btsFX3uGac9/5NK2SIbo4stWvSVZmdJPvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7QDMv%2FbtsFX3uGac9%2F5NK2SIbo4stWvSVZmdJPvK%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;1970&quot; height=&quot;902&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.05.39.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&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;RedisSessionMapper.java (시간 증가)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.06.00.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBd3m/btsFUpNiPqe/xIq1je3Q4wDGgsjBTKayik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBd3m/btsFUpNiPqe/xIq1je3Q4wDGgsjBTKayik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBd3m/btsFUpNiPqe/xIq1je3Q4wDGgsjBTKayik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBd3m%2FbtsFUpNiPqe%2FxIq1je3Q4wDGgsjBTKayik%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;1900&quot; height=&quot;1210&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.06.00.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/171</guid>
      <comments>https://algorithm-master.tistory.com/171#entry171comment</comments>
      <pubDate>Mon, 13 Mar 2023 00:01:23 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] k8s cronjob + Spring Batch</title>
      <link>https://algorithm-master.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring batch 를 k8s cronjob 을 사용하여 배포 하면서 겪었던 이슈&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring batch 를 실행하면서 error가 발생해서 정상적으로 종료하지 않으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k8s cronjob 에 설정해놓은 restartPolicy 를 통해서 재실행하고, slack에 알림 발송&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이슈&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부러 batch 작업중에 exception 발생하도록 코드를 넣고 cronjob을 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; exception이 발생하고 batch가 종료되고 나서 pod의 상태가 Completed&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.08.38.png&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx1m7R/btrJ9ucl8YL/aiXu8Ngbtszvqw2WWqQs31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx1m7R/btrJ9ucl8YL/aiXu8Ngbtszvqw2WWqQs31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx1m7R/btrJ9ucl8YL/aiXu8Ngbtszvqw2WWqQs31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx1m7R%2FbtrJ9ucl8YL%2FaiXu8Ngbtszvqw2WWqQs31%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;1602&quot; height=&quot;154&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.08.38.png&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; pod 가 정상적으로 종료되었으므로 restartPolicy 를 통해서 재실행 하지 않고 slack에도 알림 발송 하지 않음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring batch에서 exception이 발생했지만 exit code는 0으로 반환하고 종료 -&amp;gt; exit code가 0이므로 pod는 성공으로 인지&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring batch에서 exception이 발생하면 exit code를 반환하고 종료하도록 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.08.43.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck3igz/btrJ9vhYDgw/L7xOA1RFGE8rXI6A1mFgGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck3igz/btrJ9vhYDgw/L7xOA1RFGE8rXI6A1mFgGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck3igz/btrJ9vhYDgw/L7xOA1RFGE8rXI6A1mFgGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck3igz%2FbtrJ9vhYDgw%2FL7xOA1RFGE8rXI6A1mFgGK%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;1644&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.08.43.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;a href=&quot;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&quot;&gt;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697180539372&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;Spring Batch on Kubernetes: Efficient batch processing at scale&quot; data-og-description=&quot;Introduction Batch processing has been a challenging area of computer science since its inception in the early days of punch cards and magnetic tapes. Nowadays, the modern cloud computing era comes with a whole new set of challenges for how to develop and &quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&quot; data-og-url=&quot;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ef5NZ8/hyUd04Nqk0/OOTSQHDn2kz76U9CTRG8Lk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dniQrK/hyUdX74Bmg/aaKLbql0z0FVfTjY8Cpc8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ef5NZ8/hyUd04Nqk0/OOTSQHDn2kz76U9CTRG8Lk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dniQrK/hyUdX74Bmg/aaKLbql0z0FVfTjY8Cpc8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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 Batch on Kubernetes: Efficient batch processing at scale&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction Batch processing has been a challenging area of computer science since its inception in the early days of punch cards and magnetic tapes. Nowadays, the modern cloud computing era comes with a whole new set of challenges for how to develop and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.io&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>PROGRAMMING</category>
      <category>cronjob</category>
      <category>k8s</category>
      <category>Spring Batch</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/169</guid>
      <comments>https://algorithm-master.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 21 Aug 2022 20:10:10 +0900</pubDate>
    </item>
    <item>
      <title>[SPRING] Lombok @RequiredArgsConstructor @Qualifier</title>
      <link>https://algorithm-master.tistory.com/168</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;lombok에서 제공하는 @RequiredArgsConstructor 를 사용해서 bean들을 생성자 주입을 하고있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던 중 @Qualifier 를 사용해서 어떤 bean을 주입해야하는지 명시해야 할 상황이 생겼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.04.50.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wY7mz/btrKbtcSMwC/xBfTzHAlyUlQv87i7kqGjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wY7mz/btrKbtcSMwC/xBfTzHAlyUlQv87i7kqGjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wY7mz/btrKbtcSMwC/xBfTzHAlyUlQv87i7kqGjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwY7mz%2FbtrKbtcSMwC%2FxBfTzHAlyUlQv87i7kqGjK%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;976&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2022-08-21 오후 8.04.50.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 NoUniqueBeanDefinitionException이 발생하면서 @Qualifier로 지정한 bean을 주입하지 못하는 상황이 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 lombok이 제공하는 @RequiredArgsConstructor는 애노테이션 까지 함께 포함해서 생성자를 만들지는 않는다고 한다.&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;그래서 @RequiredArgsConstructor를 사용하지 않고 생성자를 직접 만들어서 주입을 하거나 lombok.config를 수정해야 했다.&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;&lt;a href=&quot;https://www.inflearn.com/questions/71872&quot;&gt;https://www.inflearn.com/questions/71872&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697180562568&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;@RequiredArgsConstructor과 @Qualifier질문 - 인프런 | 질문 &amp;amp; 답변&quot; data-og-description=&quot;먼저 좋은 강의를 제공해주시것에 감사인사드립니다!강의에서는 생성자에 @Qualifier를 주입하셨는데[사진]강의를 듣고난후 @RequireArgsConstructor와@Qualifier를 같이 사용했을 경우NoUniqueBeanDefinitionExcep&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/71872&quot; data-og-url=&quot;https://www.inflearn.com/questions/71872/requiredargsconstructor%EA%B3%BC-qualifier%EC%A7%88%EB%AC%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VsPfa/hyT9E3pOnw/8OdiuZGNzHIxXDH9wLg6N1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/cZo4Fm/hyT9Eh0bZw/JAWoSpMBPTmD9jeiGul340/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/dXs6Lv/hyT9Mf4kJk/tEQlpzZK9BqQOvgWKCetp0/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/71872&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/71872&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VsPfa/hyT9E3pOnw/8OdiuZGNzHIxXDH9wLg6N1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/cZo4Fm/hyT9Eh0bZw/JAWoSpMBPTmD9jeiGul340/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/dXs6Lv/hyT9Mf4kJk/tEQlpzZK9BqQOvgWKCetp0/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500');&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;@RequiredArgsConstructor과 @Qualifier질문 - 인프런 | 질문 &amp;amp; 답변&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;먼저 좋은 강의를 제공해주시것에 감사인사드립니다!강의에서는 생성자에 @Qualifier를 주입하셨는데[사진]강의를 듣고난후 @RequireArgsConstructor와@Qualifier를 같이 사용했을 경우NoUniqueBeanDefinitionExcep&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.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>PROGRAMMING</category>
      <category>lombok</category>
      <category>Qualifier</category>
      <category>RequiredArgsConstructor</category>
      <category>Spring</category>
      <author>gksdnf050</author>
      <guid isPermaLink="true">https://algorithm-master.tistory.com/168</guid>
      <comments>https://algorithm-master.tistory.com/168#entry168comment</comments>
      <pubDate>Sun, 21 Aug 2022 20:05:05 +0900</pubDate>
    </item>
  </channel>
</rss>