최근 2~3주 동안 시험기간이라서 CS에 집중하지 못했습니다.
이제 다시 커리큘럼에 맞춰 또 집중해야 할 것 같습니다.
4주차 내용은 다음과 같습니다.
4주차 학습 내용
- Network
- 대칭키 / 공개키
- HTTP / HTTPS
- 로드 밸런싱
- Blocking, Non-blocking / Synchronous, Asynchronous
- Blocking / Non-Blocking I/O
- Spring
- Bean Scope
- MVC Framework
- Spring Boot, SpringApplication
대칭키 / 공개키
대칭키(Symmetric key) / 공개키(Public Key, Asymmetric Key)
대칭키는 보내는 사람의 key와 받는 사람의 key가 동일하다.
속도 측면에서는 빠르지만, 안정성이 떨어진다는 단점이 있다.
공개키는 보내는 사람의 key와 받는 사람의 key가 동일하지 않다.
속도 측면에서는 떨어지지만, 자신의 key로만 복호화를 할 수 있기에 안정성이 뛰어나다.
다음과 같이, 공개키 암호화 알고리즘에서는 받는 사람의 공개키를 이용해 평문을 암호화하여 암호문을 보내게 된다.
하지만, 받을 때는 받는 사람의 비밀키를 통해 암호문을 복호화하여 평문을 확인한다.
그리고 받는 사람은 보내는 사람의 공개키를 통해 응답을 암호화하여 보내는 사람에게 다시 전달한다.
그리고 보내는 사람은 보내는 사람의 비밀키를 통해 암호문을 다시 복호화한다.
결국, 비밀키는 복호화의 용도로 사용하고 공개키는 암호화의 용도로 사용한다고 해석하면 좋을 것이다.
하지만, 이 경우에는 Confidentiality만 보장하고, 무결성과 확실성에 대해서는 보장이 안된다.
->이를 MAC(Message Authentication Code), 전자 서명(Digital Signature)을 통해 해결한다.
HTTP / HTTPS
HTTP란 무엇인가?
Hypertext Transfer Protocol
: W3상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는데 쓰인다.
클라이언트 : HTTP request를 보낸다.(요청)
서버 : HTTP response를 보낸다.(응답)
HTTPS : HTTP + Secure
: 인터넷 상에서 정보를 암호화하는 프로토콜인 SSL 프로토콜을 사용하여 클라이언트와 서버가 자원을 주고 주고받기 위한 규약이다.
HTTPS는 텍스트를 공캐기 암호화 방식을 통해 암호화한다.
HTTPS 통신 흐름
애플리케이션 서버를 만드는 기업은 HTTPS를 적용하기 위한 공개키와 비밀키 생성
CA 기업(공개키를 저장해주는 민간 기업) 선택 후, 그 기업에게 공개키 관리를 부탁하며 계약을 진행
계약이 완료된 CA기업은 해당 기업의 이름, A서버 공개키, 공개키 암호화 방법을 담은 인증서를 만들고, 해당 인증서를 CA 기업의 개인키로 암호화해서 A서버에게 제공
A서버는 암호화된 인증서를 갖게 되고, A서버는 A서버의 공개키로 암호화된 HTTPS 요청이 아닌 요청이 오면, 이 암호화된 인증서를 클라이언트에게 전해준다.
다음과 같이 저는 HTTP 요청을 보냈는데, 암호화된 HTTPS로 반환이 되었는걸 확인할 수 있었습니다.
로드 밸런싱
로드 밸런싱이란 ?
컴퓨터 네트워크 기술 중 하나로, 한 대의 서버가 모든 트래픽을 감당하기에는 매우 난해하다.
그래서 여러 대의 서버에게 트래픽을 균등하게 분산시켜줌으로써, 서버에게 무중단 서비스를 제공함과 동시에 웹 서버의 과부하를 막을 수 있는 기술이다.
클라이언트와 서버 사이에 Load Balancer를 두고, 여러 서버에 분산시켜준다.
Blocking/Non-blocking & Synchronous/Asynchronous
blocking : 호출된 함수가 호출한 함수에게 대기하라고 명령
non-blocking : 호출된 함수가 바로 return하여 호출한 함수에게 다른 일을 할 수 있게 하는 기회를 줌
Synchronous : 호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나, 스스로 호출된 함수의 작업 완료 여부에 대해 신경을 쓴다.
Asynchronous : 호출되는 함수에게 callback을 전달하여, 호출된 함수의 작업 완료 여부를 신경 쓰지 않는다.
작업 완료 여부를 호출된 함수를 호출한 함수가 신경 쓰면 동기
호출된 함수를 호출된 함수가 신경쓰면 비동기이다.
Blocking & Non-Blocking I/O
blocking I/O란 I/O작업이 진행되는 동안 자신의 작업을 중단한 채, I/O가 끝날 때까지 대기하는 방식이다.
응용 계층에서 Read()함수를 호출하면 Kernal에 System Call을 보내면 read I/O가 수행될 때까지 application은 block 상태가 되어서 다른 작업을 못하게 되며 Kernal 측에서 Read response를 보내기 전까지 다른 작업을 수행하지 못한다.
read I/O를 수행하기 위해 System call을 보내면, Kernal이 작업을 완료했는지와는 무관하게 즉시 응답하게 된다. System call을 받는 즉시 다시, CPU의 제어권을 Application으로 넘겨주며 다른 작업을 수행할 수 있게 된다.
Spring에 관한 내용은 Spring 관련 게시글에 작성하겠습니다.
<참고 자료>
https://gyoogle.dev/blog/computer-science/network/HTTP%20&%20HTTPS.html
https://gyoogle.dev/blog/computer-science/network/Load%20Balancing.html
'CS' 카테고리의 다른 글
[컴퓨터 구조] 컴퓨터 구조를 알아야 하는 이유 (1) | 2023.03.27 |
---|---|
Blocking & Non-Blocking, Synchronous & Asynchronous (0) | 2022.11.28 |
CS스터디 3주차 Network & Java (1) | 2022.10.26 |
CS스터디 2주차 Computer Architecture & Java (1) | 2022.09.28 |
cs 스터디 1주차 Computer Architecture & Java (4) | 2022.09.21 |