들어가며
- 취업 준비를 하는데, 이러한 지식들이 이해도 안되고 당장에 쓸모가 없어보일 수 있다.
- 하지만 개발자는 안주하는 것이 아니라 새로운 지식과 문제 해결방법을 찾는 것이 당연하다.
- 지금 미리 습관을 들이고 싶다.
- 무엇보다 새로운 것을 알다가 이전에 이해가 안됬던 것이 지금 와서야
이해가 되고 하는 것들이 많아 당장 이해하지 못하더라도 접하는 것이 우선일 것 같다.
- 그리고 새로운 것을 배우면서 자연스럽게 익히고 이런 것들이 있구나 시야를 넓히고 싶다.
6월 13일
HTTP Interfaces
-
java 11 jdk 에서 제공하는 클래스들로 HTTP 클라이언트를 만드는 것은 어려웠다.
-
기존에는 rest template, web client 등을 사용했으나 여전히 더 높은 레벨의 것이 필요하다. 그리고 재사용가능한 boilerplate가 필요하다.
- RestTemplate 참고
- Spring 3부터 지원, REST API 호출이후 응답을 받을 때까지 기다리는 동기 방식
- 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿
- AsyncRestTemplate
- Spring 4에 추가된 비동기 RestTemplate이다.
- WebClient
- Spring 5에 추가된 논블럭, 리엑티브 웹 클라이언트로 동기, 비동기 방식을 지원한다.
-
스프링 6에서는 이를 제공한다. 코드를 중복해서 작성할 필요없이 interface에서 선언, 구현
-
아직 snapshot 버전. 스프링부트에서는 auto configuration으로 이러한 과정을 손쉽게 다룰 것
- snapshot이란? 아직은 안정화 되지 않은 데일리 빌드버전
- 오늘은 될 수 있는데, 내일은 안 될 수 있다.
-
Jsonplaceholder
- backend server가 없을때 임시로 가상 데이터를 만들어 api 테스트를 해볼수 있습니다
-
webclient를 위해 선언형(declaretive) HTTP clients는 어느정도 reactive class가 요구된다.


⇒ 이러한 기술들은 새로운 것이 아니라 open feign과 retrofit이라는 프로젝트에서 구현됬었던 것이다.
- 장점
- 더 이상 third-party dependency가 아니라는 것. Spring이 자체적으로 갖고있다.
- third-party: 프로그래밍 개발과 개발자 사이에 플러그인, 라이브러리, 프레임워크를 서드파티로 볼 수 있다.
6월 14일
Graphql
언어를 공부할 때, 생각해볼만한 점
- 어디서 생긴 것
- 왜 생긴 것인지
- 어떠한 문제를 해결하는지
- 누가 배워야하는가?
어디서?
- 페이스북에서 2012년 만들고 2015년 오픈소스 Spec의 형태로 배포하였다.
- Spec(specification)은 문서에 작성된 규칙의 종류라는 뜻이다. 그저 아이디어, 개념이기 때문에 각 언어에 맞게 implementation한 코드를 가져다가 사용하면 된다.
왜 생겼는가?
-
REST API 문제 해결을 위해
- REST API는 over fetching, under fetching 문제
-
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
}
}
느낀점
- 현재 라이징 캠프에서 각 API 마다 Req와 Res를 다르게 해주고 있는데, 이게 그냥 DTO를 사용했던 것보다는 좀 더 graphql 과 비슷하다. 물론 graphql은 요청을 매번 다르게 해줄 수 있다는 게 장점이다.
REST API
참조: 노마드코더
6월 16일
출처: 유튜브: 테코톡
목적
- Form? Form Validation?
- Form을 검증하지않으면 어떠한 문제점?
- Client Side에서 어떻게 처리해야할지?
- Form은 사용자와 웹사이트 간의 상호작용을 도와주는 녀석.
- 즉, 웹사이트에 정보를 보낼 수 있는 입력창구

-
Get은 HTTP Header에, Post는 Body에 데이터를 태운다. Post가 비교적 Get보다 안전해보이나, 개발자도구나 다른 Tool들로 충분히 조작이 가능하니 무조건 신뢰해선 안된다.
-
HTML5부터는 Form 태그에서 어느정도 유효성 검증 가능.
-
입력양식
- input
- textarea: 두 줄 이상의 input
- button: 버튼, 제출, 초기화
- input으로 button을 만들면 닫는 게 없기에 안에 텍스트 불가, 시멘틱을 위해 button으로!
- select
- output: 결과값
- fieldSet: radio 등
-
기본적으로 데이터가 올바르게 들어왔는지 확인
-
가장 중요한 측면
- 보안
- 나쁜 사용자 막기, 이상한 값이 DB에 저장되지않도록
- Ux
- 사용자 편의성
-
Client Validation은 미리 사전 검증을 해서 Server에 부하를 줄게하지만 CT에 의해 쉽게 조작될 수 있는 단점이 있다. 그리고 나쁜 사용자가 악성 자바스크립트 파일을 삽입하거나 프록시 Tool을 이용해 우회해 잘못된 입력값을 서버에 보내게되면, 서버에 잘못된 데이터가 저장될 수 있다.
-
Server Side Valiation은 CT에서 어떤 값이 오더라도 서버 측에서 검증하고 데이터 저장하기에 저장된 데이터의 신뢰도가 높다.
==> 그럼에도 매번 서버로 검증한다면 서버 측에 부하를 주고, 필터링 우회 가능시 잘못된 데이터 저장하게 될 수도 있다.
-
OWASP: Open Web Application Security Project 비영리조직
-
보안상 이슈(웹 취약점)가 되는 항목들 Top 10(2021년 기준)

