🔍 SSL이란? (Secure Sockets Layer)
SSL(Secure Sockets Layer)은 인터넷에서 데이터를 암호화하여 안전하게 전송하기 위한 보안 프로토콜이다! 🔒
✅ 기본 개념
- 클라이언트(웹 브라우저)와 서버 간의 데이터 전송을 암호화하여 해커가 중간에서 정보를 훔쳐보는 걸 방지하는 기술
- 현재는 SSL의 후속 버전인 TLS(Transport Layer Security)가 사용되고 있지만, 관행적으로 SSL이라는 용어를 계속 사용
📌 1. SSL의 핵심 기능
✅ 1-1. 데이터 암호화 (Encryption)
- 서버와 클라이언트 간 주고받는 데이터를 암호화해서 제3자가 내용을 볼 수 없도록 보호
✅ 1-2. 데이터 무결성 (Integrity)
- 데이터가 전송 중 변경되지 않도록 보호 (해커가 데이터를 중간에서 조작하는 걸 방지)
✅ 1-3. 신원 인증 (Authentication)
- 클라이언트가 접속하는 서버가 신뢰할 수 있는 서버인지 확인 (피싱 사이트 방지)
📌 2. SSL이 필요한 이유
✔ 비밀번호, 신용카드 정보 같은 민감한 데이터를 보호
✔ 공격자가 중간에서 데이터를 가로채는 ‘중간자 공격(Man-in-the-Middle Attack)’ 방지
✔ 웹사이트의 신뢰도 향상 (SSL 인증서가 없으면 브라우저에서 ‘안전하지 않음’ 경고가 뜰 수도 있음 ⚠️)
✔ SEO(검색엔진 최적화)에도 긍정적인 영향 (Google은 HTTPS 웹사이트를 우선적으로 노출함)
📌 3. SSL의 작동 원리
✅ 3-1. SSL Handshake (SSL 연결 과정)
1️⃣ 클라이언트(브라우저)가 서버에 HTTPS 요청
2️⃣ 서버가 SSL 인증서(CRT, 공개 키 포함)를 클라이언트에게 전송
3️⃣ 클라이언트가 인증서 검증
신뢰할 수 있는 CA에서 발급되었는지, 만료/도메인과 일치
인증서가 유효하지 않다면, "이 사이트는 안전하지 않습니다" 경고 발생 🚨
4️⃣ 클라이언트와 서버가 암호화 방식(키 교환 알고리즘) 협상
클라이언트가 대칭키를 생성, 대칭키를 공개키로 암호화 (Key Exchange)
서버는 자신의 개인 키(Private Key)로 복호화하여 대칭키를 얻음
5️⃣ 보안 세션 키를 생성하여 데이터를 암호화하여 전송
보안 세션 시작 (TLS Handshake 완료)
- 이제 클라이언트와 서버는 같은 대칭키를 공유
- 이후의 모든 통신은 이 대칭키로 암호화됨(빠르고 안전함)
- 클라이언트와 서버는 대칭키를 이용해 데이터를 암호화하여 주고받음
🔥 이 과정을 거쳐 브라우저와 서버 간 안전한 연결이 맺어진다!
📌 4. SSL 인증서란?
SSL을 사용하려면 신뢰할 수 있는 기관(CA, Certificate Authority)에서 발급한 SSL 인증서가 필요하다.
인증서에는 도메인 정보, 기관 정보, 공개 키(public key) 등이 포함되어 있다!
🔹 SSL 인증서의 종류
| 인증서 종류 | 특징 |
| DV (Domain Validation) | 가장 기본적인 인증서, 도메인 소유자 확인 |
| OV (Organization Validation) | 기업 정보까지 검증, 신뢰도 ↑ |
| EV (Extended Validation) | 최상위 보안 수준, 브라우저 주소창에 회사 이름 표시 |
⭐ Let's Encrypt 같은 무료 인증서도 많이 사용된다!
📌 5. HTTPS와 SSL의 관계
- HTTPS = HTTP + SSL/TLS
- 기존 HTTP 프로토콜을 SSL/TLS로 감싸서 보안이 강화된 통신 방식
- 웹사이트에서 https://로 시작하면 SSL/TLS를 사용 중인 것!
📌 6. MSA에서 SSL 적용하는 방법
➡️ MSA 환경에서는, API Gateway에서 HTTPS를 처리하고 내부는 HTTP를 유지하는 방식이 일반적!
➡️ 하지만 내부 서비스 간에도 보안이 중요하다면 SSL을 활성화하는 게 좋다! 😊🚀
📌 7. SSL 적용 방법
✅ 7-1. API Gateway에서 SSL 적용 (Nginx, Spring Cloud Gateway)
클라이언트와 Gateway 간 보안 강화
방법 1️⃣: Nginx를 사용하여 SSL 적용 (Let's Encrypt 또는 자체 인증서 사용)
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://backend-service;
}
}
➡️ 이러면 API Gateway가 HTTPS를 처리하고, 내부 서비스는 HTTP로 유지 가능!
방법 2️⃣: Spring Cloud Gateway에서 SSL 적용
application.yml
server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: yourpassword
key-store-type: PKCS12
➡️ Gateway 자체에서 HTTPS 지원 가능!
✅ 7-2. 서비스 간 SSL 적용 (Spring Boot, Eureka, Feign 등)
서비스 간 통신도 암호화해야 할 경우
1️⃣ 각 서비스에서 HTTPS 활성화
application.yml
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: yourpassword
key-store-type: PKCS12
2️⃣ Feign Client에서 HTTPS 사용
@FeignClient(name = "user-service", url = "https://user-service:8443")
public interface UserServiceClient {
@GetMapping("/users/{id}")
UserResponse getUser(@PathVariable Long id);
}
🔥 이제 UserService로 HTTPS 요청을 보낼 수 있다!
✅ 7-3. Eureka & Config Server에서 SSL 적용
1️⃣ Eureka 서버에서 HTTPS 활성화
application.yml
server:
port: 8761
ssl:
key-store: classpath:eureka-keystore.p12
key-store-password: eurekapass
key-store-type: PKCS12
2️⃣ 클라이언트에서 Eureka에 HTTPS로 등록
eureka:
instance:
secure-port-enabled: true
non-secure-port-enabled: false
hostname: eureka.example.com
client:
service-url:
defaultZone: https://eureka.example.com:8761/eureka/
📌 8. 정리: 어디에 SSL을 적용할까?
| 적용 대상 | SSL 적용 여부 | 비고 |
| API Gateway ↔ 클라이언트 | ✅ 필수 | 외부 트래픽 보호 (HTTPS) |
| API Gateway ↔ 내부 서비스 | ❌ 선택 | 내부 네트워크라면 HTTP 가능 |
| 서비스 ↔ 서비스 | 🔥 권장 | 중요한 데이터 전송 시 HTTPS |
| Eureka, Config Server | 🔥 권장 | 보안 강화 필요 시 HTTPS |
📌 9. SSL 인증서 발급 및 적용 방법 🔒
SSL 인증서를 발급하고 적용하는 방법에는 공식 인증기관(CA)을 통한 발급과 OpenSSL을 이용한 자체 발급 방법이 있다.
✅ 9-1. SSL 인증서 발급 과정 (공식 CA vs OpenSSL 자체 발급)
SSL을 적용하려면 아래 3가지 파일이 필요하다.
- Private Key (.key): 서버에서 생성하는 비밀 키 (외부에 노출되면 안 됨)
- CSR (.csr): 인증서 서명 요청 파일 (CA에서 인증서 발급 시 필요)
- CRT (.crt): CA에서 발급해주는 SSL 인증서 파일 (서버에서 사용)
📌 OpenSSL과 공식 CA의 SSL 인증서 발급 절차 차이점
OpenSSL과 공식 CA의 발급 절차는 비슷하지만 차이점이 있다!
🔹 공통점 : 둘 다 Private Key와 CSR을 생성해야 함.
🔹 차이점 :
- OpenSSL 자체 발급은 스스로 CA 역할을 하여 인증서를 발급함 (브라우저 신뢰 X)
- 공식 CA는 제3자 인증기관(CA)에서 서명하고, 브라우저에서 신뢰할 수 있도록 보증함.
💡 공식 CA의 발급 과정은 더 많은 검증 절차가 필요하고, OpenSSL 자체 발급은 빠르지만 보안상 신뢰를 얻기 어려움
🔥 OpenSSL 방식 vs. 공식 CA 인증 방식 비교
| 방식 | 공식 CA 발급 (유효한 SSL) | OpenSSL 자체 발급 (Self-Signed) |
| 보안성 | ✅ 신뢰할 수 있음 | ❌ 신뢰할 수 없음 (브라우저에서 경고) |
| 신뢰도 | ✅ 모든 브라우저에서 인정 | ❌ 사용자가 직접 인증서 신뢰 설정 필요 |
| 사용 목적 | 상용 웹사이트, 서비스 운영 | 내부 테스트, 로컬 환경 |
| 비용 | 유료(유명 CA) / 무료(예: Let's Encrypt) | 무료 |
🚨 공식 CA에서 발급받은 인증서는 브라우저에서 신뢰하지만, OpenSSL 자체 발급 인증서는 '안전하지 않음' 경고가 뜰 수 있다!
✅ 9-2. 공식 SSL 인증서 발급 (CA를 통한 인증)
🔹 과정 요약
Private Key 생성 → CSR 생성 → CA 제출 → CA에서 검증 후 인증서 발급 → 서버에 적용
🔹발급 절차
1️⃣ CSR(Certificate Signing Request) 생성
- 공식 CA에서도 OpenSSL을 이용해 Private Key와 CSR을 만들 수 있음
- 서버에서 **CSR 파일(인증서 서명 요청 파일)**을 생성해야 함
- openssl genrsa -out my_private.key 2048
- openssl req -new -key private.key -out request.csr
2️⃣ CA에 인증서 요청 및 도메인 소유권 인증
- CA(예: Let's Encrypt, DigiCert, GlobalSign 등)에 CSR 파일을 제출
- 도메인 소유 확인(DNS, 이메일, 파일 업로드 방식 등) 후 인증 진행
- ✔ 유료 SSL : DigiCert, GlobalSign, Comodo 등
- ✔ 무료 SSL : Let's Encrypt (자동 갱신 필요)
3️⃣ SSL 인증서 발급
- 인증이 완료되면 CA에서 SSL 인증서를 발급함 (.crt 또는 .pem 파일)
4️⃣ 서버에 SSL 적용
- 발급된 인증서를 웹 서버(Nginx, Apache, Tomcat 등)에 설정
- HTTPS 활성화
✅ 9-3. OpenSSL을 이용한 자체 발급 (Self-Signed Certificate)
내부 테스트용으로 사용할 경우 OpenSSL을 이용해서 직접 인증서를 발급할 수도 있다!
🔹 과정 요약
Private Key 생성 → CSR 생성 → 자체 서명된 인증서 발급 → 서버에 적용
🔹 발급 절차
- https://code.google.com/archive/p/openssl-for-windows/downloads
- 다운로드 후 압축해제
해당파일/bin/openssl.exe를 실헹합니다.
(안되시는분들은 cmd 로 해당 경로 이동 후 , openssl.exe 혹은 관리자권한으로 실행해보세요)
1️⃣ 비공개 키(private key) 생성
openssl genrsa -out my_private.key 2048
(공개키: openssl rsa -in private.key -pubout -out public.key)
2️⃣ CSR 파일 생성 (인증서 요청 파일)
openssl req -new -key my_private.key -out my_request.csr
3️⃣ 자체 서명된 SSL 인증서(CRT) 생성
openssl x509 -req -days 365 -in my_request.csr -signkey my_private.key -out my_certificate.crt
⭐ 이렇게 하면 my_certificate.crt 인증서가 생성됨!
🚨 하지만, 공식 CA에서 발급받은 게 아니기 때문에 신뢰할 수 없는 인증서로 인식됨!
✅ 9-4. SSL 적용 방법 (Nginx & Spring Boot 예시)
발급받은 인증서를 웹 서버에 적용하는 방법
✅ 9-4-1. Nginx에서 SSL 적용
server {
listen 443 ssl;
server_name mydomain.com;
ssl_certificate /etc/ssl/certs/my_certificate.crt;
ssl_certificate_key /etc/ssl/private/my_private.key;
location / {
proxy_pass http://localhost:8080;
}
}
- ssl_certificate : 발급받은 .crt 파일 경로
- ssl_certificate_key : 개인 키 .key 파일 경로
✅9-4-2. crt와 key를 p12로 변환
Tomcat은 .crt와 .key를 바로 사용할 수 없고, .p12(PKCS12) 또는 .jks(Java Keystore) 형식이 필요!
openssl pkcs12 -export -in my_certificate.crt -inkey my_private.key -out my_keystore.p12 -name tomcat
💡 비밀번호를 입력하라고 나오면, 이후 Tomcat 설정에서 사용할 비밀번호를 입력하면 됨
✅ 9-4-3. server.xml 설정 (Tomcat에 SSL 적용)
Tomcat의 server.xml을 열어서 아래처럼 추가!
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="C:/path/to/my_keystore.p12"
type="PKCS12"
certificateKeystorePassword="mypassword"/>
</SSLHostConfig>
</Connector>
✔ certificateKeystoreFile : .p12 파일의 경로
✔ certificateKeystorePassword : .p12 파일을 만들 때 입력한 비밀번호
🚀 이제 Tomcat을 재시작하면 HTTPS(포트 8443)가 활성화됨!
✅ 9-4-4. Spring Boot에서 SSL 적용
application.yml
server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: mypassword
key-store-type: PKCS12
- keystore.p12 파일을 생성해서 설정하면 Spring Boot에서도 HTTPS 사용 가능!
🚀 결론
✅ 운영 환경에서는 공식 CA에서 발급받은 인증서를 사용해야 함 (보안 및 신뢰도 문제)
✅ 테스트 환경에서는 OpenSSL로 자체 발급하여 사용할 수도 있음
✅ MSA 환경에서는 API Gateway(Nginx, Spring Cloud Gateway 등)에서 SSL을 적용하는 게 일반적
'study > 보안' 카테고리의 다른 글
| SSO란? (0) | 2025.11.29 |
|---|---|
| JWT란? (JSON Web Token) (0) | 2025.02.16 |
| 저장소 비교 (0) | 2024.12.01 |
| 방화벽/IDS/IPS (0) | 2024.03.12 |
| CNAPP (CWPP/SCPM/CIEM) (0) | 2024.03.12 |