모각코 8주차 모임 결과 (22.08.25 / 목요일 / 15시 ~ 18시 / Google Meet)

KIMA·2022년 8월 25일
0
post-thumbnail

목표

  • 프로그래머스 강의 듣기

결과

HTTP와 HTTPS

HTTP(Hyper Text Transfer Protocol

: 인터넷상에서 데이터를 주고 받기 위한 프로토콜

  • 클라이언트와 서버가 주고 받는 데이터는 암호화되어 있지 않음
  • 따라서, 악의적인 데이터 감청, 데이터 변조의 가능성이 있음

HTTPS(HyperT ext Transfer Protocol Secure)

: HTTP 프로토콜의 암호화 버전

  • 클라이언트와 서버가 주고 받는 모든 데이터는 암호화되어 있음
  • 데이터 암호화를 위해 SSL(Secure Sockets Layer)을 사용

SSL 암호화

  • SSL 암호화를 위해 SSL 인증서가 필요함
    1. 서버에 SSL 인증서 설치
    2. 서버는 SSL인증서를 클라이언트에 전달함
    3. 클라이언트는 서버가 전달한 SSL 인증서를 검증하고, 신뢰할 수 있는 서버인지 확인함
    4. 신뢰할 수 있는 서버라면 SSL 인증서의 공개키를 이용해 실제 데이터 암호화에 사용될 암호화키를 암호화하여 서버에 전달함
      • 실제 데이터 암복호화는 대칭키 방식
      • 서버와 클라이언트 사이의 대칭키 공유를 위해 RSA 암호화를 사용함

FilterChainProxy를 구성하는 Filter 중 하나인 ChannelProcessingFilter

: 웹 요청이 어떤 프로토콜(HTTP or HTTPS)로 전달되어야 하는지 처리

Spring Boot 웹 어플리케이션에 HTTPS 적용하기

1. 전송 레이어 보안을 위해 로컬 테스트용 SSL 인증서를 생성

  • 실제 서비스 용 : 기관에 돈을 지불하고 SSL 인증서 생성
  • 로컬 테스트 용 : keytool 도구를 이용해 임의로 SSL 인증서를 생성할 수 있음 (keytool은 Java 설치 경로 bin 디렉토리 아래에 위치함)

1-1. keystore 만들기

keytool -genkey -alias [keystore 별칭] -keyalg RSA -storetype PKCS12 -keystore [keystore 파일]

1-2. keystore 에서 SSL 인증서 추출하기

keytool -export -alias [keystore 별칭] -keystore [keystore 파일] -rfc -file [인증서 파일]

1-3. trust-store 만들기

keytool -import -alias [trust keystore 별칭] -file [인증서 파일] -keystore [trust keystore 파일]

2. Spring Boot 웹 어플리케이션에 적용

  1. keystore.p12, truststore.p12 2개 파일을 resources 디렉토리로 복사
  2. application.xml 파일에 설정 추가
    server:
      port: 443 # https 기본 포트
      ssl:
        enabled: true
        key-alias: 
        key-store: classpath:
        key-store-password:
        key-password:
        trust-store: classpath:
        trust-store-password: 
  3. Spring Security 설정
  • HTTPSecurity 클래스를 통해 ChannelProcessingFilter 세부 설정 : HTTPS 채널을 통해 처리해야 하는 웹 요청 정의
    • FilterInvocationSecurityMetadataSource 클래스에 HTTPS 프로토콜로 처리해야할 URL 정보가 담김
    • 실제적인 처리를 ChannelDecisionManager 클래스로 위임
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http
          /**
           * HTTP 요청을 HTTPS 요청으로 리다이렉트
           */
          .requiresChannel()
            .anyRequest().requiresSecure()
      ;
    }
  1. 웹 어플리케이션 시작
  2. 웹 브라우저 주소에 https://[주소] 입력
    • 정상적으로 페이지 접근을 확인할 수 있음
      - 로그인/로그아웃도 정상적으로 수행 가능
    • 로컬 테스트용 SSL 인증서가 유효하지 않기 때문에 경고가 뜸 (유효한 인증서라면 경고가 뜨지 않음)
      - 브라우저 마다 경고가 다를 수 있음 (크롬의 경우 HTTPS 연결이 사용되지 않았다는 경고 메시지 발생)

Reference
1. 프로그래머스 백엔드 데브코스

profile
안녕하세요.

0개의 댓글