SpringbootSecurity

SpringbootSecurity/JWT/JWT기본개념(CIA와 RSA에 대해 이해하기)

25G 2021. 9. 2. 11:11

이번 포스팅에서는 보안에 대해 포스팅을 간단하게 해 보겠습니다.

CIA

C : 기밀성

I : 무결성

A : 가용성

그럼 설명을 좀 더 쉽게 하기위해서 과거에 가서 통신한다는 가정을 해서 얘기를 시작해 본다.

몇백 년 전에 말 타고 다그닥 거리던 시절에

 

뭐 이런일이 발생한다고 해보자

그럼 여기서 발생할 수 있는 변수가 뭐가 있을까?

A나라가 B나라로 통신을 하기 위해 신하에게 문서를 주고 B나라로 보냈는데 C나라가 중간에 이 신하를 죽이고 문서를 바꿔서(C:기밀성) B나라로 위조된 문서(I: 무결성)를 보내면 어떻게 될까?

신뢰성 있는 통신을 할 수 없게 된다.(A :가용성)

위 상황에서는 CIA가 다 깨지게된다.

보안을 하기 위해서는 CIA를 완벽하게 지킨 상태로 통신을 이뤄야 한다

 

CIA를 완벽하게 지키기 위해선?

그럼 일단 기밀성을 유지하기 위해서는 "C나라 조지자!"라는 글을 A와 B만 아는 말로 암호화해서 통신을 하면 기밀성과 가용성을 지킬 수 있다. 하지만 그렇게 암호화를 했다고 하더라도 C나라가 A나 B나라의 신하를 통신 도중에 조지지 않는다고 보장할 수 없다. 그래서

훔치더라도 열어볼 수 없게 금고에 단단히 잠궈서 열쇠로 여는 것이 아니면 절대 열 수 없게 만들면 무결성 또한 지킬 수 있게 된다.

 

하지만 이렇게 해도 완벽한 보안을 이뤄낼 수 없다. 왜냐하면 열쇠를 전달을 해야 하는데 이 열쇠를 도난 맞으면 CIA가 다 깨지기 때문

그럼 지금까지의 문제를 정리해 보자면

1. 열쇠 전달 문제

2. 문서가 누구로부터 왔는지(C나라가 낚아체서 B나라가 보낸 것처럼 할 수도 있음)

이 두 가지만 해결되면 CIA를 지킬 수 있다.

그래서 나온 것이 RSA(암호화)다

 

RSA란?

 

 

RSA에는 두 가지 키가 있다

public Key :공개키 (공개돼도 상관없는 키)

Private Key 개인키 (공개되면 안 되는 키)

 

1. 열쇠 전달 문제 해결 방안.

 

A가 B에게 안녕이라고 보낸다.

이때 A가 자신을 공개키로 암호화를 한다. 그래서 암호화된 공개키를 B에게 보내는 것이다. 이때 중요한 것은 암호화된 공개키가 B의 공개키여야 한다. 그럼 이 메시지를 열 수 있는 사람은 B의 개인키를 가지고 있는 사람만 열어 볼 수 있다. 해커가 가로채더라도 B의 개인키를 가지고 있지 않기 때문에 열어 볼 수 없다.

이렇게

키 하나로 잠그고 여는 것을 같이하면 시멘트 리키 또는 대칭키라고 한다.

 

2. 문서가 누구로부터 왔는지 인증에 대한 해결방안

A가 B에게 "밥 먹었어?"라고 메시지를 보낸다고 할 때 A의 개인키로 암호화를 해서 B에게 전달을 하면 A의 공개키로 열어보는 것이다. 그럼 B입장에서는 A의 개인키를 A의 공개키로 열었다는 것은 A의 개인키를 가지고 있는 것은 A밖에 없기 때문에 A가 보냈다는 확신을 얻을 수 있다.

이렇게 개인키로 잠겄다는 것은 전자서명을 의미한다.

그래서 개인키로 잠가버리면 인증 문제를 해결할 수 있다.

 

RSA방식

위 두 가지 문제를 한 번에 해결하기 위한 방법

A가 B에게 "비밀번호 1234"라는 메시지를 보낼 것인데 암호화를 위해서 B의 공개키로 잠가버린다. 이때 만약에 해커가 중간에 데이터를 가로채서 "비밀번호 1234"를 날려버리고 새로운 데이터를 전송할 수 있다. 그래서 이를 방지하기 위해서 B의 공개키로 잠겨있는"비밀번호 1234"를 A의 개인키로 한번 더 잠그는 것이다.

그럼 프롵토콜(약속)을 하면 된다.

B가 문서를 받아서 해야 할 일은

1. 문서를 받는다

2.A의 공개키로 열어본다(열리면 인증 O, 안 열리면 인증 X)

3. 열렸다면 B의 개인키로 열어본다

이렇게 하면 위에서 발생하는 CIA를 다 지키면서 모든 문제를 해결할 수 있다