HTTP Interfaces
java 11 jdk 에서 제공하는 클래스들로 HTTP 클라이언트를 만드는 것은 어려웠다.
기존에는 rest template, web client 등을 사용했으나 여전히 더 높은 레벨의 것이 필요하다. 그리고 재사용가능한 boilerplate가 필요하다.
스프링 6에서는 이를 제공한다. 코드를 중복해서 작성할 필요없이 interface에서 선언, 구현
아직 snapshot 버전. 스프링부트에서는 auto configuration으로 이러한 과정을 손쉽게 다룰 것
Jsonplaceholder
webclient를 위해 선언형(declaretive) HTTP clients는 어느정도 reactive class가 요구된다.
⇒ 이러한 기술들은 새로운 것이 아니라 open feign과 retrofit이라는 프로젝트에서 구현됬었던 것이다.
REST API 문제 해결을 위해
API: 서버와 통신하기위해 만들어진 인터페이스(볼 때마다 생각해보게 된다). 클라이언트는 서버와 API를 이용하여 통신한다. 가장 유명한 것이 REST API
REST API의 특징
- 이해하기 쉽다. 매번 새로운 url을 만든다.
- 여러개의 url을 활용하여 작동. 모든 url은 고유하고, 각기 다른 데이터를 제공한다.
- controller와 달리 웹사이트를 주는 것이 아니라 데이터를 JSON 포맷으로 제공
over fetching
under fetching
목적: 조회 속도 증가
- 실제 필요한 정보만 특정하여 요청한다면 DB 작업 최소화, 서버와 클라이언트 간의 이동해야하는 데이터도 작아져서 로딩시간 감소
How?
- Graphql은 query이기 때문에 정확하게 필요한 정보만 요청할 수 있게 해준다. Graphql을 통해 query를 전달하면 그에 맞게 정보를 얻는 것.
// Over fetching 해결: 나는 제목 데이터만 조회하고 싶다.
{
upcoming{
title
}
}
결과
{
"upcoming": [
{"title": "The Northman"},
{"title": "Dune" }
]
}
// UnderFetching 문제 해결: 나는 한번에 두 개의 API로부터 데이터를 얻고 싶다.
{
upcoming{
title
}
nowPlaying{
title
popularity
}
}
참조: 노마드코더
처음부터 잘 설계해놔야, 멤버, 유저들도 제대로 활용할 수 있다.
- 즉, 명백한 패턴이 있어야 통용될 수 있다.
규칙
제일 깔끔한 예시
검색이나 필터링
출처: 유튜브: 테코톡
Get은 HTTP Header에, Post는 Body에 데이터를 태운다. Post가 비교적 Get보다 안전해보이나, 개발자도구나 다른 Tool들로 충분히 조작이 가능하니 무조건 신뢰해선 안된다.
HTML5부터는 Form 태그에서 어느정도 유효성 검증 가능.
입력양식
기본적으로 데이터가 올바르게 들어왔는지 확인
가장 중요한 측면
Client Validation은 미리 사전 검증을 해서 Server에 부하를 줄게하지만 CT에 의해 쉽게 조작될 수 있는 단점이 있다. 그리고 나쁜 사용자가 악성 자바스크립트 파일을 삽입하거나 프록시 Tool을 이용해 우회해 잘못된 입력값을 서버에 보내게되면, 서버에 잘못된 데이터가 저장될 수 있다.
Server Side Valiation은 CT에서 어떤 값이 오더라도 서버 측에서 검증하고 데이터 저장하기에 저장된 데이터의 신뢰도가 높다.
==> 그럼에도 매번 서버로 검증한다면 서버 측에 부하를 주고, 필터링 우회 가능시 잘못된 데이터 저장하게 될 수도 있다.
OWASP: Open Web Application Security Project 비영리조직
보안상 이슈(웹 취약점)가 되는 항목들 Top 10(2021년 기준)
이 중에서 XSS 공격과 SQL Injection이 해당된다.
관리자 권한이 없는 사용자가 Form을 통해 악성 스크립트를 웹사이트에 삽입하는 공격이다.
종류: Stored, Reflected, DOM Based
<script> @@@ <script>
=> 흠.. 내 생각에는 DOM Based Xss는 서버를 거치지않기에 사용자 정보 탈취보다는 사이트 망가뜨리기? 사용자 불편? 등의 문제를 만들지 않나 싶다.
'OR 1=1' 을 넣어서 무조건 True를 반환하게 되는 구문을 넣는다.
==> 비밀번호가 String이라 그럴 수 있겠다.
이외에도 Join이나 Union 같은 구문을 통해 공격자가 원하는 코드를 실행하게 할 수도 있다.
CT가 회원가입을 하려고하는데, 정규식, 길이 수 제한, 중복 등으로 인해 처리가 안되는 경우를 사용자에게 친절하게 알려줘야한다.
폼 형식은 다 다르기 때문에, 폼 검증은 정답이 없다.
명확하고 쉽게 메시지를 전달하는가?
눈에 잘 띄는 메시지 ex) 색깔
사용자에게 적당한 때에 오류를 알려주기