제로부터 시작하는 Git(형상관리툴) 라이프 1

Git을 써야 하는 이유

형상관리 버전 관리에서 가장 우수하다고 여겨지는 것은 Git이라 할 수 있을 것이다. Git은 다음과 같은 특징이 장점으로 꼽히고 있다.

  1. 파일 단위로 변경 내용을 추적하며, 스테이지 후 커밋-푸시 과정을 거치며 파일 단위로 업로드할 수 있다.
  2. 중앙 서버 중심이 아니다. 분산 저장을 한다.
    • Git은 분명 원격 서버를 갖고 있지만, 서버와 연결되어 있지 않더라도 로컬 커밋까지는 무난하게 할 수 있다. SVN은 원격 서버 연결을 잃으면 일체의 커밋을 할 수 없다.
    • 로컬에 쌓인 커밋을 추후에 푸시하면, 서버와 동기화가 이뤄진다.
  3. 거의 대부분의 경우 충돌을 유연하게 해결할 수 있다.
  4. 소스 보관 및 복제용으로 활용할 수 있다.
    • Github가 git을 활용한 대표적인 공개 서비스로, 여기에 Public으로 올리면 무료로 소스 코드를 공개한 것이며, 누구든지 clone할 수 있다.
    • Git을 Clone하면 저장소의 역사와 내용이 통째로 복사되어 서버 유무와 무관하게 재업로드하여 역사를 이어갈 수 있다.
  5. 커밋이 용량을 크게 더욱 차지하지 않으며, 언제든지 되돌리거나 다른 커밋을 체크아웃할 수 있다.
    • Branch를 분기하여 사람들마다, 혹은 기능마다 나눠서 준비된 것만을 Merge하면 만들다가 만 기능탓에 컴파일을 할 수 없는 불편한 일이 사라진다.
    • 새로운 기능이 문제를 일으키는 것 같으면, 과거의 커밋을 꺼내올 수 있고, 다른 Branch로 갈아탈 수 있다.
    • Checkout을 하면, 로컬의 파일이 모두 변경되는데 그렇다고 커밋했던 기존의 파일이 사라지는 것 또한 아니다. 프로젝트 폴더 내용을 임시폴더처럼 부담없이 변경할 수 있다.

한편, 형상관리 버전 관리를 경험해보지 않은 사람은 “구글 드라이브나 카카오톡으로 압축하여 공유하면 되지”라고 생각하기 쉽다. 이는 다음과 같은 이유로 피해야 한다.

  1. 같은 파일이 다수 난립하여 선후 관계가 혼란스럽다.
    (최종.zip, 최종.zip (1), 최종-진짜.zip이 쌓여간다고 상상해보자. 극혐)
  2. 프로젝트 파일 전체를 압축하고 복사(업로드/다운로드), 해제하는 불필요한 과정으로 시간 낭비과 수고가 심하다.
  3. 매 순간 무엇을 변경하였는지 불투명하다.
  4. 이전에 되던 기능이 망가진 경우, 그 원인을 찾기란 무척 어렵다.
  5. 누군가 안 된다고 호소할 때, 그 사람의 파일이 최신으로 모든 파일 내용이 일치하는지 알 길이 없다.

Git을 쓰기 위한 준비

Windows 환경에서 Git을 쓰기 위해서는 크게 두 가지 유의할 점이 있다.

  • 클라이언트에서의 고민
    • Git을 명령어로 쓰겠는가?
      • Git 바이너리는 분명 명령 프롬프트나 bash 등에서 작동하는 CLI 앱으로, 사용하기에 불편하지만, GUI에 없는 기능을 쓰기 위해서 꼭 존재해야 한다.
      • 일부 GUI Git은 별도로 바이너리를 넣어줄 필요가 있지만, 대체로 GUI만 쓰는 경우 Git 또한 설치할 필요는 없다. 하지만 위 이유로 둘 다 깔면 좋다.
    • Git을 편하게 쓸 GUI를 선택하자.
      • SourceTree가 한글화 지원과 깔끔한 환경으로 널리 쓰이고 있다. 그러나 기능면에서 아쉬운 점이 있다.
      • GitKraken은 본 글에서 소개할 앱으로, 풍부한 기능과 막강한 시각화를 보여주고 있다. 그러나 영문만을 지원하고 있다.
      • TortoiseGit은 탐색기와 결합이 뛰어나나 기능이 많지 않고 직관적이지 못하다.
      • eclipse의 eGit, Visual Studio의 git 등 내부 소스 관리 플러그인을 활용할 수 있다. 하지만 최소한의 기능만을 제공하며 UI도 직관적이지 못해서 git에 대한 오해를 키울 수 있으며, 충돌 등 문제 해결이 어렵거나 불가능한 경우가 있다. 매우 비추천한다.
  • 서버에서의 고민
    • 누구든지 git 바이너리를 이용하여 git server를 셋팅할 수 있다.
    • github와 bitbucket과 같은 웹 git을 이용할 수 있다.
      • github: Public의 경우 무료. Private는 팀원당 7달러 비용
      • bitbucket: Public 무료. Private도 5명 이내인 경우에는 무료.
    • Synology NAS에 git을 깔아 쓰면 SSH 프로토콜로 접속하여 사용할 수 있다.

