HTTP 메서드에 대해 설명해주세요.
HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식을 말합니다. 쉽게 말하면 서버에 주어진 리소스에 수행하길 원하는 행동, 서버가 수행해야 할 동작을 지정하는 요청을 보내는 방법입니다.
HTTP 메소드의 종류는 총 9가지가 있다. 이 중 주로 쓰이는 메소드는 5가지로 보면 된다.
•
주요 메소드
◦
GET : 리소스 조회
◦
POST: 요청 데이터 처리, 주로 등록에 사용
◦
PUT : 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 생성
◦
PATCH : 리소스 부분 변경 (PUT이 전체 변경, PATCH는 일부 변경)
◦
DELETE : 리소스 삭제
•
기타 메소드
◦
HEAD : GET과 동일하지만 메시지 부분(body 부분)을 제외하고, 상태 줄과 헤더만 반환
◦
OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
◦
CONNECT : 대상 자원으로 식별되는 서버에 대한 양방향 연결 터널을 설정
◦
TRACE : 내가보낸 통신이 어느지점에서 에러가 났는지 추적 하기 위해서 사용하는 메소드
QueryString과 PathVariable의 차이?
PathVariable은 경로를 변수로서 사용합니다. 게시물이 존재하며 각각의 게시물을 볼 수 있는 경우, resource를 식별해야하는 상황에서는 Path Variable 가 더 적합합니다.
QueryString은 경로 뒤에 입력 데이터를 함께 제공하는 식으로 사용합니다. key, value의 쌍으로 이루어집니다. &로 연결하여 여러 개의 데이터를 넘길 수도 있습니다. 검색, 정렬이나 필터링을 해야하는 상황에서는 Query Parameter 가 더 적합합니다.
Head와 Body?
메시지의 구성은 기본적으로 출발선/헤더/바디 이렇게 나뉜다.
그리고 클라이언트 요청(Request)이냐, 서버의 응답(Request)이냐에 따라 그 내용이 달라진다.
다만 요청이나 응답 모두 메시지의 구성은 출발선/헤더/바디로 기본적으로 같다.
Request 측 메시지의 구성
1. 출발선(Start Line)
메시지의 최상단 첫 번째 줄을 의미한다.
해당 출발선에는 (GET, POST, PUT 등과 같은) HTTP메서드, URI, HTTP 버전 등이 써있다.
2. 헤더(Headers)
요청에 대한 추가적인 내용을 담고 있다.
사실 헤더도 크게 3가지 (general / requenst / entity)로 나뉘지만 결국 다 요청에 대한 추가적인 내용이다.
HOST는 클라이언트가 요청하는 호스트에 대한 정보, User-Agent는 클라이언트에 대한 각종 정보가 있다.
Accept 부분은 클라이언트 측에서 원하는 데이터 타입을 나타낸다.
위 헤더는 내용이 간단하지만 상황에 따라 더 복잡하게도 가능하고 필요한 내용을 수정해서 전달가능하다.
3. 본문(body)
본문의 경우 사실 요청의 경우 있을 수도 있고 없을 수도 있다.
응답(Response)의 경우 요청(Request)에 대한 응답 데이터를 보내야해서 본문(body)에 대부분 내용이 있다.
하지만 요청(Request)의 경우 본문이 존재하지 않는 경우도 있다.
Response 측 메시지 구성
1. 출발선(Strat Line)
요청과 마찬가지로 반응측 메시지의 출발선도 메시지 최상단 첫 째줄을 의미한다.
다만 여기는 이상한 숫자 200이 있는데 이것은 요청(Request)에 대한 응답(Response)의 응답코드다.
참고로 200은 응답이 잘되었다는 뜻이고 의외 다양한 응답 코드를 반환한다.
200이외에 유명한 응답 코드들은 404, 500 등이 존재한다.
2. 헤더(Headers)
요청(Request)측 헤더와 동일한 기능을 한다.
요청에 따른 응답에 대한 다양한 정보가 실려있다.
Content-Type은 클라이언트에게 전송된 자료의 종류, 인코딩 방식 등을 말한다.
Date는 해당 메시지가 만들어진 날짜를 말한다.
3. 본문(body)
앞서 말했듯 클라이언트는 요청할 때 body 부분이 없는 경우도 많다.
하지만 서버측이 응답할 땐 body가 거의 있다고 봐야 한다.
그래야 컴퓨터 사용자가 요청한 요청이 제대로 수행되서 결과물이 나온 것을 확인할 수 있기 때문이다.
StatusCode?
1xx (정보제공)
•
100 continue
1.
HTTP 1.1 에서 제공
2.
Expect 헤더가 전송되어지면 초기 요청내의 폼 데이터(body)는 전송되지 않는다.
3.
웹서버가 해당 응답을 할수 있도록 구현 했다면 100 continue로 응답하지만, 모든 웹서버가 그런것은 아니다.
100-continue packet header
•
Client의 100 continue 요청
•
HTTP Client Application에서 서버에 Entiti Body를 보내기 전에 해당 Body를 받을 수 있는지 서버에 check 해볼 때 사용(Large body가 서버가 수용할 수 있는지를 확인하고 수용할수 없을 경우 피함으로서 Client가 미리 판단을 할 수 있음)
— Server의 100 continue 응답
— 200 OK 로 100 continue에 대한 Response를 보내주거나, error code로 응답한다.
— 서버는 100 continue에 대한 entity body를 받을 경우에 Client에게 해당 응답을 한다.
— 서버가 Client에게 100 continue에 대한 Header가 아닌 entity body를 받을 경우에는 100 continue에 대응하는 status code(ex> 200OK)는 보내지 않는다. (Client는 이미 데이터를 보내기로 결정 하였기 때문에)
•
Proxy와 100 continue
— client -> proxy 로 100 continue 요청이 올경우 아래 두가지로 동작한다.
1.
next hop이 http 1.1을 호환하거나 net hop의 호환 버전을 모를경우 100 continue 패킷을 forwording 한다.
2.
next hop이 http 1.1 아래버전이 호환될 경우 417 Expectation Failed Error 발생 (417: 서버가 “Expect: “ 요청 헤더의 value를 만족할 수 없다. ex>100-continue)
2xx (성공)
3xx (리다이렉션)
4xx (클라이언트요청오류)
•
403 Forbidden 해당 접근이 거부되었을때
— 허용되지 않은 메소드가 있을 때 (GET POST 만 허용해뒀는데 TRACE와 같이 허용되지 않은 메소드로 요청했을 경우)
— ID/PASSWD로 인증이 실패하였을때
•
406 Not Acceptable 허용불가능
— 서버에서 ACL 걸었을 때
5xx (서버응답오류)
•
500 Interner Server Error 내부 서버 오류
— Apache <-> PHP <-> MySQL 간 데이터를 주고 받을 때, 내부적으로 Error가 발생될 경우 해당 응답코드 발생
— 일반적으로 SQL에서 문제가 발생됨
— Blind SQL 공격: 스키마의 종류를 알아낸다. 예를 들면 필드가 int인지 char인지를 확인 할 수 있다.
— a=1 을 넣어 integer 필드 인지 char 필드인지 확인 할 수 있다.
— 하나의 IP로 여러번 접속 했을 경우~ 웹방화벽 접근 로그를 통해 확인해 볼수 있다.
•
503 Service Unavailable : 서비스 불가능
— 일반적으로 Proxy장비에서 서버에 서비스가 불가능할 때 띄어준다.
Content-Type 헤더 종류
Content-Type: application/x-www-form-urlencoded
•
Form의 내용을 HTTP 메시지 바디를 통해서 전송(key=value, 쿼리 파라미터 형식)
•
전송 데이터를 url encoding 처리
•
예) abc김 → abc%EA%B9%80
Content-Type: multipart/form-data
•
파일 업로드 같은 바이너리 데이터 전송 시 사용
•
다른 종류의 여러 파일과 Form의 내용 함께 전송 가능. 그래서 이름이 multipart 이다.
Content-Type: application/json
•
TEXT, XML, JSON 데이터 전송 시 사용