면접질문대비4탄_HTTP

minjun kim·2024년 12월 16일


1) 서로 다른 애플리케이션끼리 통신할 때 더 효율적인 프로토콜을 사용할 수 있는데, 왜 아직 HTTP를 많이 사용하는 걸까요 ?

다른 프로토콜을 사용해도 애플리케이션 간 통신이 가능하지만 HTTP 말고 다른 프로토콜을 사용해야 한다면 우리는 분명 "어떤 프로토콜을 사용해야 할지" 고민해 봐야 할 겁니다. 만약 애플리케이션마다 제 각각 다른 프로토콜을 사용해야하는 상황이라면 굉장히 불편할 겁니다. HTTP 내에서 API를 맞춰서 개발하는 것도 어려운데 프로토콜도 맞춰 봐야하니까요.

HTTP는 대부분의 언어와 라이브러리, 프레임워크에서 기본으로 제공해주는 클라이언트가 있어 개발이 편리합니다. 또한 PC에 이미 웹 브라우저라는 훌륭한 HTTP 클라이언트가 하나씩 설치되어 있기 때문에 HTTP가 범용적으로 애플리케이션 간 통신에 사용되고 있다고 생각합니다.

  • 애플리케이션간 통신은 보통 IPC (inter - process - communication)

  • IPC 에는 여라가지 방법이 존재
    같은 PC내에서 메모리를 공유해 사용하고 다른서버에 존재하는 애플레이션 간 통신은 반드시 네트워크 레이어가 끼어 있어야 하기 떄문에 소켓을 사용하는 경우가 많다.

  • 이소켓을 통해 통신하는 상황에서 사용하는 대표적 프로토콜이 HTTP이다.
    HTTP는 간단하고 이해하기 쉬운 프로토콜이고 상태를 저장하지 않아 각각의 요청이 독립적으로 확장이 용이한 것은 맞지만, 다른 프로토콜내에서도 이런 특징이 있다.


2) HTTP/3에서는 왜 TCP가 아니라 UDP를 사용하나요 ?

TCP는 연결을 지향하고 손실을 네트워크 레이어에서 감지하는 프로토콜로 보통 안정성이 높다고 평가됩니다. 반면 UDP는 연결이 맺지 않고, 전송 시 손실된 데이터가 있어도 재전송하지 않는 프로토콜입니다. 그러나 이것은 네트워크 레이어 차원에서 지원하고 안하고 차이일 뿐 필요한 기능은 애플리케이션 레이어에서 구현할 수 있습니다.

UDP는 아주 단순한 프로토콜이며, 기존에 TCP를 통한 HTTP 통신에서 제공했던 기능은 UDP위에서 별도로 구현해 주면 됩니다. TCP와 동일한 기능을 유지하면서 훨씬 가볍고 빠른 프로토콜을 만들 수 있다는 이점이 있기 때문에 HTTP/3에서 UDP를 채택했다고 생각합니다.


3 ) HTTP 메서드 중 GET과 POST는 각각 어떤 기준으로 구분해 사용하나요 ?

보통 자원을 조회하는 것에 GET, 자원을 등록하는 것에 POST를 메서드를 사용합니다.
여기에는 규칙이 있는데요. GET메서드를 사용할 때는 해당 요청이 안전한 요청일 경우로, 안전하다는 의미는 해당 요청이 서버의 자원 상태를 변경하지 않는 것을 의미합니다.
그리고 멱등성이 없는 요청인 경우 POST 메서드를 지정하여 사용하곤 합니다.
결과적으로 보통 GET메서드는 특정 자원에 대한 조회나 검색을 하는 경우에 사용하며, POST메서드는 글 작성처럼 자원을 등록하는 경우에 사용합니다.


4) 멱등성이란 무엇인가요 ?

멱등성이란 한 번 호출한 것과 여러번 호출한 것의 자원 상태가 동일한 것
주로 수정이나 삭제 같은 기능이 멱등성 있는 기능이 되는데요. 'id가 3인 게시글을 다음 내용으로 수정하라'던가 id가 3인 게시글을 삭제하라와 같은 명령이 한 번이라도 실행되면 특정 내용으로 이미 수정되었거나 삭제가 된 상태가 되었을 겁니다. 이 상태에서 동일한 명령을 다시 수행한다고 해서 자원의 상태가 달라지지는 않습니다. 자원은 여전히 어떤 상태로 수정된 상태일 것이고, 삭제된 상태로 남아 있을 겁니다. 이런 특성을 멱등성 이라고 이야기합니다.

HTTP 메서드 중 멱등성이 있는 메서드는 GET, PUT, DELETE 등이 있으며 이 중 GET은 안전한 메서드이므로 멱등성도 가지고 있습니다.