Git for Windows 다운로드

Linux 환경에서는 기본적으로 깔려있는 경우가 많고(Ubuntu 등), 필요시에도 단순한 명령으로 설치할 수 있다.

Linux Git 다운로드 페이지

Git을 컴퓨터에서 설정하려면

GUI만 쓴다면 필수 사항은 아니지만 git 커맨드 라인의 사전 설정을 해둘 필요가 있다.

우선 위 링크에서 파일 다운로드를 모두 마치고 설치한다. PATH 설정이 적용되기 위해서는 켜져 있는 명령 프롬프트를 모두 종료한 다음 다시 켜고, 필요한 경우 시스템 재시작도 도움이 된다.

다음과 같은 메시지를 보았다면, 경로가 제대로 등록되지 않은 것이다.

> git
'git' is not recognized as an internal or external command,
operable program or batch file.

이렇게 뜨면 성공한 것이다.

> git
usage: git [--version] [--help] [-C ] [-c name=value]
           [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
            []

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help ' or 'git help '
to read about a specific subcommand or concept.

이제 기본 사용자 설정을 해보자. 아래 명령 한 번만 내려주면 커맨드 라인에서 git commit시 항상 먼저 설정된다.

> git config --global user.name "My Name"
> git config --global user.email [email protected]

한 번 쓰면 계속 쓰게 되는 GitKraken

나머지 기능은 이어서 적어보도록 하겠습니다.

SCIT Schedule Hi

SCIT Schedule Hi (2018)

SCIT Schedule Hi
SCIT Schedule Hi

SCIT Schedule Hi는 SCIT Master 재학생이 편하게 자신의 지원 기업과 관련된 일정을 확인하고, 변동 사항을 알림으로 전달받을 수 있는 프로그램입니다.

개발 동기

SCIT 면접 시즌이 되자 학생들의 생활은 무척 불안해졌습니다. 불안한 마음을 안고 시설내 사이트에서 F5를 연타하면서 캘린더를 확인하는 모습은 전혀 자기 개발적이지 못하다는 생각이 쌓여갔습니다. 접속하지 않고도, 앱을 켜는 것, 아니 컴퓨터를 켜는 것만으로 자신의 새로운 일정을 확인할 수 있다면 훨씬 편할 것이라는 생각을 하게 되었습니다. 그러면 GET 1회와 POST 1회 도합 2회 요청이 단 1회로 줄어들고, 더 짧은 기간에 갱신도 가능하게 됩니다. 폴링도 훨씬 가볍고, 시설 입장에서도 트래픽을 절감할 수 있겠지요.

개발 언어 및 도구

  • Language: C#
  • Tool: Visual Studio 2017
  • Template: WPF Application

Read More

알고리즘 탐구 – 인접한 원소의 위치 구하기

문제

U < V < W 또는 U > V > W일 때, 정수 V는 U와 W 사이에 있다.

비어 있지 않은 배열 A는 주어진 N개의 정수로 이뤄져 있는데, 숫자의 인덱스 (P, Q) 짝은 0 ≤ P < Q < N인 인접한 수가 A[P]와 A[Q] 사이에 없으며, A[P]≠A[Q]임을 나타낸다. 예를 들어, 배열 A에서는:

A[0] = 0
A[1] = 3
A[2] = 3
A[3] = 7
A[4] = 5
A[5] = 3
A[6] = 11
A[7] = 1

다음 인덱스 짝은 인접한 값을 갖고 있다.

(0,7), (1,4), (1,7), (2,4), (2,7), (3,4), (3,6), (4,5), (5,7)

예를 들어, 인덱스 4와 5는 인접한 값을 갖고 있는데, 왜냐하면 A[4] = 5와 A[5] = 3는 다르며, 배열 A에는 그 사이에 들어갈 값이 없다는 것이다. 즉, 숫자 4만이 사이에 들어갈 수 있으나 배열에 존재하지 않는다.

주어진 두 인덱스 P와 Q의 거리는 X ≥ 0에서는 abs(X) = X, X < 0에서는 abs(X) = -X일 때  abs(P-Q)로 정의된다. 예를 들어, 인덱스 4와 5 사이 거리는 1인데, 그 이유는 abs(4-5) = (5-4) = 1이기 때문이다.

함수를 작성하라:

class Solution { public int solution{int[] A); }

주어진 비어 있지 않은 배열 A는 N개의 정수로 이루어져 있으며, 인접한 값을 가진 배열의 가장 긴 거리를 반환한다. 이 함수는 인접한 인덱스가 없는 경우 -1을 반환해야 한다.

예를 들어, 주어진 배열 A는 다음과 같다:

A[0] = 1
A[1] = 4
A[2] = 7
A[3] = 3
A[4] = 3
A[5] = 5

이 함수는 다음 이유로 4를 반환해야 한다:

  • 인덱스 0과 4는 인접해있는데, 그 이유는 A[0] ≠ A[4]이며 배열이 A[0] = 1과 A[4] = 3 사이의 값을 갖고 있지 않기 때문이다.
  • 이들 인덱스의 거리는 abs(0-4) = 4이다.
  • 더 큰 수의 거리를 지닌 다른 인접한 인덱스 짝이 없다.

다음과 같이 가정한다:

  • N은 [1..40,000] 범위 내에 있다.
  • 배열 A의 각 요소는 정수이며, 범위 [-2,147,483,648..2,147,483,647] 내에 있다.

복잡도:

  • 기대되는 최악의 경우 시간 복잡도는 O(N*log(N))이다.
  • 기대되는 최악의 공간 복잡도는 O(N)이며 입력 공간 이후를 말한다 (입력 기호에 필요한 공간은 포함하지 않는다)

발상

  • 왼쪽부터 찾아서 그 값의 다음 인접한 수를 찾는 식으로 반복할까?
    • N개의 항목에 대해 반복하면서 N-1개의 반복을 다시 해야만 한다.
    • 더 좋은 방법이 있을 것이다.
  • 소트를 먼저 한 다음에 낮은 수부터 올라가면서 맞춰볼까?
    • 소트 알고리즘은 검증되어 있는 내부 라이브러리를 활용하면 더 좋을 것이다.
    • 같은 수를 건너뛰면 반복문이 한층 더 빠를 것이다.
    • 하지만 정렬하면 원래의 위치를 잃어버리잖아?
      • 원래의 위치는 왼쪽부터 차례로 원시적인 방법으로 찾으면 된다.
      • 찾는 순간 루프를 탈출하면 속도는 더욱 빠를 것이다.

풀이

import java.util.ArrayList;
import java.util.Arrays;

public class Question {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//int[] A = new int[] {0,3,3,7,5,3,11,1};
		//int[] A = new int[] {1,4,7,3,3,5};
		//int[] A = new int[] {1,1,1,1,1,1,1,1};
		
		//랜덤한 40000개의 int를 넣는 부분
		int[] A = new int[40000];
		for(int i = 0; i < A.length; i++) {
			A[i]=(int)Math.round(Math.random()*2147483647*2-2147483647);
		}
		
		//시간 계산 시작
		long startTime = System.nanoTime();
		System.out.println("Result: "+solution(A));
		System.out.println("Elapsed Time: "+(System.nanoTime()-startTime)/1000000.0+"ms");
	}
	
	private static int indexOfArray(int[] A, int val, boolean reverse) {
		if(reverse) {
			//뒤에서 찾기
			for(int i = A.length-1; i >= 0; i--) {
				if(A[i]==val) {
					return i;
				}
			}
		} else {
			//앞에서 찾기
			for(int i = 0; i < A.length; i++) {
				if(A[i]==val) {
					return i;
				}
			}
		}
		return -1;
	}
	
	private static int findPairDistance(int[] A, int min, int max) {
		//왼쪽 오른쪽 각각 min, max 검색
		int aleft = indexOfArray(A,min,false);
		int aright = indexOfArray(A,min,true);
		int bleft = indexOfArray(A,max,false);
		int bright = indexOfArray(A,max,true);
		return Math.max(Math.abs(aleft-bright),Math.abs(aright-bleft));
	}
	
	public static int solution(int[] A) {
		//소트 후 중복 제거
		int[] sorted = A.clone();
		Arrays.sort(sorted);
		/*for(int i = 0; i < sorted.length; i++) {
			System.out.print(sorted[i]+",");
		}*/
		//ArrayList alSel = new ArrayList<>();
		int max = -1;
		for(int i = 1;i < sorted.length; i++) {
			//전항과 현재항의 차이
			int cha = sorted[i]-sorted[i-1];
			if(cha >= 1) { //차이가 1 이상이면 정수 변화로 보고 계산
				//alSel.add(sorted[i-1]);
				//findPairDistance(A,A[i-1],A[i]);
				max = Math.max(max, findPairDistance(A,sorted[i-1],sorted[i]));
				//두 값에 대한 좌우 검색 최대 거리를 구한 다음 max보다 클 때만 기록
				//System.out.println(String.format("값: (%d,%d), 거리: %d",sorted[i-1],sorted[i],findPairDistance(A,sorted[i-1],sorted[i])));
			}
		}
		
		
		return max;
	}

}