-
이 중에서 XSS 공격과 SQL Injection이 해당된다.
Xss 공격(Cross Site Scripting)
-
관리자 권한이 없는 사용자가 Form을 통해 악성 스크립트를 웹사이트에 삽입하는 공격이다.
-
종류: Stored, Reflected, DOM Based
1. Stored XSS: 입력 폼에 Script 형식
<script> @@@ <script>
- 이런 식으로 입력하여 악성 스크립트 삽입 -> DB에 저장 -> 조회될 때, script가 실행되니 사용자의 쿠키가 해커에게 전송되거나, 리다이렉션 등의 공격 + DB 저장데이터이기에 불특정 다수 공격(Persistent XSS라고도 불리는 이유)
2. Reflected XSS
- XSS 취약점이 있는 사이트를 발견해 사이트를 통해서 민감한 정보를 획득할 수 있는 공격용 URL 생성
- 이 URL을 이메일 등을 통해 사용자로 보내서, 사용자가 클릭하면 해당 코드가 웹사이트에 갔다가 사용자에게 반사되어 사이트 정보를 공격자에게 전송하게 된다.
- 이 정보를 통해 해커는 해당 사이트에 로그인해 사이트 공격 가능
3. DOM Based XSS
- 사용자의 브라우저에서 DOM 환경을 수정해 CT 측 코드가 예상치 못한 방식으로 동작하게 하는 XSS 취약점
- Stored나 Reflected는 서버에서 사용자의 요청을 처리하는 과정에서 응답페이지에 해당 악성 스크립트가 포함되어 브라우저에 전달되는 반면, DOM Based는 서버와 관계없이 CT측인 브라우저에서 DOM을 이용해 동적으로 페이지를 조작할 떄 발생하는 취약점
- 서버를 거치지않고 바로 DOM에 적용되는 공격이기에 문제를 찾기 어렵다.
=> 흠.. 내 생각에는 DOM Based Xss는 서버를 거치지않기에 사용자 정보 탈취보다는 사이트 망가뜨리기? 사용자 불편? 등의 문제를 만들지 않나 싶다.
SQL Injection
- CT의 입력 값을 조작해 서버의 DB 공격
- 보통 사용자 입력데이터를 제대로 검증하지않으면 발생하는 문제다.

어떻게 해야할까?
- Vanilla JS가인 대부분의 프론트엔드 라이브러리나 프레임워크에는 이미 이러한 공격들에 여러 방법들로 대비되어있다. 공식문서에 Security에 대한 내용들을 살피자
UX 측면에서 검증을 해야하는 이유
-
CT가 회원가입을 하려고하는데, 정규식, 길이 수 제한, 중복 등으로 인해 처리가 안되는 경우를 사용자에게 친절하게 알려줘야한다.
-
폼 형식은 다 다르기 때문에, 폼 검증은 정답이 없다.
좋은 UX를 위해 나아가야하는 검증의 방향
-
명확하고 쉽게 메시지를 전달하는가?
- 잘못된 값이 어떻게 잘못되었고, 어떤 식으로 수정되어하고, 올바른 값인지 알려줘야한다. CT가 잘 하고있는지 확인.
-
눈에 잘 띄는 메시지 ex) 색깔
-
사용자에게 적당한 때에 오류를 알려주기
- 언제 검증? 사이트 진입 시, 입력 폼이 focus된 후에, focus되고나서 입력하고 있을 때, 사용자가 다 입력을 하고 다른 input으로 옮길 때 등
===> 무엇이 제일 좋을지 생각해보자
검증방법
- HTML5 Built in FOrm Validation
- 대부분의 브라우저에서 제공
- 단점: 사용자에게 일관된 경험을 주지 못할 수 있다. 브라우저마다, 입력 태그마다 다르기에
- Using JS를 통해 직접 검증 로직 구현
- Constraint Validation API를 통해 검증을 Customizing할 수 있다.
- 필수적인 검증 로직이 비슷하다보니 이미 Form에 대한 상태관리, 기본적인 검증까지 많이 해준다.
