업데이트:

1 분 소요

HTTP와 HTTPS

  • HTTP
    인터넷상에서 데이터를 주고 받기 위한 프로토콜 클라이언트와 서버가 주고 받는 데이터는 따로 암호화되어 있지 않아서 악의적인 데이터 감청, 변조의 가능성이 있다.

  • HTTPS
    HTTP 프로토콜에 암호화가 적용되어 있는 버전으로서 클라이언트와 서버가 주고 받는 모든 데이터가 암호되어있다. 이 때 일전에 간략하게 설명했던 SSL을 사용한다.

https.png

SSL(디지털 인증서)

클라이언트는 서버가 보낸 SSL 인증서를 검증하고 신뢰할 수 있는 서버인지 확인한다.

서버가 신뢰할 수 있는 서버라면 SSL의 공개키를 이용, 데이터 암호화에 사용될 암호화키를 암호화해 서버에 전달한다.

해당 방식은 대칭키 방식이며 대칭키를 공유하기위해 RSA 암호화를 사용한다.

아래의 방법을 통해 로컬 테스트용으로 사용할 수 있는 임시 SSL 인증서를 생성할 수 있다.

  • SSL 임시 인증서 생성 방법
    1. JDK 설치 경로 bin 디렉토리 안에 있는 keytool을 찾는다.
    2. KeyStore 생성

      터미널 내에 명령어를 입력한다.

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

    3. KeyStore에서 인증서를 추출

      터미널 내에 명령어를 입력한다.

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

    4. trust-store 생성

      터미널 내에 명령어를 입력한다.

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

    임시 인증서가 적용된 https 프로토콜의 로컬 서버의 경우 유효하지 않은 인증서라는 경고가 뜬다.

SSL 적용


SSL을 적용하기 위해서는 properties가 명세되어 있는 파일과 Spring Security에 저장해야한다.

  • properties.yml

    인증서 적용을 위한 keystore 파일과 truststore를 프로젝트 내의 resources 디렉토리에 복사후 프로퍼티 설정 파일에 그 파일 이름들을 아래와 같이 명시해야한다.

      server:
          port: 443
          ssl:
              enabled: true
              key-alias: {generated_keystore_alias}
              key-store: classpath:{generated_keystore_name.p12}
              key-store-password: {generated_keystore_password}
              key-password: {key_password}
              trust-store: classpath:{generated_truststore_name.p12}
              trust-store-password: {generated_truststore_password}
                
    
  • Spring Security

    스프링 시큐리티에서는 ChannelProcessingFilter 설정을 통해 HTTPS 프로토콜을 거쳐 처리해야하는 웹 요청을 정의해야 한다.

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .requiresChannel()//필터 적용
              .anyRequest().requiresSecure()
          ;
      }
    

    ChannelProcessingFilter 내부에서는 FilterInvocationSecurityMetadataSource 클래스에 SSL이 적용된 http 프로토콜(https)로 처리해야하는 URL이 저장되고 실제적인 처리를 ChannelDecisionManager 클래스로 위임하게 된다.

댓글남기기