IIS에서 cipher 보안 개선하여 SSLLabs 고득점 노리기

IIS 의 SSL은 안전하지 않다?

Windows 10 1607, 그것도 Server 2016 1607이라는 나름대로 최신1 버전을 사용중이면서 IIS 를 지난 게시물에서 세팅한 바 있습니다. 그러나 그런 과정을 거쳐서 Let’s encrypt를 설정했는데도 불구하고 뭐가 부족했는지 SSLLabs에서는 가차없는 점수를 주었네요. 무엇이 문제일까요?

RC4를 써서는 안 되는 이유

RC4 암호화는 1987년 설계된 스트림 암호입니다. 스트림 암호인 만큼 빠르게 적용할 수 있고, 그간 널리 쓰여온 바가 있지만 이제는 사용을 권하지 않는다고 합니다. 다양한 취약점이 발견되었으며, 암호의 복잡도가 충분히 높지 않아서 무력화되기 쉬우며, 이 취약점이 바로 무선랜 암호화인 WEP를 신용할 수 없게 하는 주요 원인이기도 합니다. 그래서 새로운 SSL 프로토콜에서는 도입되지도 않았으며, 그런 낡은 것을 IIS 는 여전히 지원한다는 점에서 HTTPS 보안에 대한 점수를 크게 감점하게 된 것입니다.

