인증 - HTTPS
1. HTTPS (Hyper Text Transfer Protocol Secure Socket layer)
- HTTP + Secure 의 합성어이다
- HTTP over SSL(TLS), HTTP over Secure 라고도 한다
- HTTP 프로토콜에 보안성이 추가된 시스템이다
- HTTP 요청을 SSL 또는 TLS 알고리즘을 이용하여 HTTP 통신을 하는 과정에서 데이터를 암호화하여 전송한다
- 접속하는 웹사이트의 왼족 자물쇠를 클릭하면 보안 정보가 나타난다
2. HTTPS 특징
1) 암호화
- 클라이언트와 서버가 데이터를 암호화하여 주고받기 위해 비대칭키 방식과 대칭키 방식을 혼용하여 사용한다
- 대칭키 방식은 양쪽이 공통의 비밀 키를 공유하여 데이터를 암호화 및 복호화한다
- 비대칭키 방식은 각각 공개키(public key)와 비밀키(private key)를 가지고 있어서 상대가 공개키로 암호화한 데이터를 개인이 가진 비밀키로 복호화한다
- 전자서명은 개인키로 암호화하고 공개키로 복호화 한다
- 암호화는 공개키로 암호화하고 개인키로 복호화 한다
- 클라이언트와 서버는 한 쌍의 비대칭 암호화 Key를 가지고 있다
- 클라이언트와 서버 간의 암호화 key를 상호 검증하여 보안을 강화한다
- 서버가 실행되면서 인증서를 등록하므로 클라이언트는 서버의 공개키를 알 수 있다
2) 인증서(Certificate)
- 데이터 제공 서버가 실제로 데이터를 보내는 서버인지 확인하는 용도이다
- 서버의 도메인 정보가 포함되어 있어서 데이터 제공자의 인증을 용이하게 한다
- 서버에서 보내는 응답 정보와 인증서를 함께 확인하여 보안을 강화한다
3) CA(Certificate Authority)
- 공인 인증서 발급 기관을 CA(Certificate Authority)라고 한다
- CA는 공인 인증 기관으로 엄격한 기준에 따라 자격이 유지되고 박탈 당할 수 도 있다
- CA들은 서버의 공개키와 정보를 CA의 비밀키로 암호화하여 인증서를 발급한다 - 브라우져는 인증서 발급 기관으로부터 발급받은 인증서를 보유하고 있다
- 서버와 클라이언트 간의 CA를 통해 서버를 인증하고 데이터를 암호화하는 과정의 전체 프로토콜을 TLS 또는 SSL이라고 한다
- SSL과 TLS는 사실상 동일한 규약을 뜻한다
- SSL이 표준화되며 변경된 이름이 TLS이다
3. 인증서 발급
1) 인증서 지원 형식
- 자바는 다음과 같은 두 가지의 인증서 형식을 지원한다
- PKCS12 (Public Key Cryptographic Standards #12)
: 여러 인증서와 키를 포함할 수 있으며, 암호로 보호된 형식으로 업계에서 널리 사용된다
- JKS (Java KeyStore)
: PKCS12와 유사하다
: 독점 형식이며 Java 환경으로 제한된다
2) HTTPS 사설 인증서 발급
- Spring Initializr에서 기본 웹 서버 프로젝트를 생성한다
- mkcert 프로그램을 설치한다
- mkcert 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다
- mkcert는 PKCS12 형식만 지원합니다. - mkcert 프로그램 설치 방법
- 터미널에 아래 명령어를 입력 후 실행하여 설치한다
WSL 터미널에서 작성한다
$ sudo apt install libnss3-tools
- 설치가 안되고 에러가 발생할 경우 update를 먼저 진행한다
$ sudo apt update
- 설치가 되었으면 아래 명령을 입력하고 진행한다
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
- 마지막으로 아래 명령을 입력해 준다
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/
- 로컬을 인증된 발급기관으로 추가해 준다
- 아래 명령어를 작성 후 실행하여 CA를 생성한다
$ mkcert -install
- PKCS12 인증서를 생성하기 위해 아래 명령을 작성 후 실행한다
$ mkcert -pkcs12 localhost
- 옵션으로 추가한 localhost에서 사용할 수 있는 인증서가 완성되었다
- 해당 커맨드를 입력한 위치에 localhost.p12라는 파일이 생성된 것을 확인할 수 있다
- 저장 경로를 반드시 확인한다
3) HTTPS 서버 작성
- Spring Boot를 이용하여 HTTPS 서버를 간단하게 작성할 수 있다
- 생성된 인증서를 resources 폴더로 이동한다
- application.properties 에서 관련 설정을 추가한다
→ 비밀번호인 changeit은 비밀번호를 설정하지 않았을 때의 기본값이다
→ 인증서 비밀번호는 인증서를 생성할 때 설정하거나 생성 후 변경해 줄 수 있다
→ 비밀번호 설정 방법은 한번 찾아보시기 바랍니다 :)
server.ssl.key-store=classpath:localhost.p12 -> 인증서 경로를 적는다
server.ssl.key-store-type=PKCS12 -> 인증서 형식을 적는다
server.ssl.key-store-password=changeit -> 인증서 비밀번호를 적는다
- 이제 서버를 실행해 보면 HTTPS 서버가 작동되는 것을 확인할 수 있다
- web애플리케이션에서도 확인해 본다
- 페이지를 생성한 것이 없으므로 white error 가 발생한다
※ 참고 자료
▶ 중간자 공격 : https://en.wikipedia.org/wiki/Man-in-the-middle_attack
Man-in-the-middle attack - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Form of message tampering In cryptography and computer security, a man-in-the-middle, monster-in-the-middle,[1][2] machine-in-the-middle, monkey-in-the-middle,[3] meddler-in-the-middle
en.wikipedia.org
▶ 암호화 : (101) HTTPS가 뭐고 왜 쓰나요? (Feat. 대칭키 vs. 비대칭키) - YouTube
▶ 교차 출처 리소스 공유 (CORS) : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
교차 출처 리소스 공유 (CORS) - HTTP | MDN
교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라
developer.mozilla.org