20250224 TIL
✅ 궁금증 셀프 Q&A
✔️ 인터넷과 웹의 개념은 각각 무엇이고 어떻게 다를까?
추측
매번 웹개발이라는 용어를 일상적으로 쓰면서 정작 이 정의에 대해서는 깊게 생각해 보진 않은 것 같다. 인터넷은 '하나의 분리되지 않고 연결되어 있는 망'이라고 생각했고, 웹은 '인터넷이라는 환경 위에서 정보를 공유하는 하나의 장이나 환경'이라고 생각했다. 인터넷은 추상적이지만 존재가 명확한 하나의 개념인 반면, 웹은 추상적이고 실체가 있지 않은 대신 인터넷을 통해 생성되는 사이버 공간이라고 생각했다.
얻어낸 답
'what is web'이라고 구글 검색을 해 보았다. WEB은 '인터넷을 통해 접근 가능한, 서로 연결된 웹사이트들과 문서들의 체계'라고 한다. 그리고 'what is internet'이라고 검색을 해 보니 '지정된 프로토콜을 통해서 통신하는 컴퓨터 간의 네트워크 체계'라고 한다. 웹과 인터넷 모두 '연결된 시스템/체계'라는 면에서는 비슷하다. 하지만 웹은 하이퍼텍스트/하이퍼링크를 통해 웹사이트나 문서들이 연결된 시스템을 의미하는 반면 인터넷은 컴퓨터가 지정된 프로토콜을 통해서 서로 통신, 연결되는 시스템에 가깝다.
✔️ HTTP와 HTTPS의 차이는?
추측
SSL/TLS 통신의 유무에 따라 HTTPS, HTTP로 구분된다. HTTPS는 HTTP 통신을 기반으로 하지만, HTTP 통신이 OSI 7계층에서 이루어진다면 SSL/TLS 통신이 OSI 6계층에서 별도로 이루어진다고 알고 있다. SSL/TLS 프로토콜은 정보를 전달할 때 암호화를 담당하는 계층이라고 알고 있다. 암호화의 방식으로는 대칭 키 암호화(암호화, 복호화에 같은 키 사용)와 비대칭 키 암호화(공개키와 비밀키가 별도로 존재)가 있다고 알고 있으며, 여기서는 비대칭 키 암호화를 사용한다고 알고 있다. 즉 HTTPS를 사용하면 HTTP로 통신되는 데이터를 암호화할 수 있으며 이러한 이유로 대부분의 웹사이트에서는 HTTPS를 사용한다고 알고 있다.
얻어낸 답
문서를 참고하는 과정을 통해서 잘못 안 부분이 있어서 몇 가지를 정정해야 하겠다. 우선 HTTPS 통신이 HTTP에 비해 추가로 SSL/TLS 프로토콜을 사용하는 것은 맞고, 전송 계층(4계층)인 TCP layer 위인 Session/Presentational Layer에 위치한다. 그리고 SSL과 TLS를 묶어서 사용했는데 TLS(transport layer security)가 SSL(secure sockets layer)보다 더 안전한 버전이라고 한다.
또한 SSL/TLS 프로토콜에서는 인증서를 통해 암호화를 한다고 한다. SSL handshake 관련 문서에서는 SSL handshake 과정을 5단계로 나눠서 설명한다. 사실 이 문서를 읽으면서도 정확히 모르겠는 부분이 있어서 다음 질문에서 이어서 다뤄 보겠다.
✔️ SSL handshake는 어떤 과정으로 발생하는가
추측
SSL handshake 관련 문서를 보고 이해한 바로는 SSL은 통신 계층과 애플리케이션 계층 사이인 Session/Presentational Layer에 해당하고, TCP와 유사하게 handshake를 맺는 과정이 필요하다. (물론 모든 통신 계층 프로토콜이 handshake를 맺진 않는다. 대표적인 예로 UDP가 있다.) 이 과정에서는 '클라이언트'와 '서버'라는 주체가 있다. 우선 클라이언트가 서버에게 secure session을 맺기를 요청한다. 그러면 서버는 자신의 SSL 인증서를 서버의 공개 키와 함께 보낸다. 클라이언트는 'a list of known certificate authorities'를 통해서 서버에게 인증을 하는데, 이 부분에서 무슨 일이 일어나는 것인지는 아직 이해를 못 했다. 여튼 인증이 성공하면 클라이언트는 임의의 문자열을 생성하고 그 문자열을 서버의 공개키로 암호화해서 서버로 보내준다.
그러면 서버와 클라이언트만 임의의 문자열을 알고 있기에, 이 문자열을 키로 해서 대칭키 암호화가 가능하다. 그래서 해당 방식은 공개키/비밀키 암호화와 대칭키 암호화 모두를 사용한 방식으로 알고 있다.
얻어낸 답
handshake를 맺는 과정이 조금 생략되어 있었다. 다른 문서에서 더 정확히 확인했다. 그리고 클라이언트가 서버 인증 후 생성하는 문자열은 단순 임의 문자열이 아니라 '프리마스터 시크릿'이라고 불리는 난수라고 한다. 그리고 클라이언트가 a list of known certificate(CA)를 통해서 서버에게 자신을 인증하는 것이 아니라, 서버가 인증서를 보냄으로써 자신의 신원을 클라이언트에게 증명하는 것이다.
✅ 미해결 궁금증
- 왜 TLS가 SSL보다 더 안전한 버전인가
- TCP 3-way handshake와 SSL handshake는 어떻게 다른가
- '소켓'은 구체적으로 무엇인가? 웹 소켓은 또 무엇인가
- 웹소켓 통신과 HTTP 통신은 뭐가 다른가
- 웹 브라우저의 구체적인 정의는 무엇인가? 웹 브라우저와 웹 클라이언트는 같은 말인가?
- rest api의 정의와 등장 배경은?
- ./gradlew bootRun 명령어의 원리는? 그리고 해당 명령어를 실행하는 것과 SpringApplication을 실행하는 것은 또 어떻게 다른가
- spring container에서는 객체의 생성을 제어한다고 알고 있다... django도 마찬가지인가? django에서는 spring에서 사용되는 IoC나 DIP의 개념이 사용되는가? 아니라면 django는 어떤 방식으로 동작하는가
- docker-compose가 docker에 비해 부가적으로 제공하는 기능은 무엇인가