Cipher 선택에 따라 좌우되는 보안

SSL에 대한 그간의 글에서 언급하였던 보안 사이퍼(cipher)는 암호화 방법을 의미합니다. 서버가 암호화할 줄 알아야 하겠지만, 클라이언트도 복호화할 줄 알아야만 올바르게 정보를 전달할 수 있을 것입니다. Cipher는 암호화 알고리즘으로 정의되며, 그 종류는 무척 다양합니다. 개중에는 최신식 고급 보안을 가진 것도 있는가 하면, 옛날부터 쓰던 것이라 취약점이 알려질대로 알려진 낡은 것도 있습니다.

물론 가장 최신의 알고리즘을 쓰면 더욱 안전한 건 당연하겠지만, 모든 브라우저를 만족시킬 수 없기 때문에, 옛날 OS에서는 에러 메시지만을 보게 될 것입니다. 그런 점을 고려하여 호환성과 안전 두 가지의 균형점을 갖춰보고자 합니다. 즉, 이 글은 조금 더 실용적으로 포장된 기존의 글 재탕으로 보셔도 될지 모릅니다.

IIS 에서 Cipher 선택하기

[시작]→[실행]을 들어가서 ‘gpedit.msc’를 실행하면 그룹 정책이 뜹니다. 그룹 정책에서 다음 경로로 들어갑니다.

컴퓨터 관리\관리 템플릿\네트워크\SSL 구성 설정

SSL Cipher Suite Order 항목을 눌러서 ‘사용’을 누르면 아래 입력칸이 한 줄로 있습니다. 한 번 기본값 전체를 살펴보겠습니다.

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
TLS_RSA_WITH_RC4_128_SHA,
TLS_RSA_WITH_RC4_128_MD5,
TLS_RSA_WITH_NULL_SHA256,
TLS_RSA_WITH_NULL_SHA,
TLS_PSK_WITH_AES_256_GCM_SHA384,
TLS_PSK_WITH_AES_128_GCM_SHA256,
TLS_PSK_WITH_AES_256_CBC_SHA384,
TLS_PSK_WITH_AES_128_CBC_SHA256,
TLS_PSK_WITH_NULL_SHA384,
TLS_PSK_WITH_NULL_SHA256

