인터넷 검색창을 통해 http라는 단어를 자주 접할 것 이다. 도대체 http가 무엇일까?
정의를 알아보자면 다음과 같다.
HTTP(Hyper Text Transfer Protocal)
인터넷에서 하이퍼 텍스트 문서를 전송할 때 어떤 방식으로 주고 받아야 하는지 정해놓은 규칙이다.
웹은 클라이언트 - 서버 구조로 클라이언트가 리소스들(HTML 등)을 요청하고 서버는 갖고 있는 요청한 리소스를 클라이언트에게 주는 방식으로 설계되어 있다.
이렇게 주고 받을 때, 여러 가지의 규칙을 지키면서 리소스를 전달한다. 어떤 규칙들이 있는지 살펴보도록 하자.
서버는 HTTP 메서드를 활용하여 특정 요청 방식에 따른 응답 환경(REST API)을 구축한다. 요청/응답 방식의 종류는 다음과 같다.
가장 대표적인 방식으로 GET과 POST방식을 많이 사용한다.
일반적으로 검색창에 검색을 하거나, 쇼핑몰의 리스트를 가져올 때 등의 읽기 작업을 할 때 사용되는 메서드이다.
GET 방식은 서버에 데이터를 전송하기 위해 Query String이라는 것을 사용한다.
주소창에 ?id=1234&sort=like과 같이 클라이언트의 데이터를 주소창에 저장하여 이를 서버에 전송하여 사용하는 쿼리 스트링이라는 것이 존재한다.
이러한 방식은 데이터가 주소창에 그대로 노출되기 때문에 보안상에 위험이 높다.
// 가상의 데이터베이스
let users = [
{ id: 1, name: 'John Doe', email: 'john.doe@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane.doe@example.com' }
];
// 모든 사용자 조회
app.get('/users', (req, res) => {
res.status(200).json(users);
});
블로그 글쓰기, 회원가입 하기, 댓글 달기 등의 쓰기 작업을 할 때 사용되는 메서드이다.
POST방식은 서버에 데이터를 전송할 때, Query String뿐만 아니라 요청 헤더에 body를 포함 시킬 수 있다. body에는 각종 데이터들을 담아 서버에 전송할 수 있다.
GET방식과 비교해 봤을 때, POST는 클라이언트의 데이터를 주소창에 노출시키지 않아 비교적 더 안전하다고는 할 수 있지만 POST방식이 보안에 안전하다는 것은 아니다.
// 새로운 사용자 생성
app.post('/users', (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name,
email: req.body.email
};
users.push(newUser);
res.status(201).json(newUser);
});
아이디를 변경하거나 게시글을 수정하는 등 리소스의 업데이트를 할 때 사용되는 메서드이다.
리소스를 변경하는 메서드가 왜 2가지가 존재할까?
서버의 상태 변화의 차이라고 한다. PUT은 리소스 전체를 변경하는 반면에 PATCH는 리소스 일부를 변경할 때 사용한다고 한다.
예를들어, 다음과 같은 데이터가 있다고 가정하자
{
id: 1,
name: "김철수",
age: 13,
}
나이를 20으로 바꿔달라는 요청을 PUT, PATCH로 각각 했을 때의 사용자 정보의 상태를 보자
PUT /user/1
// 나이 20변경 요청
{ age: 20 }
상태:
{
id: ,
name: ,
age: 20
}
PATCH /user/1
// 나이 20 변경 요청
{ age: 20 }
상태:
{
id: 1,
name: "김철수",
age: 20
}
이론적인 지식은 위와 같지만, 결국엔 직접 저런식으로 동작하게 하는 것은 개발자의 몫이다. PUT, PATCH라고 저런 기능을 제공하는 것이 아니다.
상태 코드는 서버의 처리 결과 상태가 어떠한지 숫자로 표현한 것이다. 상태 코드의 자세한 정보는 MDN에서 확인하면 도움이 될 것이다. 상태 코드의 대략적인 종류는 다음과 같다.
임시 응답으로 현재 클라이언트의 요청까지는 처리되었으니 계속 진행하라는 의미이다.
클라이언트의 요청이 서버에서 성공적으로 처리되었다는 의미이다.
서버의 주소 또는 요청한 URI의 웹 문서가 이동되었으니 그 주소로 다시 시도하라는 의미이다.
없는 페이지를 요청하는 등 클라이언트의 요청 내용이 잘못된 경우를 의미한다.
서버 처리에 문제가 발생한 경우이다. 서버 과부하, DB 오류 등의 경우를 의미한다.
보안 기술을 추가한 HTTP라고 보면 된다. 특히나 개인정보가 중요해진 요즘은 더욱 더 HTTPS 사용을 권장한다.
클라이언트와 서버가 처음 연결을 시도할 때, SSL/TLS 핸드셰이크 과정을 통해 보안 연결을 설정한다.
=> 이 과정에서 서버는 인증서를 제공하고, 클라이언트는 이를 검증한다.
핸드셰이크가 완료되면, 클라이언트와 서버는 세션 키를 생성하여 이후의 데이터 전송을 암호화한다.
생성된 세션 키를 사용하여 클라이언트와 서버 간의 데이터가 암호화되어 전송된다.