<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>스팸문  - 개발 블로그</title>
    <link>https://mcp-dev.tistory.com/</link>
    <description>알량한 개발 지식을 글로 싸고자함 (개소리 주의 )</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 22:08:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>spam.moon</managingEditor>
    <image>
      <title>스팸문  - 개발 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/6413800/attach/12c367e4938f496694087b473d240823</url>
      <link>https://mcp-dev.tistory.com</link>
    </image>
    <item>
      <title>nodejs에서 credentials 관리하기 (대칭키 알고리즘 + 깃허브 액션)</title>
      <link>https://mcp-dev.tistory.com/6</link>
      <description>&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;nodejs에서는 DB 접속 정보나, 기타 민감 정보 등의 credentials를 어떻게 관리하는 것이 좋을까? 여러가지 좋은 방식들이나 아이디어 들이 있겠지만, 여기서는 &lt;b&gt;'대칭키 알고리즘 + 깃허브 액션 &amp;gt; 시크릿'&lt;/b&gt;을 활용해서 CI/CD 환경에 까지 셋팅하는 아이디어 정도를 공유해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[컨셉]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 대표적인 DB Password를 예시로 들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DB 패스워드를 얻었음&amp;nbsp;✨ (From, DBA or DevOps or 직접 생성)&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. 보안상 env등 환경 변수 파일에 직접 등록하거나 코드 상에 하드 코딩 할 수는 없으니 고민&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 나랑 From 말고는 모르게 관리하는 방법 없을까? (+ 팀원도 모르고 키 관리자만 알고 있어야함)&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: #ee2323;&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;*여기 부터가 진짜ㅎㅎ!@&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 대칭키로 암호화 (대칭키는 하나의 키로 암복호화가 가능한 암호화 알고리즘)&lt;/p&gt;
&lt;pre id=&quot;code_1692883661885&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import crypto from 'crypto';

// 대칭키 생성
const algorithm = 'aes-256-cbc'; // 대칭키 알고리즘
const key = crypto.randomBytes(32); // 32바이트(256비트)의 랜덤 대칭키 생성
const iv = crypto.randomBytes(16); // 초기화 벡터 생성

// 원본 데이터
const originalText = 'DBPASSWORD임~';

// 데이터 암호화
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encryptedData = cipher.update(originalText, 'utf8', 'hex');
encryptedData += cipher.final('hex');

// 데이터 복호화
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decryptedData = decipher.update(encryptedData, 'hex', 'utf8');
decryptedData += decipher.final('utf8');