RSA + PSK WITH NULL 있는 거 실화냐 / ECDSA랑 AES 붙을 때 자신감 있는 NULL

후순위이긴 하나 RC4는 물론 별다른 암호화가 없는 것으로 보이는 것도 보입니다. 이것이 보안의 허점을 노출하는 것으로 봐도 무방하겠습니다.

Windows에서 제안하는 변경점

Windows에서도 관련된 정보를 공개하고 있습니다. 여기 서술대로라면, 일단 크게 봐서 두 가지에 주의해야 합니다.

  • 일부 cipher는 HTTP/2 버전 연결을 미지원하므로 통신에 실패합니다. HTTP/1.1보다 HTTP/2가 지원하는 브라우저에선 서버 연결 속도에서도 압도적으로 낫기에 충분히 고려해봐야 합니다.2
  • SCH_USE_STRONG_CRYPTO시 Yes 되어 있는 것은 안전한 것으로 보고 있습니다. 그러나 여기서 Yes여도 SSLLabs의 깐깐한 판단으로는 WEAK에 속할 수 있습니다.

여기서 SCH_USE_STRONG_CRYPTO가 Yes인 것만 골라서 넣어보겠습니다.

TLS_PSK_WITH_AES_256_GCM_SHA384,
TLS_PSK_WITH_AES_128_GCM_SHA256,
TLS_PSK_WITH_AES_256_CBC_SHA384,
TLS_PSK_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256

그리고 다시 SSLLabs 테스트를 받으니 여전히 WEAK 판정은 존재합니다. RC4를 없애니 랭크도 A로 올랐군요.

문제가 된 cipher를 추려내보겠습니다.

TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA

해당 cipher를 제거하고 넣으면 되겠군요. 추가적으로 최신 브라우저의 우선순위에 맞게 순서를 재배열하였습니다.

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_PSK_WITH_AES_256_GCM_SHA384
TLS_PSK_WITH_AES_128_GCM_SHA256
TLS_PSK_WITH_AES_256_CBC_SHA384
TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256

HSTS 설정을 올바르게 하면 점수가 오를 것이다

이제 Cipher를 무결하게 만들고, 마지막 단계로 HSTS 설정을 하여 A+를 노려보겠습니다.

SSL이 강제될 사이트에서 HTTP Response Headers를 들어갑니다.

[Add…]를 눌러서 새로운 항목을 추가합니다.

다음과 같이 Strict-Transport-Security를 지정합니다. 이 값을 지정하고 헤더로 전송되면, 사용자 클라이언트 브라우저에선 향후 이 사이트에 대한 요청을 반드시 HTTPS로만 하게 되며 더욱 안전한 통신이 가능해집니다.

단, 추후 인증서를 해지하거나 만료되면 사이트에 아예 접속할 수 없을 수 있으니 이 설정에 유의하고 인증서가 없어지거나 만료되지 않도록 갱신 및 관리에 항상 신경써야 합니다.

Name: Strict-Transport-Security
Value: max-age=31536000

SSLLabs는 최소한 120일(10368000초) 이상 주어야 한다고 하며, 이상적인 값은 1년(31536000초)라고 합니다.

또한 평문 전송시 이러한 값을 전송해서는 안 되므로, redirect 전용 사이트 하나를 만들고 SSL 전용 사이트로 지정한 메인 사이트에서만 이러한 설정을 하는 것이 좋겠습니다.

저런, A+가 아직 나오지 않았어요

IIS의 한계랄까 안타까운 부분입니다. 이 부분에 대한 대응을 또 하나씩 해봅시다.

  • SHA1과 RC4 등 RC가 Cipher에 없음을 확인했습니다.
  • OCSP Stapling은 기본적으로 IIS가 챙기는 부분으로 별도의 설정은 불필요합니다. 다만, Must Staple 옵션을 적용할 방법이 보이지 않는군요.
  • Forward Secrecy는 ECDHE와 DHE를 지원한다면 저절로 robust support 될 것입니다.
  • TLS_FALLBACK_SCSV: 브라우저가 폴백(차선책) 시도를 할 수 있게 하여 구식 보안으로 다운그레이드하여 보안성을 약화시키는 것을 방지하는 기능입니다. 적절히 처리하지 못하면 POODLE 공격으로 이어질 수 있는데요. 안타깝게도 이 기능은 IIS에서 지원되지 않습니다.
    • 대신 TLS1.2 버전을 단독 지원함으로써 낮은 버전의 보안 연결을 원천적으로 봉쇄할 수 있습니다.
    • TLS1.2만 허용하게 되면서 버려지는 지원 기기의 예시는 다음과 같습니다.
      • Android 4.3 이전의 기기들
      • Baidu 2015년 1월 이전 버전
      • XP의 IE63~IE8
      • Vista의 IE7~IE8
      • Windows 7의 IE8~IE10 (Windows 7 현재 최신은 IE11)
      • Windows Phone 8.0의 IE8
      • Java 6, Java 7
      • OS X 10의 Safari 6.x

