SMALL
  • SSL 이란
    • SSL 동작 과정
  • HTTPS 프로토콜 사용을 위해서 Keystore, Truststore 만들어보기

SSL(Security Socket Layer) 

Netscape라는 회사에서 서버와 브라우저 간 보안을 위해 만든 프로토콜

 

SSL은 CA(Certificate Authority)(인증기관)라 불리는 서드 파티로부터 

서버와 클라이언트(브라우저)의 인증을 하는 데 사용된다.

 

출처 : http://creator0609.tistory.com/entry/SSL-이란

HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜

( HyperText Transfer Protocol over Secure Socket Layer )

여기서 사용하는 데이터 암호화가 SSL이다.

 

HTTPS의 동작 과정

그럼 다음으로 SSL 보안 프로토콜을 사용하는 HTTPS의 동작 과정을 살펴보자.

 

출처 : https://preamtree.tistory.com/38

크게 3가지 파트로 구분할 수 있다.

  • 서버
  • 클라이언트(브라우저)
  • 인증기관

 

서버에서는 HTTPS 프로토콜을 지원하기 위해서는 미리 준비해야 하는 과정이 있다.

1. 서버의 공개키, 비밀키 생성

2. 인증기관에게 인증서를 요청 ( 서버의 공개키 정보, 서버의 정보를 인증기관에게 전송 )

  - 인증기관은 서버로부터 받은 정보를 기반으로 인증기관의 개인키로 암호화한 인증서를 서버에게 전송

 

이제 서버는 HTTPS 프로토콜을 지원할 준비가 되었다. 

( 서버의 공개키, 개인키 && 인증기관에 인증서 )

 

다음으로 클라이언트가 서버에 접속을 하는 경우 일어나는 상황을 살펴보자.

 

클라이언트가 SSL로 암호화된 페이지를 요청한다(https)

서버는 공개키를 인증서와 함께 전송한다.

클라이언트는 인증서가 자신이 신용 있다고 판단한 인증기관으로부터 서명된 것인지 확인한다.

검증을 하여 신뢰가 가능하다면

클라이언트는 서버로부터 받은 공개키로 URL, 데이터들과 자신의 대칭키를 암호화 하여 전송

서버는 비밀키로 요청을 복호화하고 전달받은 대칭키로 응답을 암호화해서 전송

 

HTTPS 프로토콜 사용을 위해서 Keystore, Truststore 만들어보기

그럼 이제 SSL, SSL 동작 과정을 알았으니 실제 WebServer에서 https 프로토콜을 사용하기 위한 Keystore, Truststore를 생산하는 과정을 살펴보자. 

java에서 제공하는 keytool 유틸을 이용해보자.

 

keystore ( 비밀키 ) 생성

keytool -genkey -alias sssl -keyalg RSA -validity 7 -keystore ./keystore

 

keystore를 이용해서 CSR(Certificate Signing Reuest) 파일 생성

keytool -export -alias sssl -keystore ./keystore -rfc -file ./sssl.cer

 

CSR(Certificate Signing Reuest) 파일을 이용해서 truststore(공개키) 생성

keytool -import -alias sssl -file ./sssl.cer -keystore ./truststore

 

위의 과정은 인증 기관으로부터 인증서를 받는 과정이 아닌 SSL key를 생성한다. 

인증 기관으로부터 인증서를 받기 위해서는 더 복잡한 과정이 추가된다. 

 

인증 기관으로부터 인증서를 받아 등록하는 과정

-> https://applejara.tistory.com/551

-> https://www.crosscert.com/symantec/board/tomcat5.pdf

 

추가적인 keytool을 이용해 ssl key 생성 방법 https://stackoverflow.com/a/41280603/9923340

 

 

 

LIST
SMALL

Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order.

각각 다른 숫자가 포함된 배열이 주어진다.

가능한 모든 순열을 반환하라.

어떠한 순서로든 가능하다.


가능한 모든 순열을 반환하는 문제이다.

Backtracking을 통해서 가능한 모든 조합을 탐색해 보도록 하자.

 

