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 |