전체 글 78

<Node.js> module과 require 이해하기

Module과 require 이해하기 📌 1. Node.js 모듈 ES6에서는 Client-side JavaScript에서도 동작하는 모듈 기능을 추가하였다. 단 현재 대부분의 브라우저가 ES6의 모듈을 지원하지 않고 있으므로 ES6 모듈을 현재의 브라우저에서 사용하기 위해서는 SystemJS, RequireJS 등의 모듈 로더 또는 Webpack 등의 모듈번들러를 사용하여야 한다. ES6 모듈은 키워드 export, import를 제공한다. Node.js는 사실상 모듈 시스템의 사실상 표준(de facto standard)인 CommonJS를 채택하였고 현재는 독자적인 진화를 거쳐 CommonJS 사양과 100% 동일하지는 않지만 기본적으로 CommonJS 방식을 따르고 있다. Node.js 특징 No..

SERVER/Node.js 2022.02.25

XSS, CSRF 이해하기

XSS, CSRF 이해하기 📌 XSS(Cross-Site Scripting)란? 사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 주로 여러명의 사용자가 보게 되는 게시판에 악성 스크립트를 담은 글을 올리는 형태로 공격한다. 이를 통해 사용자의 쿠키나 세션을 탈취하거나, 자동으로 비정상적 기능을 수행하게 하는 등의 공격이 가능해진다. 공격 방법에 따라 Stored XSS와 Reflected XSS로 나뉜다. Stored XSS는 게시판처럼 사용자가 정보를 서버에 업로드하는 곳에 XSS공격이 담긴 데이..

System/네트워크 2022.02.20

<node.js> npm install할 때 Unable to resolve dependency tree 에러

📌현상 npm install 에서 unable to resolve dependency tree 에러가 발생했다. λ npm install mongoose-auto-increment npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: nodejs-dev-01@1.0.0 npm ERR! Found: mongoose@6.2.1 npm ERR! node_modules/mongoose npm ERR! mongoose@"^6.2.1" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR!..

SERVER/ERROR 2022.02.16

<MongoDB> E11000 duplicate key 에러 해결 방법

📌원인 "MongoError: E11000 duplicate key error collection:" 에러가 발생할 수 있습니다. 보통 db에 이미 컬렉션들이 있어서 발생하는 에러로 기존 database를 삭제한 후 restore 해주면 에러를 해결할 수 있습니다. 📌해결 방법 db자체를 깨끗하게 지운다. 또는 쿼리 작업중에 꼬인 경우 collection에서 인덱스를 제거함으로서 해결할 수 있다. db.dropDatabase() db.users.dropIndexes() ※ 전체 데이터를 삭제 하므로 기존 데이터는 반드시 백업하고, restore의 목적으로 사용 하셔야 합니다.

SERVER/ERROR 2022.02.16

<node.js> 80 포트로 들어오는 요청이 3000 포트로 전달 안될 때: iptables

📌 3000번 포트에서 80번 적용이 안될 때 리눅스로 들어오는 모든 요청은 iptables에 의해 정의된 규칙을 따라 처리되며, 우리는 이것을 이용해 외부에서 80 포트로 들어오는 요청을 리눅스 내부에서 사용되는 3000 포트로 전달하도록 규칙을 설정할 수 있습니다. 아래 명령어를 통해서 $ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000iptables를 이용하여 80번 포트로 라우팅을 시키고 브라우저 주소창에 포트를 없앴는데도 안되는 경우. iptables의 PREROUTING이 여러 번 적용되어 있는 경우 그럴수도 있습니다. 아래 명령어를 통해 iptables 등록 상태를 확인합니다. # 아..

SERVER/ERROR 2022.02.16

최단 경로 [플로이드 워셜]