// 결과 출력
console.log('원본 데이터:', originalText);
console.log('암호화된 데이터:', encryptedData);
console.log('대칭키 (KEY):', key.toString('base64'));
console.log('초기화 벡터 (IV):', iv.toString('base64'));&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;5. 대칭키와, IV 값을 &lt;b&gt;'Github Actions &amp;gt; Secrets'&lt;/b&gt; 에 등록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJyTnh/btsr5hOQ7z9/mkQWoxiEJ88nJxWX7xPRP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJyTnh/btsr5hOQ7z9/mkQWoxiEJ88nJxWX7xPRP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJyTnh/btsr5hOQ7z9/mkQWoxiEJ88nJxWX7xPRP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJyTnh%2Fbtsr5hOQ7z9%2FmkQWoxiEJ88nJxWX7xPRP0%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;1212&quot; height=&quot;758&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;758&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;6. &lt;b&gt;'Github Actions' &lt;/b&gt;에서 nodejs 환경 변수로 등록 (&lt;i&gt;on .yml&lt;/i&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1692886078067&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Using Gihub Secrets
  id: test
    env:
      DB_PASSWORD_KEY: ${{ secrets.DB_PASSWORD_KEY }}
      DB_PASSWORD_IV: ${{ secrets.DB_PASSWORD_IV }}&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; 7. 애플리케이션 내에서, 아래와 같이 함수화하고 환경변수를 로드하는 방식으로 DB Connector등에 평가하여 사용하면 되겠다~!&lt;/p&gt;
&lt;pre id=&quot;code_1692883759127&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const decrypt = (encryptedData: string, key: string, iv: string) =&amp;gt; {
  const algorithm = 'aes-256-cbc';
  const decipher = crypto.createDecipheriv(
    algorithm,
    Buffer.from(key, 'base64'),
    Buffer.from(iv, 'base64'),
  );
  let decryptedData = decipher.update(encryptedData, 'hex', 'utf8');
  decryptedData += decipher.final('utf8');

  return decryptedData;
};

decrypt(
 process.env.DB_PASSWORD,
 process.env.DB_PASSWORD_KEY,
 process.env.DB_PASSWORD_IV,
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[결론]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 해당 방식으로 하더라도 보안 누수점이 존재하기는 한다. 하지만 디플로이 권한이나 실행자 등에 대한 로깅만 잘 되어있다면 추적은 가능할 것이다. 다만 작은 규모의 서비스에서는 해당 방식 정도만 구성 해놓아도 충분히 보안 점수를 높일 수 는 있지 않을까 싶다. 결국 본질은 정보의 의 민감도 및 중요도를 잘 파악하여 적절한 보안을 갖추는 것이 중요함. (AWS Parameter Store 나 비밀키 관리 매니저 등의 서비스를 활용해도 좋음 !!)&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>github</category>
      <category>github actions</category>
      <category>nodeJS</category>
      <category>깃허브</category>
      <category>깃허브액션</category>
      <category>대칭키</category>
      <category>비대칭키</category>
      <category>알고리즘</category>
      <category>암복호화</category>
      <category>암호화</category>
      <author>spam.moon</author>
      <guid isPermaLink="true">https://mcp-dev.tistory.com/6</guid>
      <comments>https://mcp-dev.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 24 Aug 2023 23:17:52 +0900</pubDate>
    </item>
    <item>
      <title>하... 개발 블로그는 시작부터 귀찮다...</title>
      <link>https://mcp-dev.tistory.com/1</link>
      <description>&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;개발자라면, 누구나 개발 블로그를 작성하는 것을 생각해보곤 한다(?). 그 이유는 장점이  많기 때문이다. (개발자가 블로그를 해야하는 이유 검색해보면... 안하면 거의 붕우유신 됨) &quot;생각의 정리, 개발 경험 자료화, 포트폴리오, 애드센스 수익&quot; 등...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.webp&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQ65B/btsqwZACUMN/1FN829L9orLfHmrwhhPh2k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQ65B/btsqwZACUMN/1FN829L9orLfHmrwhhPh2k/img.webp&quot; data-alt=&quot;개귀찮.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQ65B/btsqwZACUMN/1FN829L9orLfHmrwhhPh2k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQ65B%2FbtsqwZACUMN%2F1FN829L9orLfHmrwhhPh2k%2Fimg.webp&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;250&quot; height=&quot;225&quot; data-filename=&quot;11.webp&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;225&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;&lt;b&gt;근데 왜 안해?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 좋은걸 막상 시작하려고 하면 다양한 장애물과 난관에 봉착하게 된다. 꾸준함, 부지런함 이런 워딩은 지루하니까 뒷전으로 하자. 일단 기술 변화 및 라이브러리나 프레임워크 업데이트가 너무 빠르니까... 내가 열심히 작성한 글이 금방 레거시 글이 될 수 도 있다는 사실과 구글링해서 열심히 개발 퍼즐 맞추기 게임으로 연명하고 있었는데, 막상 일목요연하게 생각을 정리해서 글을 쓰려니 엄두 조차 내기 힘들다는 여러 잡생각과 진실에 마주하게 된다. 이런 생각을 하다보면, 논리적이고 효율을 추구하는 개발자인 나는 또 이런 생각을 한다. 내가 개발 블로그에 분배하는 시간적 공수, 다른 자기개발에 활용하는 시간적 공수를 비교해봤을때 무엇이 더 양질의 효과를 내고 효율적일까? 이런 고민들을 또 하게 된다.&lt;i&gt;&lt;b&gt;는 개뿔 결국 핑계이고 게을렀다. 앞으로 열심히 써보자...ㅠ&amp;nbsp; (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;귀찮음, 넷플릭스, 유튜브 쇼츠, 인스타, 맥쭈 안녕...............)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;111.webp&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3CWEl/btsqtbWnHK5/RrmCbeN1Ln1sQErpmP0aB0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3CWEl/btsqtbWnHK5/RrmCbeN1Ln1sQErpmP0aB0/img.webp&quot; data-alt=&quot;묘귀찮.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3CWEl/btsqtbWnHK5/RrmCbeN1Ln1sQErpmP0aB0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3CWEl%2FbtsqtbWnHK5%2FRrmCbeN1Ln1sQErpmP0aB0%2Fimg.webp&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;280&quot; height=&quot;333&quot; data-filename=&quot;111.webp&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;333&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;&lt;b&gt;아좌좌&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;억겁의 시간 동안 미루어왔던 블로그를 왜 이번에 시작하느뇨... 나름 열심히 개발 해왔던 개발자라고 생각했는데, &quot;나는 어떤 생각을 갖고 개발하는 개발자 입니다.&quot; 라고 설명하라고 하면 어버버. 나의 개발적 특성과 개발 필살기는 뭐냐면 어버버. 나의 강점과 약점, 아이덴티티 조차 한참을 생각해봤는데도 애매한 생각만 둥둥 뜨는 것에 충격을 받았던것 같다. 열심히 해왔건 말건 생각의 정리가 안되어 있으면 결국 스스로 객관화가 안되고 이는 나를 세일즈 할 때 불리한 스탠스를 점 할 수 밖에 없게 되는 것 같다. 생각을 일목요연하게 정리하고, 논리정연하게 글로 표현하는 방법을 연습하기 위해 (응 일단 나를 위해) 블..로..그.. 를 시작해보고자 한다. (과연 이 글을 쓰고 난 후, 언제 귀차니즘을 극복하고 포스팅 할 수 있을꽈ㅎ)&lt;/p&gt;</description>
      <category>개소리</category>
      <category>개발</category>
      <category>귀찮다</category>
      <category>블로그</category>
      <category>하기싫다</category>
      <author>spam.moon</author>
      <guid isPermaLink="true">https://mcp-dev.tistory.com/1</guid>
      <comments>https://mcp-dev.tistory.com/1#entry1comment</comments>
      <pubDate>Mon, 7 Aug 2023 23:25:25 +0900</pubDate>
    </item>
  </channel>
</rss>