LG CNS 부트캠프 학습일지 46일차
학습 내용
- cURL을 사용해서 리퀘스트 바디 보내기
- MSA에 Spring Security 적용하기
- Spring Config 서버 만들기
cURL을 사용해서 리퀘스트 바디 보내기
실습할 때는 Postman이라는 응용프로그램을 사용하지만, 새로운 프로그램을 컴퓨터에 설치하고 싶지 않아서 윈도우 11에서 기본적으로 제공하는 명령어를 사용하기로 했다. 주의할 것은 curl 명령어가 아니라 curl.exe 를 사용해야 한다는 것이다.
1
2
3
4
5
curl.exe
--request GET
--header "Authorization: Bearer <token>"
--header "Content-Type: application/json"
http://localhost:8080/users
이것저것 입력해야 하는게 많아서 웹 프로그래밍을 배우기 전에는 불편하다고 생각했는데, 직접 사용해보니 그렇지 않았다. 물론 하나하나 입력하는게 불편하긴 하지만 무식하게 외우는 것이 아니라 서버에 무엇을 전달해야 하는지 이해하니까 자연스럽게 쓸 수 있는 것 같다.
하지만 문제가 있었다. 리퀘스트 바디를 보내기 위해 JSON 형태의 데이터를 문자열의 형태로 전달해야했다. 대충 아래와 같지 않을까 싶었다.
1
2
3
4
5
6
curl.exe
--request POST
--header "Authorization: Bearer <token>"
--header "Content-Type: application/json"
--data '{ "email": "example@email.com", "password": "password" }'
http://localhost:8080/users
하지만 상따옴표 escaping을 하지 못하는 문제가 있었다. 그래서 쌍따옴표 앞에 escaping 문자를 사용해봤다.
1
2
3
4
5
6
curl.exe
--request POST
--header "Authorization: Bearer <token>"
--header "Content-Type: application/json"
--data "{ \"email\": \"example@email.com\", \"password\": \"password\" }"
http://localhost:8080/users
하지만 이것으로도 해결할 수 없었다.
인공지능도 제대로된 답변을 내놓지 못했는데, Stack Overflow를 검색해서 이런 방법을 찾을 수 있었다.1
Try using the –% operator to put PowerShell into simple (dumb) argument parsing mode
생각보다 간단했다. --% 를 사용해서 PowerShell이 인자를 다루는 방식을 변경시키는 것이다.
1
2
3
4
5
6
7
curl.exe
--%
--request POST
--header "Authorization: Bearer <token>"
--header "Content-Type: application/json"
--data "{ \"email\": \"example@email.com\", \"password\": \"password\" }"
http://localhost:8080/users
MSA에 Spring Security 적용하기
JSON Web Token을 사용한다. 로그인할 때 발행받은 엑세스 토큰을 HTTP 요청을 보낼 때 같이 보내서 인증을 할 수 있다. 토큰 발행은 User Service 서버에서 하지만, 토큰을 검증하는 것은 API Gateway 서버에서 담당한다.
Environment 객체
application.yml 파일에서 정의한 값을 읽어들일 때 @Value라는 어노테이션을 사용했다. 그런데, application.yml 파일에서 정의한 값을 읽어들이는 다른 방법이 있었다. Environment 객체를 사용하는 것이다. Environment#getProperty()의 반환값은 문자열이기 때문에 사용할 때 주의가 필요해보인다.
1
2
3
4
5
6
7
8
public class MyClass {
@Autowired
private Environment environment;
public void doSomething() {
String port = environment.getProperty("local.server.port");
}
}
필터 구현하기
Spring Security는 필터 체인으로 구성되어 있다. 필터들이 일정한 순서를 이루고 있는데, 개발자는 커스텀 필터를 구현할 수 있고, 원하는 순서에 삽입할 수 있다. HttpSecurity#addFilterBefore() 메소드를 사용해서 구현한 필터를 삽입하는 것을 배웠는데, 아예 기존 필터를 대체하게 할 수도 있었다. HttpSecurity#addFilter()이다. 대신 이것이 가능하려면 커스텀 필터가 대체하려는 필터를 상속해야 한다.
1
Spring Config 서버 만들기
Monolithic한 서버가 아니라 분산화된 서버를 만들었을 때 발생하는 문제가 하나 있다. 각 서버의 설정도 분산되어 있다는 것이다. Spring Config 서버를 만들었을 때 장점은 다음과 같다:
- 서버의 설정값을 한 곳에 모아서 관리할 수 있다.
- 서버의 설정값을 런타임에 적용할 수 있다.
이것을 구현하기 위해 Spring Config 서버와 설정 파일을 가지고 있는 깃 저장소가 필요하다. Spring Config 서버가 깃 저장소에 저장된 설정 파일을 내부 서버에게 뿌려주는 방식이다. Spring Config 서버의 application.yml 파일은 다음과 같다.
1
2
3
4
5
6
7
spring:
cloud:
config:
server:
git:
uri: file:///path/to/git/repository
default-label: master
Comments powered by Disqus.