최단 경로 [플로이드] 📌 플로이드 워셜 알고리즘 플로이드 워셜 알고리즘은 모든 정점에서 모든 정점으로의 최단 경로구하고 싶을때 사용합니다. 다익스트라 알고리즘은 가장 적은 비용을 하나씩 선택해야 했다면 플로이드는 기본적으로 거쳐가는 정점을 기준으로 알고리즘을 수행한다는 점이 특징입니다. 플로이드 알고리즘의 핵심 아이디어는 거쳐가는 정점을 기준으로 최단 거리를 구하는 것이다. 특징 D_ab = min(D_ab, D_ak + D_kb) a->b로 가는 최소 비용과 (a에서 노드k로 가는 비용 + 노드K에서 b로가는 비용)이 두 값중에 최소값으로 갱신합니다. 자기자신으로 가는 비용은 0 직접 연결되어있지 않은 경로는 무한대 입력 데이터N이 500이하로 들어올 때만 사용가능하다. 플로이드 알고리즘은 O(N^3..

최단 경로 [다익스트라]

최단 경로 📌 다익스트라(Dijkstra) 다익스트라 알고리즘은 다이내믹 프로그래밍을 활용한 대표적인 최단 경로(Shortest Path) 탐색 알고리즘입니다. 흔히 인공위성 GPS 소프트웨어 등에서 가장 많이 사용됩니다. 다익스트라 알고리즘은 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 알려줍니다. 다익스트라 알고리즘이 다이나믹 프로그래밍 문제인 이유는 최단 거리는 여러 개의 최단 거리로 이루어져 있기 때문입니다. 기본적으로 다익스트라는 하나의 최단 거리를 구할 때 이전까지 구했던 최단 거리 정보를 그대로 사용한다는 특징이 있습니다. 📌 그림 설명 한 번 다음 경우를 고려해봅시다. 1부터 다른 모든 노드로 가는 최단 경로를 구해야 합니다. 예를 들어 1에서 3까지 가는 최소 비용은 6입..

<binary search> 이진탐색

이진탐색 📌 이진탐색 1 ~ 50까지 오름차순 정렬된 카드 더미에서 28번 카드를 찾는 문제를 예시로 이분 탐색을 알아보겠습니다. 편의상 첫 번째 카드부터 i번째 카드는 v[i], 28은 val로 표기하겠습니다. 이 경우 결정 문제를 "v[i] >= val인가?"로 잡으면 결정 문제의 답은 i가 증가함에 따라 F, F, ..., F, T, T, ..., T와 같이 분포함을 알 수 있습니다. 이때 우리가 찾고자 하는 값은 처음으로 v[i] >= val인 지점, 즉 조건문이 처음 True가 되는 i값입니다. 정렬 등과 함께 가장 기초인 알고리즘으로 꼽히는 문제. 검색 범위를 줄여 나가면서 원하는 데이터를 검색하는 알고리즘이다. BigO : O(log N) 정렬된 자료를 반으로 나누어 탐색하는 방법 주의점 :..

DFS & BFS & 백트래킹

DFS & BFS & 백트래킹 1. 그래프의 표현방법 👉 이런 그래프라는 개념을 컴퓨터에서 표현하는 방법은 두 가지 방법이 있습니다! 1) 인접 행렬(Adjacency Matrix): 2차원 배열로 그래프의 연결 관계를 표현 2) 인접 리스트(Adjacnecy List): 링크드 리스트로 그래프의 연결 관계를 표현 인접 리스트로 많이 쓴다. 하지만 인접한 요소가 너무 많아서 검색하는데 O(n)이 걸릴 수 있다. 이런 경우 인접 행렬을 이용하면 O(1)의 복잡도로 검색할 수 있다. 📌 DFS 👉 DFS는 Depth First Search라고 한다.! 갈 수 있는 만큼 계속해서 탐색하다가 갈 수 없게 되면 다른 방향으로 다시 탐색하는 구조입니다. 이 말만 들어서는 방법이 안 떠오르니까, 한 번 구체적으로 실..

버블, 선택, 삽입, 퀵, 병합, 힙 정렬

정렬 알고리즘 버블 정렬 (bubble Sort) 버블 정렬은 뒤에서부터 앞으로 정렬을 진행하는 구조를 가지고 있다. 오름차순 정렬 기준으로 배열의 맨 뒷공간에 가장 높은 값을 보내고, 그 앞에 두 번째로 큰 값을 보낸다. 그래서 배열 내 값들을 앞뒤로 서로 비교하며 자리를 바꾸는 작업르 반복한다. 버블 정령은 큰 값들을 뒤에서부터 앞으로 하나씩 쌓아 나가기 때문에 원소가 자리를 잡을 때마다 정렬의 범위가 하니씩 줄어들게 도니다. 제일 작은 값을 찾아 맨 앞에 위치시키는 선택정렬과는 반대의 정렬 방향을 갖는다. 다른 정렬 알고리즘에 비하여 값의 swap이 비번하게 일어난다. O(n^2)의 시간 복잡도를 갖는다. 루프문을 통해 모든 인덱스에 방문해야 하므로 O(N)의 시간이 소모되고 또 인접한 원소와 대소..