본문 바로가기

항해 시절

https 공부 (항해 9주차 회고록)

728x90
728x90

(이 자료는 생활코딩을 참조해서 작성되었습니다. 출저 https://www.opentutorials.org/course/228/4894)

 

 

1. HTTPS란? 쓰는 이유는?🤔

HTTP는 Hypertext Transfer Protocol의 약자로, HTML을 전송하기 위한 통신 규약이다.

HTTPS에서 S는 Over Secure Socket Layer의 약자로 보안이 강화된 HTTP라는 것을 짐작 할 수 있다.

 

HTTPS를 쓰는 이유는 간단히 얘기하면 우리가 어느 페이지에서 로그인을 하려고 할 때 우리가 입력한 아이디, 비밀번호가 암호화되지않고 그대로 서버까지 전송하게되면 누군가 중간에 가로채서 훔쳐볼 수 있는 위험이 있기 때문이다.

 

HTTPS를 쓰게 되면 우리가 입력한 아이디, 비밀번호가 암호화되어 서버로 전송되기 때문에 누군가 들여다 봐도 값을 알 수 없게 된다.👍

2. HTTPS로 인정받기 위해서 사용되는 SSL 디지털 인증서란?

SSL 디지털 인증서는 클라이언트 <--> 서버 간의 통신을 제 3자가 보증해주는 전자화된 문서다.

이러한 인증서를 발급해주는 기관은 CA(Certificate authority) 혹은 Root Certificate라고 부른다

CA는 신뢰성이 보장된 공인된 기업만이 참여 가능하다.

우리가 사용하는 크롬 같은 브라우저는 브라우저가 이미 CA List를 가지고 있다.

유저가 어느 페이지를 들어갈 때 그 페이지에서 인증서를 받게 되는데 그 인증서를 발급한 기관이 CA List에 있는 기업이면

공인된 인증서로 판단하고 URL 옆에 안전하다는 자물쇠 표시를 띄워주게 된다.

공인된 인증서가 아닐경우에는 위험 경고가 뜨게된다 (인증된 기관이 아니기 때문에)

3. SSL의 동작 방법

어떠한 로직으로 이 인증서가 유효한지 판단하고 또한, 어떠한 로직으로 유저가 입력한 데이터를 암호화해서 서버한테 전송할지에 대해말해보려 한다

이것을 설명하기 전에 알아야 할 것이 있다. 👀

1). 대칭키, 공개키

2). 컴퓨터와 컴퓨터가 네트워크를 통해 통신할 때 이루어지는 3단계 악수 -> 전송 -> 세션종료

1) 대칭키란? 공개키란? ✨

대칭키는 key 하나로 암호화 하고 복호화(암호를 품) 할 수 있다는 것이다.

예시로 내가 123456 이라는 key로 어떠한 데이터를 암호화하고 상대한테 key가 123456이라고 알려주게 되면

상대는 123456 key로 데이터를 복호화하고 값을 읽을 수 있게 된다.

공개키는 암호화 key랑 복호화 key가 나누어져 있다는 것이다.

명칭을 공개키, 개인키로 부르고 공개키로 데이터를 암호화하면 개인키로 복호화 할 수 있고, 개인키로 데이터를 암호화하면 공개키로 데이터를 복호화 할 수 있다.

서버가 공개키, 개인키를 갖고 있고 공개키는 모두에게 오픈하고 개인키는 서버 주인만 갖고 있다.

우리가 유의깊게 봐야될 부분은 -> 개인키로 데이터를 암호화하면 공개키로 데이터를 복호화 할 수 있다. 이 부분이다.

저걸 우리는 인증에 사용하게 된다.

 

무슨 말 이냐면 S기관(서버)이 데이터를 개인키로 암호화하고 유저한테 주면 유저가 그걸 S기관(서버)의 공개키로 복호화가 되었다면 그것은 이 데이터는 틀림없는 S기관(서버)의 데이터란 것을 인증, 즉 증명하게 된다.

이 부분을 활용하면 유저가 어느 페이지에 접속 하였을 때 그 페이지에서 준 인증서가 공인된 기관에서 준 인증서가 맞는지를 확인 할 수 있게 된다.

2. 컴퓨터와 컴퓨터가 네트워크를 통해 통신할 때 이루어지는 3단계

악수 -> 전송(세션) -> 세션종료

유저가 어느 A서버(페이지)에 접속하게 될 때 처음 이루어지는 단계는 3단계로 나누어진다.

각 단계에서 이루어지는 역할만 정리해보면

첫 번째 단계인 악수

1) 유저가 3가지의 정보를 서버에 전달한다, 유저측에서 생성된 랜덤데이터, 유저 측에서 지원하는 암호화 방식, 세션 아이디

2) 서버는 유저 정보를 받고 다시 3가지를 유저에 전달한다, 서버측에서 생성한 랜덤데이터, 유저가 보내준 암호화 방식을 보고 나서 선택한 암호화 방식, 인증 기관의 개인키로 암호화 된 인증서(인증서 안에서는 서버의 공개키가 들어 있음)

3) 유저는 서버가 준 인증서를 보고 공인된 기관의 인증서인지 판단(위에 대칭키란? 공개키란? 에서 인증 부분 참고),

서버가 준 랜덤데이터와 유저가 생성했던 랜덤데이터를 조합해서 pre master secret라는 키를 생성 , 이 키는 유저와 서버 간의 데이터를 전송시 암호화, 복호화하는 대칭키로 이용된다. (제 3자에게 절대로 노출되어선 안됌)

4) 유저측에서 생성한 대칭키는 서버도 갖고 있어야 한다. 그래서 유저가 대칭키를 서버한테도 보내줘야 하는데 이때 사용하는 것이 인증서안에 들어있는 서버의 공캐키를 사용하여 대칭키를 암호화 하는 것이다.

그러고 서버한테 전송하게 되면, 이 것이 중간에 누군가 들여다본다 해도 서버의 개인키가 없는 이상 복호화를 할 수 없으므로, 데이터를 지킬 수 있게 된다.

이제 유저와 서버 간의 데이터 전송시에는 하나의 대칭키로 데이터를 암호화, 복호화 할 수 있다.

5) 유저와 서버는 악수 단계의 종료를 서로에게 알림

두 번째 단계인 전송(세션)

세션 단계에서는 실제로 서버와 유저간의 데이터를 주고 받게 된다. 이 단계에서의 핵심은 악수 단계에서 서로 가지게 된 하나의 대칭키를 사용하여 데이터를 암호화하고 복호화 하는 것이다.

(그냥 공개키를 사용하면 될 것을, 대칭키를 조합해서 사용하는 이유는? 공개키 방식이 컴퓨터 파워를 많이 쓴다고 함, 데이터 암호화 복호화 할 때 대칭키를 쓰는 것이 더 효율적인 것이라 판단)

세 번째 단계인 세션종료

데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알린다. 이 때 통신에서 사용한 대칭키를 폐기함

 

실제로는 악수부터 세션종료까지는 순식간에 일어나기 때문에 대칭키를 어떠한 알고리즘으로 찾아서 해킹시도를 하는 것은 시간 상 매우 힘듬 👏