이 조치의 결과 A+를 획득하는데 성공했습니다. 그러나 버려지는 기기가 너무 많은 게 흠인 것 같습니다.

HangmanAndroid (2018)

HangmanAndroid는 인터넷에 연결된 상태에서 서버측과 통신하여, 접속한 모든 사람들과 동시에 단어 문제를 풀어 맞추는, 행맨 게임 형식의 안드로이드 앱입니다.

개발 동기

SCIT 마스터 제 3회 개인 프로젝트

BokunoVoca 개발로 단어 학습 프로그램에 대한 가능성과 동시에 아쉬움도 느꼈습니다. 여기서 네트워크 기능을 적극적으로 접목하면 더욱 재미있는 기능을 만들 수 있을 것이라는 기대가 커졌습니다. 특히 Spring과 Android의 조합으로 HTTP 통신으로 구성할 수 있다면, 그 역량은 더욱 커질 것이라 봤습니다. 마침 Wordament라는 기존의 Microsoft Studio 게임이 떠올라서 그런 형식으로 전세계인이 동시에 즐길 수 있는 게임을 한 번 만들어보자는 발상을 하기에 이르렀습니다.

개발 언어 및 도구

  • JAVA, Android
  • Android Studio
  • Android SDK API 23 (Marshmallow)

Read More

Windows Server IIS를 ASP 원격 배포 가능하도록 만들기

Java를 해보신 분이라면 Spring MVC로 Apache Tomcat에 한방에 올라가는 Eclipse의 연동된 환경이 꽤나 매력적으로 느껴지셨을 겁니다. 요즘은 파일 하나하나를 FTP로 업로드하기보단 패키지로 만들어서 설치하듯이 한 덩어리로 사이트를 구축하는 것이 관리하기도 편하고, 문제가 발생할 소지도 적어서 더 널리 쓰이는 게 아닌가 생각이 들 정도입니다.

이 글은 IIS에서 ASP 원격 배포가 가능하도록 설정하는 방법을 제시합니다.

준비물

  • Windows Server 2012 이상의 서버 OS
    • 당연히 IIS 역할이 추가되어 있어야 합니다.
    • Windows 8.0, 8.1 미지원으로 문서에 나와 있는데, Windows 10에서도 관련된 권한 옵션을 제공하는지 확인하지 못했습니다.
  • Web Deploy 설치 파일 (.msi)
  • 개발용 PC의 경우 Visual Studio 2017 Community 이상
    • 패키지를 만들어서 제공할 수 있는 다른 컴퓨터입니다.

순서

서버 역할 추가하기

서버 관리자에서 역할 및 기능 추가를 눌러줍니다.

IIS 관리 도구를 모두 선택해서 설치해줍니다. 이걸 먼저 해줘야 별탈이 없더군요.

Web Deploy 설치하기

Web Deploy 소프트웨어를 설치합니다. Web PI에서 3.5, 3.6 버전을 손쉽게 설치할 수 있습니다만, 이걸로 많은 문제가 발생합니다.

가장 흔한 게 접속 테스트에서 404, 550 같은 문제가 발생한다는 것입니다. 필요한 구성요소가 기본으로 선택되지 않은 채 설치가 진행되기 때문입니다.

그런 염려를 덜기 위해서는 직접 위 준비물 단락에 있는 링크에 들어가서 msi 파일을 다운받아 설치를 진행할 필요가 있습니다.

설치 마법사에서 모든 구성 요소 설치를 필히 선택해주세요. 설치가 완료되면 서버를 한 번 재부팅할 필요가 있습니다.

IIS 메뉴부터가 달라지거든요.

IIS 추가 설정

재부팅은 무사히 하고 오셨습니까? IIS에서 할 일이 좀 더 남았습니다.

모든 것이 순조롭게 설치되었다면, 관리 서비스 위임(Management Servicec Delegation) 항목이 설치되었을 겁니다.

