OpenSSL을 사용해서 localhost와 https로 통신하자

 

목표

spring security의 http basic을 이해하고 localhost와 https로 통신해본다.

 

환경

스프링 부트 3.2.0

> Dependencies

  - spring-boot-starter-web

  - spring-boot-starter-security

 

https란?

http 프로토콜을 이용한 통신에서 데이터를 암호화하여 안전하게 통신하게 한다.

 

https를 사용하면?

클라이언트가 엔드포인트를 호출하면서 받은 응답이 인증 서버에서 보낸 것이고 누구도 통신을 가로채지 않았다는 사실을 알 수 있다.

 

실습

spring security의 http basic 이해하기

hello을 응답하는 엔드포인트를 생성하자.

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello!";
    }
}

 

스프링 부트는 우리가 사용하는 종속성에 따라 구성 요소를 대신 설정한다.

https://start.spring.io/ Dependencies에 Spring Security를 추가했다면, 스프링 부트는 인증과 인가에 대한 기본 구성을 대신해준다.

인증없이 엔드포인트로 접근한다면 아래처럼 401, (Unauthorized) 응답을 받는다.

401 응답을 확인하기 위해서 -v option을 추가했다.

 

200, Ok를 받기 위해서는 스프링부트가 시작하면서 콘솔에서 알려준 password와 username으로 접근하면 된다.

curl -u {username}:{password} URL

username의 기본값은 user이다.

 

u option을 추가해서 접근한다.

혹은 브라우저 상에서 http://localhost:8080/hello을 입력하고 로그인을 통해 접근할 수 있다.

 

위 예제는 spring security의 http basic을 이용한 통신으로

기본 생성된 username과 password를 통해 접근하는 방식이다.

u option을 추가하여 보낸 요청의 Header를 자세히 보면 Authorization에 "Basic"을 접두어로 가지는 문자열을 확인할 수 있다.

이는 위 요청에 사용된 "user:d98ab680-5967-4af0-b93d-9c3c059aaf7a" 의 Base64 인코딩 값이다.

이를 확인하기 위해서는 아래의 명령어를 사용하면 된다.

 

다르게 표현하면, Header의 Authorization에 Basic 인코딩값을 추가하는 것으로도 통신할 수 있다는 것이다.

 

OpenSSL을 이용해서 자체 서명 인증서를 만들고 localhost와 https로 통신하자

다음의 명령어를 통해 자체 서명 인증서를 만들자.

# MacOs 혹은 linux 계열
# project 디렉토리에서 실행
openssl req -newkey rsa:2048 -x509 -keyout key.pem -out cert.pem -days 365
openssl pkcs12 -export -in cert.pem -inkey key.pem -out certificate.p12 -name "certificate"

위 명령어를 실행하면서 암호를 요구할텐데

나는 12345로 설정했다. 암호 이외의 요청에는 빈칸으로 제시해도 좋다.

 

만약 windows OS라면 앞에 winpty를 붙이면 된다.

위 명령어에 대한 설명은 GPT가 도와줬다.

참고로 PKCS12(Public Key Cryptography Standards)은 대부분의 인증서가 사용하는 형식이다.

 

생성된 certificate.p12 파일을 resource에 옮기자.

mv certificate.p12 ./src/main/resources

 

application.yml에 아래처럼 설정한다.

server:
  ssl:
    key-store-type: PKCS12
    key-store: classpath:certificate.p12
    key-store-password: 12345

 

이제 스프링을 재실행하자.

바뀐 password를 사용해서 아래처럼 https로 localhost와 통신해보자.

 

참고로 그냥 http로 통신하면 다음의 응답을 받는다.

TLS는 아래와 같다.

'컴퓨터과학' 카테고리의 다른 글

[소마] 블록체인 멘토링  (0) 2024.01.07
면접 대비 멘토링  (0) 2023.12.12
[운영체제] 개요  (0) 2023.10.25
리눅스  (0) 2023.09.17
OIDC, OpenID Connect 누구냐 넌  (0) 2023.07.20