HTTPS란?
HTTP 프로토콜을 사용하여 통신하는 웹 애플리케이션에 TLS 프로토콜을 적용시켜 암호화된 데이터를 사용하여 통신하는 프로토콜.
TLS란?
컴퓨터 네트워크 통신에 데이터를 암호화하는 데 활용할 수 있는 프로토콜. 대칭 암호화 방식과 공개키 암호화 방식을 사용한다.
디지털 인증서란?
믿을 수 있는 제3자 기관에 의해 발행된 디지털 문서이다.(스스로가 OpenSSL과 같은 오픈소스를 통해 자가 인증이 가능하기도 하다)
공개키, 이 키가 속한 서버 이름, 정보를 검증하는 믿을 수 있는 제3자 기관의 이름, 발행자가 기록돼 있다.
이 제3자 기관을 인증기관(CA)이라 한다.
만료일자가 존재한다.
웹 클라이언트는 일반적으로 알려진 인증기관의 리스트를 갖고 있다.
대칭 암호화 방식
대칭키 알고리즘이라 불리기도 한다.
데이터를 암호화시킬 때 사용하는 키와 암호화된 데이터를 복호화시킬 때 사용하는 키가 같다. (대칭키로 불리는 이유)
대칭키를 암호화에 사용하기 위해선 복호화를 하는 서버 또한 같은 키를 가져야 하는데 이것을 평문으로 통신한다면 대칭키 암호화는 의미가 없다. 또한 같은 키를 사용하기에 데이터 통신 중 해커에게 키가 탈취당한다면 데이터가 간단히 해석되는 일이 발생할 수 있다. 이 부분을 방지하기 위해 HTTPS 통신에서 TLS는 대칭 암호화 방식과 공개키 암호화 방식 둘을 이용하는 것이다.
공개키 암호화 방식
비대칭 암호화 방식으로 알려져 있다.
대칭 암호화 방식과 달리 두개의 키를 사용한다.
데이터를 암호화하기 위한 한개의 키는 공개키로 알려져 있고 이것은 다른 대상자들과 안전하게 공유될 수 있다.
데이터를 복호화하기 위한 한개의 키는 개인키로 절대 공유되어선 안된다.
Go 적용 과정
자가 인증
자가인증에 사용하는 오픈소스인 openssl을 주로 사용. 사용법은
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
하지만 Go에는 자가 인증을 할 수 있는 효율적인 도구가 있음.
Go를 설치하면 자동으로 설치되는 모듈 tls를 사용하는 것
go run C:\'Program Files'\Go\src\crypto\tls\generate_cert.go --host=localhost
(나의 경우에는 Go가 C:\Program Files\Go 위치에 설치 됨)
HTTPS 적용
Go언어는 비교적 최신 언어이기에 HTTPS를 매우 간단하게 적용할 수 있는 내장 라이브러리 함수가 있다.
바로 http 모듈이 내장하고 있는 ListenAndServeTLS
사용법은 ListenAndServe와 몹시 비슷하다.
http.ListenAndServeTLS(tlsendpoint, "cert.pem", "key.pem", r)
획득한 cert.pem, key.pem의 경로만 추가로 적어주면 된다.
HTTP와 HTTPS 동시 적용
누군가는 이 두 프로토콜을 동시에 적용한 서비스를 제공하고 싶을 수도 있다.
그럴 땐 Go의 장점이 더 잘 나타나지 않을까 싶다.
httpErrChan := make(chan error)
httpsErrChan := make(chan error)
go func() { httpErrChan <- http.ListenAndServe(endpoint, r) }()
go func() { httpsErrChan <- http.ListenAndServeTLS(tlsendpoint, "cert.pem", "key.pem", r) }()
return httpErrChan, httpsErrChan
GoRoutine을 사용하여 이를 간편히 처리할 수 있으며 channel을 반환함으로써 main 함수에서 이에 대한 에러처리 역시 효과적으로 처리할 수 있다.
httpErr, httpsErr := rest.ServeAPI(config.RestfulEndpoint, config.RestfulTLSEndpoint, dbhandler)
select {
case err := <-httpErr:
log.Fatal(err)
case err := <-httpsErr:
log.Fatal(err)
}
select를 활용하여 에러처리를 한 모습니다.
'Study > Server' 카테고리의 다른 글
[Server] 커넥션 풀 (0) | 2022.10.04 |
---|---|
[Server] DDD(Domain-Driven Design) 도메인 주도 설계 (0) | 2022.07.15 |
[Server] OAuth 알고 쓰기 (0) | 2022.06.02 |
[Server] 인증(Authentication)과 인가(Authorization), 그리고 JWT(JSON Web Token) (0) | 2022.05.01 |
[Network] HTTP란? 그리고 HTTP 1.1, HTTP 2 (0) | 2021.09.02 |