조건이 만족해서, 결과 list에 추가되는 부분

더 탐색할 하위 노드가 남아 하위 노드로 이동하는 부분으로 코드를 구분할 수 있다.

    public void backtracking(List<List<Integer>> rst, int[] nums, List<Integer> list) {
        if (list.size() == nums.length) { // 조건이 만족 하는지 확인
            rst.add(new ArrayList<>(list));
            return;
        }

        for (int i : nums) { // 더 탐색할 하위 노드 탐색
            if (!list.contains(i)) {
                list.add(i);
                backtracking(rst, nums, list);
                list.remove(list.size() - 1);
            }
        }
    }

 

그럼 다음으로 해당 코드를 호출해주는 부분을 살펴 보자.

    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> rst = new ArrayList<>();

        backtracking(rst, nums, new ArrayList<Integer>());
        return rst;
    }

 

 

출처 : https://leetcode.com/problems/permutations/

 

Permutations - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

LIST
SMALL

Given an integer array nums of unique elements, return all possible subsets (the power set).

The solution set must not contain duplicate subsets. Return the solution in any order.

 

중복되는 값이 없는 integer 배열이 주어진다.

가능한 모든 하위 집합을 반환하라.

해답에는 중복된 하위 집합을 포함하면 안 된다.

해답은 어떠한 순서도 상관없다.


가능한 모든 하위 집합을 반환하는 문제이다. 

Backtracking을 통해서 가능한 모든 조합을 탐색하고 조건이 만족하지 않는 경우는 패스해 보도록 하자.

여기서 조건이 만족하지 않는 경우는 이미 그전에 탐색에서 하위 집합에 포함된 원소이다.

 

    public void backtracking(List<List<Integer>> rst, ArrayList<Integer> list, int[] nums, int idx) {

        rst.add(new ArrayList<>(list));

        for (int i = idx; i < nums.length; i++) { // startIndex를 통해 이미 추가한 원소 필터링 
            list.add(nums[i]);
            backtracking(rst, list, nums, i + 1);
            list.remove(list.size() - 1);
        }
    }

그럼 다음으로 해당 메서드를 호출해주는 코드를 살펴보도록 하자.

    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> rst = new ArrayList<>();

        backtracking(rst, new ArrayList<Integer>(), nums, 0);
        return rst;
    }

 

 

출처 : https://leetcode.com/problems/subsets/

 

Subsets - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

LIST
SMALL
  • Backtracking에 대한 정의
  • DFS와 비교 

백트래킹은 '조합 알고리즘 문제'에 대해 모든 가능한 해를 나열하는 것이다.

모든 조합의 수를 살펴보는 것인데 단 조건이 만족하는 경우에만 해당된다.

출처 : https://www.programiz.com/dsa/backtracking-algorithm

즉 주어진 조합을 탐색 시 답이 될만한지 판단하고 그렇지 않으면 해당 조건은 탐색을 멈추고 가지치기를 하는 것이다.

완전 탐색에서 좀 더 효율적으로 유망성을 판단하고 가지치기를 수행한다.

 

완전 탐색 : 여러 개의 solution을 가진 문제에서, 모든 solution을 탐색하는 전략

DFS와 비교 

대표적인 완전 탐색 방법으로는 DFS (Depth First Search, 깊이 우선 탐색)가 있다.

DFS는 현재 지점에서 방문할 곳이 있으면 재귀 호출 또는 Stack을 이용해서 계속 이동한다. 

하지만 DFS는 모든 노드를 방문하기 때문에 굳이 목표지점이 있지 않는 경로로 빠져서 비효율적인 탐색을 수행할 수도 있다.

 

백트래킹은 DFS에 가지치기 (Pruning)를 통해 불 필요한 탐색을 제한하는 완전 탐색 기법이다.

가지치기를 얼마나 잘하느냐에 따라서 효율이 극대화될 수 있는 방법이다.

 

정리하자면, 백트래킹은 모든 가능한 경우의 수 중에서 특정한 조건을 만족하는 경우만 살펴보는 것이다.

 

LIST

+ Recent posts