◆ HTTPS
▶ HTTTP 와 TLS(Transpoer Layer Security)의 조합 – 과거에는 SSL을 이용하기도 함
▶ 원리
● 웹 클라이언트와 웹 서버가 서로 신뢰할 수 있는지 확인하는데 신뢰는 핸드셰이크(handshake), 인증서, 개인 키를 바탕으로 함
● 웹 클라이언트와 웹 서버는 암호화 키 사용을 동의
● 합의한 키를 사용해 클라이언트와 서버는 통신 내용을 암호화
▶ 클라이언트 와 서버의 신뢰성 확인
● 인증서와 키는 완전히 다른 개념
● 개념을 이해하개인려면 공개 키 암호화(public key encryption) 나 비대칭 암호화(asymmetric cryptography)를 이해할 필요가 있음
● 공개 키(public key)는 데이터를 암호화할 때 사용되며 공유해도 되지만 공개 키를 사용해 암호화된 데이터를 복호화 할 수 없는데 복호화에는 또 다른 키가 필요한데 이 키를 비공개 키(private key) 라고 부르며 절대 공유해서는 안되고 공개 키는 아무나 사용할 수 있다지만 공개 키에 대응하는 비공개 키를 가진 주체만이 데이터를 사람이 읽을 수 있는 형태로 복호화 할 수 있는데 공개 키와 비공개 키는 복잡한 연산 알고리즘을 통해 생성하는데 이와 같이 두 개의 다른 키를 쓰는 방식을 비대칭 암호화라고 함
● 웹 클라이언트와 웹 서버는 비대칭 암호화 통신으로 공유 암호화 키(공유 비밀 키 또는 세션 키)를 공유하고 이를 사용해 대칭 암호화 통신을 시작
● 클라이언트와 서버 간의 핸드셰이크는 클라이언트가 서버와 보안 통신 세션을 시작한다는 것을 의미하는데 일반적으로 이 과정은 암호화의 복잡한 수학 수식에 대한 동의를 수반하는데 서버는 디지털 인증서(digital certificate – 공개 키의 소유권을 증명하는 전자 문서)로 응답
● 디지털 인증서는 신뢰할 수 있는 제3자가 서명 발행한 전자 문서로 이 문서에는 공개 암호 키와 키를 소유하는 서버 이름, 인증서의 내용과 공개 키의 소유권을 보증하는 제3자(인증서 발급자라고도 함)의 이름이 포함됨
● 신뢰할 수 있는 제3자는 인증기관(Certificate Authority)이라고 부르는데 기업이나 단체를 인증하고 인증서를 발급하는 여러 CA가 있는데 대부분의 CA는 서비스를 유료로 제 공하지만 Let’s Encrypt(https://letsencrypt.org/)처럼 무료로 제공하는 단체도 있음
● 큰 단체나 공공기관은 직접 인증서를 발급하는데 이 과정을 자체 서명이라고 하며 이런 인증서를 자체 서명 인증서(self-signed certificate)라고 부름
● 만료일이 있는 인증서도 있는데 만료일 전에 갱신해야 하며 인증서의 소유자가 변경되는 경우에 대한 추가적인 보안 차원
● 웹 클라이언트는 일반적으로 자신이 알고 있는 CA 목록을 갖고 있으며 웹 클라이언트가 웹 서버와 연결을 시도하면 웹 서버는 디지털 인증서로 응답하는데 클라이언트는 이 인증서에 명시된 발급 기관이 자신의 목록에 있는지 확인하고 알고 있고 신뢰할 수 있는 발급 기관이라면 인증서에 있는 공개 키를 사용해 통신하고 이 공개 키를 사용해 클라이언트와 서버가 대칭 암호화 통신에 사용하는 공유 암호화 키(공유 비밀 키 또는 세션 키)를 공유
● 웹 서버가 HTTPS를 지원하려면 핸드셰이크를 시작하는 인증서 와 비공개 키가 필요
▶ 암호화 사용 과 동의
● 암호화 키는 복잡한 수학 수식을 기반으로 데이터를 암호화하는 코드인데 데이터 암호화란 사람이 읽을 수 있는 데이터를 읽을 수 없는 형태로 변환하고 데이터를 보호하는 기술로 이 데이터를 다시 사람이 읽을 수 있는 형태로 변환하려면 또 다른 키가 필요
● 2단계와 3단계에서 사용하는 암호화 키를 대칭 암호(symmetric cipher)라고 부르고 클라이언트와 서버가 같은 키를 사용해 암호화와 복호화를 수행하는데 이 방식을 대칭 암호화(symmetrical cryptography)라고 하지만 개발 단계에서 이 키는 볼 수 없는 키
◆ Gin 프레임워크 와 HTTPS
▶ return r.Run(address) 대신에 RunTLS 메서드를 사용하면 됨
▶ RunTLS 메서드의 매개변수
● 백엔드 웹 서비스의 HTTPS 주소
● 인증서 파일
● 비공개키파일
▶ 테스트
● rest.go 파일의 run 메서드 호출 부분 수정
return r.RunTLS(address, "cert.pem", "key.pem")
● 테스트용 인증서 발급 – 프로젝트 디렉토리에서 수행
go run %GOROOT%/src/crypto/tls/generate_cert.go --host=127.0.0.1
● 만들어진 인증서를 원하는 디렉토리로 복사
● 서버를 실행하기 전에 다음 명령을 수행
set HTTPS=true
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
Go 언어 Back End 제작해보기(패스워드 해싱) 6장 (3) | 2023.05.26 |
---|---|
Go 언어 Back End 제작해보기(데이터베이스) 5장 (1) | 2023.05.25 |
Go 언어 Back End 제작해보기(미들웨어) 3장 (4) | 2023.05.23 |
Go 언어 Back End 제작해보기(라우팅 설정) 2장 (10) | 2023.05.22 |
Go 언어 Back End 제작해보기(Restful API,Gin Framework, Model & Database Layer) 1장 (8) | 2023.05.18 |
댓글