[Spring] HTTPS 적용하기

2024. 2. 17. 20:54Web/Spring

[Spring] HTTPS 적용하기

 

[HTTP] HTTPS란? (tistory.com)

 

[HTTP] HTTPS란?

[HTTP] HTTP / HTTPS란? 학습하는 웹 프로젝트에 HTTPS를 적용하기 위해 HTTPS를 먼저 알아보게 되었다. 기존 HTTP는 인터넷상에서 데이터를 주고받기 위한 프로토콜이었다. 해당 프로토콜은 웹 브라우저

skyriv312079.tistory.com

 

학습하던 스프링 프로젝트에 HTTPS를 적용하고자 한다. 단계는 다음과 같이 이루어진다

 

  1. SSL/TLS인증서 생성
  2. Spring Boot - application.yml 작성
  3. 코드 수정
  4. 실행 후 postman으로 테스트 

 

SSL/TLS 인증서 생성

 

 먼저 SSL/TLS 인증서를 생성해야 한다. 방법은 두 가지가 있다. 첫 번째는 자체적으로 서명한 인증서를 사용하거나 혹은 인증기관에서 구매한 SSL 인증서를 사용하면 된다. 하지만 이번 프로젝트 같은 경우 학습을 위한 개인 프로젝트이기에 keytool을 사용하여 자체적으로 서명한 인증서를 만들어서 사용했다.

 

// 터미널에 입력
keytool -genkey -alias myapp -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
  •  
  • -genkeypair : 키 쌍을 생성하는 옵션
  • -alias [mykeypair] : 해당 키 쌍에 맞는 별칭을 지정
  • -storetype : 키 저장 형식 : PKCS12 사용
    • PKCS12 : 공개 키 기반 보안 표준, 개인 키와 해당 인증서를 단일 보안 파일에 저장하는 데 사용되는 파일 형식
  • -keyalg : 사용하고자 하는 key의 알고리즘 지정 : RSA 알고리즘 사용
    • RSA : 비대칭 키 암호화 알고리즘, 공개 키와 개인 키를 사용하여 데이터를 암호화 및 복호화하는 데 사용
  • -keysize : key의 크기 지정 : 2048 비트로 지정
  • -validity : 인증서의 유효기간 지정

해당 명령어가 실행이 되면 사용자는 여러 질문들을 받게 된다. 해당 질문에 맞게 답변을 하면 된다.

 

Spring Boot - application.yml

 

생성한 인증서를 사용할 수 있게 application.yml 혹은 properties에 내용을 작성해야한다.

server:
  port: 8443
  ssl:
    key-store: [키가 저장된 경로]
    key-store-type: [키 저장 형식]
    key-alias: [키 지정 별칭]
    key-store-password: [키 저장 비밀번호]

 

코드 수정

 

Spring security 관련하여 코드를 수정해야 한다.

해당 어노테이션을 사용해야 하며 이전까지는  WebSecurityConfigurerAdapter를 상속하여 사용을 했지만 spring security가 업데이트되면서 WebSecurityConfigurerAdapter는 사용불가가 되었다.

@EnableWebSecurity

 

변경된 방식으로는 filterChain을 통해서 작성이 되어야 하며 이때 filterChain의 경우 직접 @Bean으로 설정을 등록해야 한다

 

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf((csrf) -> csrf.disable())
        .cors(Customizer.withDefaults()); // cors 설정

    http.headers((headers) ->
        headers.xssProtection(Customizer.withDefaults())
            .contentSecurityPolicy(Customizer.withDefaults())); //xss 설정

    http.authorizeHttpRequests(
        (auth) -> auth
            .anyRequest().authenticated()
    );

   
    return http.build();
}

 

 

실행 후 PostMan으로 테스트

postman 실행창

주어진 조건에 맞게 값을 body에 넣어서 전달하였다. 이때 확인을 위해서 https의 적용 및 포트 번호를 변경해서 요청과 응답 값을 확인하였다.