전체 글
Data Structure - Graph ( Dijkstra && Bellman and Ford Algorithm )
Shortest Paths Path finding system은 그래프를 이용하는 시스템을 말합니다. Single Source / All Destinations : Nonnegative Edge Costs directed graph G=(V, E)에서 weighting function w(e)에서 source vertex v0을 바탕으로 a shortest path를 찾는 과정을 말합니다. 여기서 중요한 점은 w(e) > 0입니다. negative을 찾는 방법은 아래에서 다룹니다. 예를 들면 다음과 같습니다. v0에서 v1로 갈 수 있는 a shortest path는v0 -> v3 -> v4 -> v1이 됩니다. v0 -> v3이 아니라요. 이러한 a shortest path를 찾는 알고리즘을 소개합니다..
Data Structure - Graph ( MST )
Minimum Spanning Trees MST에서의 cost는 weighted undirected graph에서 sum of costs ( weights )를 말합니다. 또한 MST는 cost가 최소인 spanning tree를 말하게 됩니다. MST를 찾기 위해서는 3개의 알고리즘이 있습니다. Kruskal's, Prim's Sollin's algorithm이 있는데, 모드 greedy method에 기반되어 있습니다. MST에서의 제약조건을 말씀드리겠습니다. 여기에서는 우리는 무조건 edge를 사용해야 합니다. 또한 우리는 정확히 n-1 edge를 MST를 그리는데 사용해야 합니다. 우리는 cycle을 가지는 edge를 만들어 내면 안됩니다. Kruskal's Algorithm 신장 트리(Spann..
Data Structure - Graph ( Biconnected Components )
Biconnected Components articulation point란 G의 vertex v를 deletion했을 떄, 최소한 2개의 컴포넌트로 쪼개지면 이때의 vertex를 articulation point라고 한다. 이 떄 biconnected graph란 연결그래프인데 articulation point가 없는 그래프를 말합니다. 많은 그래프에서 articulation points는 탐탁치 않습니다. biconnected component는 maximal biconnected subgraph of G입니다. 즉 2개의 biconnected component에서 한개 보다 많은 공통된 vertex를 가질 수는 없습니다. 또한 biconnected component에서 하나의 edge는 2개가 들어..
[ Java Programming ] IOStream && FileStream
자바의 입출력 스트림 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터를 전달하는 객체 출력 스트림 : 자바 프로그램에서 출력 장치로 데이터를 보내는 객체 입출력 스트림의 기본 단위는 바이트이며, 단방향 스트림이고, 선입선출(FIFO)구조 입니다. 자바 프로그램 개발자는 직접 입력 장치에서 읽지 않고 입력 스트림을 통해 읽으며, 스크린 등 출력 장치에 직접 출력하지 않고 출력 스트림에 출력하면 됩니다. 또한 문자 스트림이란 문자만 입출력하는 스트림으로서 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못합니다. 문자가 아닌 데이터를 문자 스트림으로 출력하면 깨진 기호가 출력됩니다. JDK의 스트림 계층 구조 스트림 연결 이러한 스트림은 연결될 수 있다는 특징이 있습니다. 파일 입출력 /FileR..
[ Web Hacking ] - Cookie & Session
쿠키 클라이언트의 IP 주소와 User-Agent는 매번 변경될 수 있는 고유하지 않은 정보일 뿐만 아니라, HTTP프로토콜의 COnnectionless와 Stateless특징 때문에 웹 서버는 클라이언트를 기억할 수 없습니다. Connectionless, Stateless Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺습니다. Stateless : 통신이 끝난 후, 상태 정보를 저장하지 않는 것을 의미합니다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 있습니다. 이러한 HTTP에서 상태를 유지하기 위해 쿠키가 탄생했습니다. 쿠키는 key와..
[ Web Hacking ] - W31c0m3, w3b h4ck3rs!
HTTP 포트로 데이터를 교환하는 방식은 전송 계층(Transport Layer)의 프로토콜을 따릅니다. 대표적으로는 TCP와 UDP가 있습니다. TCP로 데이터를 전송하려는 서비스에 UDP클라이언트가 접근하면, 데이터가 교환되지 않습니다. 반대의 경우도 마찬가지 입니다. 그래서 서비스 포트를 표기할 때는 서비스가 사용하는 전송 계층 프로토콜을 같이 표기하기도 합니다. 예를 들어 HTTP의 서비스 포트가 TCP/80이라고 하면, HTTP서비스를 80번 포트에서 TCP를 제공하고 있다는 뜻입니다. HTTP 요청 HTTP 요청은 서버에게 특정 동작을 요구하는 메시지입니다. 서버는 해당 동작이 실현 가능한지. 클라리언트가 그러한 동작을 요청할 권한이 있는지 등을 검토하고, 적절할 때만 이를 처리합니다. HTT..
[ Security & Node ] JWT 구현
JWT Json Web Token의 약자로 전자 서명 된 URL-safe JSON입니다. JWT는 MSA의 인증, 인가에 사용할 수 있는 서명된 JSON이기 때문에 안성맞춤입니다. 서버측 부하를 낮출 수 있고 능률적인 접근 권한 관리를 할 수 있으며 분산환경에 더 잘 대응할 수 있습니다. 서버 기반 인증 기존의 인증 방식은 서버측에 유저 정보를 저장합니다. 대표적으로 세션이 이에 해당하고 필요에 의해 파일, DB등에도 저장할 수 있습니다. 일반적인 웹 어플리케이션 개발 시 이 방법을 사용합니다. 서버 기반 인증의 문제점 사용자 수가 늘어날 수록 세션에 담아야 할 정보가 함꼐 증가하기 때문에 메모리 과부화 문제가 발생합니다. 우리가 만드는 어플리케이션은 사요자가 많지 않기 때문에 문제가 될 것이 없지만 아..
[ Security ] 비밀번호 단방향 암호화
단방향 암호화(One-Way Encryption) 단방향 암호화란 한쪽 방향으로 암호화를 한다는 의미입니다. 즉 암호화만 가능하고 복호화는 할 수 없습니다. 그렇기 때문에 비밀번호를 관리할 때 유용하게 사용됩니다. 비밀번호 단방향 암호화 방식으로 저장하는 경우에는 패스워드 DB가 유출되어도 안전합니다. 패스워드를 검증할 때에는 사용자로부터 입력받은 비밀번호를 똑같은 방식으로 암호화하여 암호화된 패스워드끼리 비교를 하면됩니다. 유저가 비밀번호를 잊어버렸을 때는 찾기가 불가능합니다. 대신 비밀번호 변경 메일, SMS인증을 통해 새로운 비밀번호를 입력하도록 하면 됩니다. 대표적으로 많이 사용하고 있는 알고리즘은 SHA-256암호화 알고리즘입니다. 단방향 암호화 종류 해시(Hash) 알고리즘을 사용한다. MD5..
[ Node.JS ] Express-Session과 암호화
Cooie는 사용자의 정보가 웹 서버를 통해 사용자의 컴퓨터에 직접 저장되는 정보의 단위를 말합니다. 예를 들어 사이트에 접속을 했는데 "아이디와 비밀번호를 저장하시겠습니까?라는 창이 뜨면 사용자의 아이디와 비밀번호를 쿠키로 저장한다는 뜻입니다. 쿠키는 브라우저에서 임의로 바꿀 수 있습니다. 만약 아이디와 패스워드 같은 중요한 정보가 쿠키로 저장했다면 보안에 큰 문제가 있을 겁니다. 이러한 문제점을 해결하기 위해서 나온것이 Session입니다. Session이란? 세션은 쿠키보다 더 안전하고 많은 데이터를 저장하는 저장 방식입니다. 쿠키의 경우 데이터를 사용자의 컴퓨터에 저장하기 때문에 비밀번호 같은 민감한 부분이라도 예외없이 그대로 드러납니다. 하지만 세션은 데이터를 서버에 저장하기 때문에 쿠키보다 안..
Java Programming - Thread notify-wait()
다시 자바의 동기화 초리 방법에 대해 간단히 다시 짚고 넘어가도록 하겠습니다. 동기화 처리 방법 synchronized 메서드 자체에 동기화 처리 public synchronized void add() { ~ } 여러개의 Thread들이 공유객체의 메소드를 사용할 떄 메소드에 synchronized가 붙어있을 경우 먼저 호출한 메소드가 객체의 사용권(Monitoring Lock)을 얻습니다. 메소드 앞에 synchronized를 붙혀서 실행해 보면, 메소드 하나가 모두 실행된 후에 다음 메소드가 실행됩니다. 해당 모니터링 락은 메소드 실행이 종료되거나, wait()와 같은 메소드를 만나기 전까지 유지됩니다. 다른 쓰레드들은 모니터링 락을 놓을때까지 대기합니다. 동기화 블럭 synchornized(thi..