지금은 이 항목에서 할 일은 없습니다.

내가 관리할 사이트를 (만들거나, 기존의 것을) 선택하여 마우스 우클릭으로 메뉴를 펼치고, [배포(Deploy)]→[웹 배포 게시 설정(Configure Web Publish Deploying…)]을 누릅니다.

여기서 게시 권한을 지정하고 설정하면 이 사이트에 대한 배포를 수용할 수 있게 됩니다.

사이트 설정이 완료되면 관리 서비스(Management Service)로 들어갑니다.

ID 자격 증명을 적합하게 설정하고 인증서도 https에서 쓸 수 있도록 올바른 것을 골라줍니다.

자신의 도메인 이름과 일치한 인증서를 사전에 발급받았다면 더욱 편리하게 설정할 수 있겠지요.

접속 테스트

올바르게 설정했으면 Visual Studio에서 접속을 확인해봅니다.

솔루션의 프로젝트 메뉴에서  [게시(Publish)…]로 진입합니다. 이미 게시한 적 있으면 저장된 프로필이 뜹니다.

타겟 방법은 IIS로 합니다.

Web Deploy를 선택하고 서버(IP / 호스트 이름), IIS 메뉴로 보이는 사이트 이름(기본 사이트), 유저명, 비밀번호, 목표 URL을 입력합니다.

목표 URL은 연결에 영향을 주지 않지만 미리보기 주소로 활용되는 듯 합니다.

[연결 테스트 (Vaildate Connection)] 버튼을 누르면, 상기 설정에 문제 없을 경우 통신 성공 여부가 뜹니다.

방화벽 설정

혹시 접속에 실패하는 경우 Windows 방화벽이 방해하고 있을 수 있습니다. 상기 항목이 제대로 옵션이 켜져 있는지 확인해봅시다.

테스트 프로젝트 배포

일반적인 문제 해결 방법

  • Web Deploy를 재설치하거나 업그레이드하는 경우, 관리 명령 프롬프트에서 다음과 같은 명령을 실행하여 핸들러와 에이전트를 다시 실행합시다.
    • net stop msdepsvc & net start msdepsvc
    • net stop wmsvc & net start wmsvc
  • 경로상에 있는 방화벽이 통신을 방해하지 않아야 합니다. Web Deployment Agent Service는 일반적으로 80포트를 쓰며, Web Management Service는 8172 포트를 씁니다.
  • MsDepSvc는 Administrator 또는 도메인의 Admin 그룹에서 실행되어야 합니다. 로컬 계정에서는 정상적으로 작동하지 않습니다.
  • .NET 4.0이 IIS에 등록되지 않았을 수 있습니다.
    • .NET 4.0이 설치되었으나 IIS 서비스 풀에 등록되지 않았을 수 있습니다. 그 원인은 .NET 4.0이 IIS 설치 전에 깔려 있지 않았기 때문입니다.
    • 다음 명령을 실행하여 해결합니다.
      • %systemdrive%\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -iru

결론

Spring 부럽지 않은 일사천리 개발 환경이 갖추어졌습니다. SQL도 한방에 연결할 수 있는 것 같은데 관련된 정보를 더 많이 알아봐야 활용이 편리할 것 같습니다.

IIS 7에서 LetsEncrypt 설정하기

LetsEncrypt 는 무료 인증서 발급으로 https 확산에 혁혁한 공을 세운 단체입니다.1

특히 Certbot이라는 훌륭한 도구 덕분에 Linux 계열에서 Apache를 쓰든 Nginx를 쓰든 상관 없이 명령 몇 줄로 인증받는 시대가 열렸습니다.

그러나 윈도우에서는 공식적으로 LetsEncrypt 설치를 하는 방법이 제공되지 않습니다. 하지만 소스가 충분히 공개되어 있기에 누구든지 LetsEncrypt 인증 서버에 인증을 요청하고 인증서를 발급할 수 있습니다.

그러면 그냥 명령 쳐서 발급받으면 되잖아.

라고 하기엔 LetsEncrypt 인증서의 기간이 90일 이내로 짧기 때문에 자동 실행으로 갱신받아야만 하고, 그런 일을 대신해줄 프로그램은 필수입니다.

그런 역할을 해줄 프로그램을 소개해볼까 합니다.

Certify The Web

https://certifytheweb.com/

현재는 3.0.11 Stable 버전과 4.0의 Alpha 버전으로 나뉘어 있습니다. Alpha4가 문제가 있어서 Alpha3로 재공개했다는군요.

