일단 씻고 나가자
24.06.18 본문
2024. 06. 18 화요일
- [Java] Arrays.asList() 인자로 int[] 와 Integer[]을 각각 넣었을 때 차이?
: Arrays.asList()는 T... array 형태로 되어 있기에 객체만을 받을 수 있다. 따라서 Integer[]는 객체 원소를 list로 바꾸어주지만 int[]는 그 자체 배열 객체 하나만을 인식하여 변환한다.
- 이진탐색의 Lower/Upper Bound 설명? 차이? 알고리즘?
: 탐색 배열에서 중복된 값이 있을 때, 찾고자 하는 값이 중복된 값 중 하나일 경우,
중복된 값 중 가장 먼저 오는 자리를 구하는 것이 Lower Bound,
중복된 값 중 가장 나중에 오는 자리를 구하는 것이 Upper Bound이다.
알고리즘은 이진탐색과 같게 min, max와 mid 값을 조율하며 진행되며,
mid = (min + max) / 2로 계산되기에 max - min = 1일 경우 무한 루프에 빠지는 것을 방지하기 위해
어떤 경우든 [min = mid + 1] 하는 것과 min 관련 값으로 return 하는 것을 전제한다.
이 경우 min의 값을 늘려주는 것이므로 이진탐색 후 적합한 값에 도달하는 마지막 경로가 min과 max가 1 차이 이후 min +=1 이 되면서 min = max = target이 된다.
while(min < max)를 전제한다.
Lower Bound의 경우 mid가 정답이 되어도 같은 정답 값이 더 앞의 index에 존재할 수 있기에
if(mid > target) 일 때 min을 mid + 1로 조절해주고,
Upper Bound의 경우 mid가 정답이 되어도 같은 정답 값이 더 뒤의 index에 존재할 수 있기에
if(mid >= target) 일 때 min을 mid + 1로 조절해준다.
=의 의미는 mid = target일 때도 중복되는 값을 확인하겠다는 의미이기에 해당 반대 방향 쪽을 더 검사한다.
[1, 1, 1]일 때
Lower Bound는 중앙의 1을 무시하고 더 앞쪽의 탐색이 필요하기에
max 쪽에 =을 붙여주어야 max = mid가 되며 더 앞쪽을 탐색할 수 있고,
(max가 정답이어도 max를 줄여서 더 확인해보겠다)
Upper Bound의 경우엔 뒤쪽의 탐색이 필요하기에
min 쪽에 =을 붙여주어야 min = mid + 1 이 되며 더 뒤쪽을 탐색할 수 있게 된다.
(min이 정답이어도 min을 늘려서 더 확인해보겠다)
즉, 앞쪽의 탐색에는 (Lower Bound) 뒤(max)를 끌고 와야 하기에 max에 =를,
뒤쪽의 탐색에는 (Upper Bound) 앞(min)을 끌고 와야 하기에 min에 =을 붙여준다.
추가로 Upper Bound의 경우엔 최종 정답이 min이 아니라 min-1이 되어야 한다.
- SSL이란? 통신 과정?
: Secure Socket Layer. 과거 SSL을 TLS(Transport Layer Security)가 계승하여 최근엔 TLS로 쓰이지만, 통상 SSL 명칭을 많이 사용한다. 클라이언트, 서버 응용 프로그램의 통신에서 도청, 간섭, 위조를 방지하기 위해 데이터를 암호화하는 암호 규약이다. CA(Certificate Authority)에서 SSL 인증서를 발급받아 통신한다.
다음과 같은 과정으로 통신한다.
특정 키로 암호화하면 반대편의 키로 복호화한다 (공개 <-> 비밀)
(파란색 : 공개 키, 빨간색 : 비밀 키, Lock : 앞의 단 키로 암호화됨,
보라색 : 대칭 키, 실제 SSL을 활용하기 위한 암호, 복호화 키)
1. [CA] 공개/비밀 키를 보유 중이며, 공개 키는 기본 내장 혹은 인터넷에서 확인 가능
Client | Server | CA [CA] |
CA |
2. [Server] 공개/비밀 키를 발급
Client | Server [S, S] | CA [CA] |
CA |
3. [Server -> CA] SSL 인증서를 위해 서버의 정보 및 공개 키를 전달
Client | Server [S] | CA [CA] |
CA | S |
4. [CA -> Server] 확인 후 서버의 공개 키가 담긴 SSL 인증서를 발행, 비밀 키로 암호화
Client | Server [S] | CA |
CA | CA_Lock(S) (SSL 인증서) |
5. [Client] 대칭 키를 발급
Client [C] | Server [S] | CA |
CA | CA_Lock(S) |
6. [Client -> Server] Cipher suite 리스트 전달 (Client Hello)
7. [Server -> Client] Cipher suite 중 하나를 선택하여 전달 (Server Hello)
및 Certificate 패킷 전달 (SSL 인증서)
Client [C] | Server [S] | CA |
CA, CA_Lock(S) |
8. [Client] CA의 공개 키로 CA의 비밀 키로 암호화 되어 있는 SSL 인증서 복호화
Client [C] | Server [S] | CA |
S |
9. [Client] 복호화된 Server의 공개 키로 대칭 키를 암호화
Client | Server [S] | CA |
C, S_Lock(C) |
10. [Client -> Server] Server의 공개 키로 암호화된 대칭 키를 전달
Client | Server [S] | CA |
C | S_Lock(C) |
11. [Server] 비밀 키로 암호화된 대칭 키를 복호화
Client | Server | CA |
C | C |
+ cipher suite란
https://nuritech.tistory.com/25
https://velog.io/@mirrorkyh/HTTPS-%ED%86%B5%EC%8B%A0-%EC%9B%90%EB%A6%AC-%EC%9D%B4%ED%95%B4