보안 관점에서 볼 때 서버는 기본적으로 네트워크 상에서 오는 메시지들은 믿어서는 안됩니다. 그래서, 클라이언트로부터 오는 메시지를 믿기 위해 여러 관문들과 장치를 만듭니다. 네트워크 레벨에서는 HTTPS 로 man in the middle 공격을 막으려고 노력하고, HSTS 도 쓰고, IP 기반으로 ban 도 하고, 등등... 여러 레이어에서 여러 방법으로 처리를 합니다.
그런데 이메일에서는 쓸 수 있는 방법이 제한적입니다. 그래서 기본적으로 이메일의 링크를 통해서 유저가 데이터베이스에 미치는 영향은 제한적이어야 합니다. 그럼에도 필요한 경우들이 있는데 (e.g. email unsubscribe) 그럴 때 메시지 암호화를 씁니다.
암호화 방법도 다양합니다. 복호화가 가능한 양방향 암호화와, 복호화가 안되는 단방향 암호화, 대칭키 암호화와 비대칭키 암호화 등 다양하게 분류하죠.
그 중에서 저는 단방향 암호화인 SHA-256 과 대칭키 암호화인 AES 를 주로 씁니다. 따로 쓰지 않고, 같이 씁니다. 예를 들면 다음과 같습니다.
서버에서 검증이 필요한 주요 데이터는 SHA-256 으로 hexdigest 를 만든 뒤, 이를 덜 민감한 다른 데이터와 함께 AES 로 말아서 이메일에 심습니다. 그리고 해당 메시지가 request 로 들어오면, 서버는 이전에 특정 유저에게 보냈던 메시지임을 인지하고, 약속한 특정 행동을 합니다.
이중으로 암호화를 한 이유는 다음과 같습니다. AES 암호화에 쓰이는 키는 절대 서버 밖으로 나가서는 안됩니다. 그럼 compromise 될 가능성이 훅 올라갑니다. 그럼에도, 몹시 희소하지만 brute force 로 뚫을 수 있는 방법도 여전히 존재는 하죠. 이메일로 한 번 나간 메시지는 어떻게든 구워삶아질 수 있다고 가정해야 합니다. 그렇게 해서 뚫렸을 때 민감한 정보가 바로 보이면 위험하죠. 그래서 그 안에 민감한 데이터를 바로 두는 것이 아니고, SHA-256 으로 만든 digest 를 두는 것입니다.
서버는 AES 복호화 키를 가지고 있기 때문에 암호화된 메시지의 기본 형태를 알 수 있습니다. 그리고 덜 민감한 데이터들로부터 힌트를 얻어서, 어떤 값들을 input 으로 SHA-256 해싱을 했을 때 digest 가 나올지 유추할 수 있습니다. 그렇게 digest 를 만들었을 때 만약 메시지에 있는 digest 와 동일한 값이 나오면 authentic 하다고 인정해줍니다. 그렇지 않을 땐 bad request 처리를 해주고요.
폰으로 길게 쓰려니 힘드네요 😅
암튼 저는 메시지 암호화를 위와 같이 쓰고 있는데, 다른 분들은 어떤 용도로 어떤 방식으로 쓰시는지도 궁금하네요. 🙂 제가 삽질을 하고 있는 것 같다면 알려주셔도 좋겠습니다 ㅎㅎ
이메일에서 쓰는 메시지 암호화
2020.04.14 | 조회수 306
Eugene Joo
WASD3R
닉네임으로 등록
등록
리멤버 회원이 되면 모든 댓글을 보실 수 있습니다
로그인
회원가입
김커뮤니티
@멘션된 회사에서 재직했었음
BEST회사에서 풀지 못한 고민, 여기서
회사에서 업무를 하다가 풀지 못한 실무적인 어려움, 사업적인 도움이 필요한 적이 있으셨나요? <리멤버 커뮤니티>는 회원님과 같은 일을 하는 사람들과 이러한 고민을 해결할 수 있는 온라인 공간입니다.
회원 가입 하고 보다 쉽게 같은 일 하는 사람들과 소통하세요
2020.07.01
154
김커리어
@멘션된 회사에서 재직 중
BEST리멤버 회원을 위한 경력 관리 서비스, 리멤버 커리어를 소개합니다.
당장 이직 생각이 없어도, 좋은 커리어 제안은 받아보고 싶지 않으신가요? <리멤버 커리어>는 리멤버에서 새롭게 출시한 회원님들을 위한 경력 관리 서비스 입니다. 능력있는 경력직 분들이 <리멤버 커리어>에 간단한 프로필만 등록해두면, 좋은 커리어 제안을 받아 볼 수 있습니다. 단 1분의 투자로 프로필을 등록해두기만 하면, 기업인사팀이나 헤드헌터가 회원님께 꼭 맞는 제안을 직접 보내드립니다.
지금 바로 <리멤버 커리어>에 프로필을 등록하고, 새로운 기회를 만나보세요!
2020.07.01
21