설치는 꽤 빠르게 이루어집니다.

메인 화면은 이렇게 생겼습니다.

바로 New Certificate를 눌러서 새로운 인증서를 발급해봅시다.
참고로 정식 버전이 아닌 경우에 상용으로 쓰지 말라고 경고가 여러 차례 뜹니다.

 

LetsEncrypt측에 전달할 나의 이메일을 적습니다.

만료 시기 도래 등 인증서에 특이사항이 있을 경우 향후 알려줄 수 있습니다.
이 기능은 리눅스 콘솔 버전 certbot과 완전히 동일하군요.

 

현재 IIS에서 작동중인 사이트를 선택합니다. 여러 곳에 쓰고 싶다면 여러 사이트를 모두 선택해도 되고, 사이트 선택 없이 발급만 할 수도 있습니다.
Request Certificate 버튼을 누르면 인증서 발급이 완료됩니다. Settings에 들어가서 갱신 일정도 올바른지 확인하세요.

이렇게 하면 IIS의 SSL 인증서에 LetsEncrypt가 올라가는 것을 확인할 수 있고, 향후에도 간단하게 변경할 수 있습니다.

단순히 HTTPS 통신에만 쓰는 것이 아니라, 원격 배포 기능과 FTP SSL 등 인증서가 필요한 분야가 많이 있으므로 폭넓게 활용할 수 있겠습니다.

한계

무료 버전은 5개의 사이트만을 관리할 수 있습니다. 프로 라이센스로 3개 사이트 더 추가하려면 약 50달러, 엔터프라이즈 라이센스로 100개 사이트 더 추가하려면 349달러네요. 여러 개 구매도 가능하다니 프로에 프로를 끼얹어도 되겠습니다.

문제 해결

  • 테스트 버튼을 눌러봤는데 실패할 수 있습니다. 외부 접속 체크시 DNS 확인이 올바르지 않을 수 있습니다. 인터넷 상황이 문제 없고 포트 바인딩이 되어 있으며 경로에 방화벽이 가로막지 않고 있다면, 과감히 Request Certificate를 눌러보세요.
  • 그 외에 Cloudflare 같은 DNS 서비스를 이용하고 있다면,  API Key를 발급받아서 넣고 이 앱에서 DNS-01 방식으로 체크를 요구할 수 있습니다. 이렇게 하면 서버의 파일 저장 공간에 임시 acme 테스트 없이 더 빠르고 문제 없이 도메인 소유 및 매치 여부를 확인할 수 있습니다. 와일드 카드 인증서(4 버전 이상) 발급시 DNS 인증이 필요할 것입니다.

Windows 2016 서버 구축

Windows Server 2016

은 제가 한 게 아닙니다. 그냥 저렴하게 샀어요. (클라우드의 시대! 관련 정보)

지금까지는 리눅스의 Ubuntu, CentOS 등에서 서버 구축을 LEMP 절차에 따라 진행해서 성공적으로 셋팅해왔죠. 허나 윈도우는 또 다른 도전입니다.

앞으로 무엇이 가능할지 더 찾아봐야겠습니다.

우선 IIS로 정통 셋팅하는 방법을 진행중입니다.

realLyrics / realLyrics+ 레알가사 (2011)

realLyrics playing screen
realLyrics

레알가사는 온라인 알송(ESTSoft의 앱) 서버에서 가사를 검색하여 사용자가 듣고 있는 음악과 싱크를 맞추어 표시해주는, Windows Phone용 음악 플레이어 앱입니다.

개발 동기

새로운 Windows Phone 7.5 Mango가 출시되어, 한국에도 출시될 조짐이 있을 무렵, 해외에서 구한 Samsung Omnia 7은 메탈 재질에 블랙 디자인, AMOLED를 갖고 있어서 아주 만족스러웠습니다. 하지만 사용할 앱이 없다는 치명적 상황 탓에, Windows Phone 스토어라는 무주공산을 차지하고자 야심차게 도전해보았습니다.

Zune의 디자인 코드를 이어받은 Windows Phone의 Metro Design은 영감의 보고였는데, 플레이어만큼은 기능이 너무 절제되어 있었습니다. 따라서, 기능을 보강하면서, 그 디자인 언어를 해치지 않는 방식으로 진행하고자, 가사를 보여주는 애플리케이션을 만들어보기로 결정했습니다.

개발 언어 및 도구

  • C# / XAML
  • Microsoft Visual Studio 2010
  • Windows Phone 7.1 SDK

Read More