5) 콘텐츠 네고시에이션( Content Negotiation )에 대해 설명해보세요.

콘텐츠 네고시에이션은 말 그대로 서버와 클라이언트 사이에서 어떤 콘텐츠를 제공할지 에 대한 협상을 이야기합니다. 동일한 URL에 대한 요청이라고 하더라도 어떤 사용자는 영어로 된 페이지를 받고싶고, 어떤 사용자는 동일한 URL에 대해 HTML페이지와 JSON데이터 중 하나를선택하여 받고 싶을 수 도 있습니다.
만약 이러한 콘텐츠 네고시에이션 과정이 없다면 여러 가지 언어나 데이터 타입별로 페이지를 만들어야 할 겁니다. 그러나 HTTP는 이런 측면에서 적절한 협상 매커니즘을 가지고 있으며 이것이 바로 콘텐츠 네고시 에이션입니다.

구체적으로 콘텐츠 네고시에이션은 클라이언트가 요청 헤더에서 Accept로 시작하는 헤더들을 사용하여 어떤 콘텐츠를 받고 싶은지 명시하고, 서버는 최대한 클라이언트가 받고 싶어하는 콘텐츠에 맞춰 주려고 노력합니다 이 과정 자체를 HTTP에서 콘텐츠 네고시에이션이라고합니다.

6) HTTP와 HTTPS의 차이는 무엇인가요 ?

HTTP는 요청과 응답을 평문으로 주고받고, HTTPS는 요청과 응답을 암호화하여 주고 받습니다. 데이터를 평문으로 주고받으면 전송 도중에도 데이터의 내용을 알아낼 수 있는데, 비밀번호나 개인정보를 전송할 경우 HTTP를 사용하면 정보가 유출될 위험이 있습니다. 반면 HTTP는 데이터를 암호화하기 댸문에 전송 도중 데이터의 내용을 알아낼 수 없어 안전합니다.
사용되는 포트 역시 다른데 HTTP는 80번 HTTPS 443포트를 사용합니다.

URL 데이터 전송 방식

쿼리 파라미터 vs 쿼리 스트링

쿼리 파라미터는
@RequestParam
ex )
https://www.googl.com/search?q=HTTP+Request&newwindow=1&...

키와 값은 = 으로 구분되고
여러 개의 쿼리 파라미터를 전달할 때는 &로 묶인다는 특징이 있다.

패스 베리어블
@PathVariable
ex)
/article/123
id가 123인 article 조회

쿼리 파라미터라면 /article?id=123

  • 패스 베리어블의 경우 특정 자원(리소스) 그자체를 지칭할 때 사용
    여기서는 id가 123이라는 특정 article을 지칭 하고있으므로 패스 베리어블이 적당하다.

  • 쿼리 파라미터의 경우 특정 자원을 지칭하기보다는 필터의 조건이나 정렬 방식 등을 지정하는 경우가 많다.

0. form-data, json, pathvariable, qureystring 방식

postman으로 test하고 각 http 메서드를 작성하면서 해당방식의 차이가 궁금했다.

form data

  • post method, body 요청 본문
  • @RequestParam 사용
  • 파일 업로드 가능 , 파일을 바이너리 데이터로 전송할 수 있음
// POST 요청의 form-data에서 데이터 추출
@PostMapping("/users")
public String formData(
    @RequestParam("name") String name,
    @RequestParam("age") int age
) {
    return "이름: " + name + ", 나이: " + age;
}

json 형식

-Post method ,body 요청본문
-@Requestbody 사용, dto 클래스 사용
-객체 구조가 더 명확

// DTO 클래스 필요
@Data
class LoginRequest {
    private String username;
    private String password;
}

@PostMapping("/login")
public String jsonLogin(
    @RequestBody LoginRequest request
) {
    // JSON은 @RequestBody로 객체로 받음
    String username = request.getUsername();
    String password = request.getPassword();
    return "로그인 성공";
}

쿼리 파라미터

  • get method
  • URL 경로
  • URL에 ?로 시작하는 키-값 쌍
// URL: /api/users?name=john&age=25
@GetMapping("/users")
public String queryParam(
    @RequestParam("name") String name,
    @RequestParam("age") int age
) {
    return "이름: " + name + ", 나이: " + age;
}

패스 베리어블

  • get method
  • URL 경로
  • URL 경로의 일부
// URL: /api/users/john/25
@GetMapping("/users/{name}/{age}")
public String pathVariable(
    @PathVariable("name") String name,
    @PathVariable("age") int age
) {
    return "이름: " + name + ", 나이: " + age;
}

form 데이터랑 json은 Post요청의 body에 데이터를 담는 방식
pathvariable랑 queryparam 방식은 get방식에서 차이

profile
배움의 흔적을 남기고 싶습니다.

0개의 댓글