우리는 지난 시간에 MobaXterm 프로그램을 이용해 ip주소를 입력하고 private key에 pem파일을 넣어 aws로부터 빌린 컴퓨터에 접속을 하였다. 그럼 여기서 private key란 뭘까?
이렇게 A와 B가 통신을 하는데 중간에 C가 있다. A는 어떤 비밀번호를 B로 보내는데 중간에 C가 가로채도 타격이 없게끔 비밀번호를 암호화 해서 보내야한다. 그래서 이 비밀번호를 암호화 해서 보낼 때 암호화 키를 예를들어 K라는 식으로 암호화를 해서 보내게 되면
이 C가 중간에 가로채도 이 비밀번호는 K라는 데이터로 암호화가 되어있어 열어볼 수 없다. 하지만 이건 B가 받았을때에도 마찬가지로 열 수 없다.
그래서 이 A는 이 K라는 키를 서로 공유하고 있어야하는데 그럼 이 K라는 키도 통신 선으로 전송을 해야한다. 근데 또 이렇게 전송을 하면 C도 똑같이 K라는 키를 받아서 열 수 있다.
이런식응로 어떤 데이터를 열때와 잠글때 같은 키를 사용하는 방식을 대칭키 방식이라고 한다.
이 대칭키 방식의 단점은 열쇠 교환하는 과정이 힘들다는것이다. 그래서 고안한 방식이 RSA방식이다.
이 RSA방식은 먼저 키를 두개를 만든다.
예)
A열쇠로 잠그면
B열쇠로 풀 수 있다
B열쇠로 잠그면
A열쇠로 풀 수 있다.
대충 이런식의 예제인데 이런걸 공개키 기반 암호화 방식이라고 한다.
다른 예시로
이제 다시 A가 비밀번호를 전송을 하는데 이때 A의 공개키, 비밀키를 만들고 B도 B의 공개키, 비밀키를 만든다.
공개키는 누구나 알아도 되는 키이고 비밀키는 자기만 들고 있는 키이다.
나의 공개키로 잠그면 나의 비밀키로만 열 수 있다. 자 이제 그럼 A는 비밀번호를 우선 B의 공개키로 잠근다.(이건 공개되어 있어서 A도 접근할 수 있음 그럼 B의 개인키로만 열 수 있음) 즉 C가 낚아채도 B의 개인키가 없기때문에 열 수 없게 된다.
자 그럼 또 다른 예시로 똑같은 상태에서
A는 비밀번호를 B의 공개키로 잘 잠궜는데 이걸 C가 낚아채서 B로 못가게 막고, 하지만 이 C는 이 비밀번호를 열 수 없다. 그래서 이 C는 그냥 이 비밀번호를 폐기해버리고 다른 비밀번호를 넣고 B의 공개키로 잠그고 다시 B한테 보낼 수 있다. 그럼 이제 B는 A에게 비밀번호가 틀렸다는 데이터를 응답하게 될 것이다. 그럼 A는 분명 제대로 입력하여 보냈는데 비밀번호가 틀렸다는 황당한 응답을 받게 된다. 그렇기에 데이터를 누가 보냈는지에 대해도 생각을 해야한다.
이걸 RSA방식으로 해결할 수 있는데 B의 공개키로 암호화된 패스워드를 다시 A의 비밀키로 암호화를 한다.
이렇게 하면 누가 데이터를 보냈는지에 대한 문제도 해결이 가능하다.
다시 정리하자면 예를들어 A와 B가 어떤 프로토콜(약속)을 만든다
데이터 전송 방법
1. 데이터를 수신자의 공개키로 잠근다.
2. 그 데이터를 다시 전송자의 비밀키로 잠근다.
3. 전송한다.
데이터를 받는 방법
1. 데이터를 전송자의 공개키로 연다.
2. 이 데이터가 열리면 전송자가 보낸것이 맞는것이니 수신자의 개인키로 연다.
이렇게 만들면 C가 아무리 훔쳐서 C의 비밀키로 잠궈도 B는 A의 공개키로만 열릴것이기때문에 막히게 된다. 이렇게 되면 A가 데이터를 보냈다는 사실에 신뢰를 할 수 있게 된다.
한마디로 1번의 행위는 암호화, 2번의 행위는 전자서명에 대한 행위라 볼 수 있다.
이걸 왜 설명하냐면 AWS 서울 리전이 있으면 여기에 우리가 어떤 컴퓨터 한대를 임대해서 쓰고 있다. 여기에 들어가기 위해 방화벽이 설치되어 있는데 이중 한군데만 연다(22번포트) 그럼 이제 여기에 접속을 해야 통신이 가능한데, 22번으로 접속을 할 때 아무한테나 열어주면 안될 것이다. 그래서 이 컴퓨터 내부에 .ssh라는 폴더가 있다. 여기에 들어가서 보면 authorized_key라는 파일이 있는데 이 파일 내부에 공개키가 있다. 여기엔 접속하려는 접속하려는 우리의 공개키이다. 그럼 우린 접속을 할 때 우리의 비밀키(private key)를 가지고 들어가야 한다. 가지고 들어 오면 이제 이 컴퓨터는 공개키로 우리가 가지고 온 비밀키를 풀어 보고 이게 풀리면 인증이 되는것, 그렇게 서로간 세션이 만들어지게 되는 것이다. 그 다음부턴 비밀키 공개키 상관 없이 계속 통신을 할 수 있는 상태가 된다. 그렇기때문에 우리는 접속할때 항상 private key를 가지고 들어가야 하는것이다.
이 글은 유튜브 메타코딩 채널의 강의 영상을 보며 공부한 내용을 기록한 게시글입니다.