본문 바로가기
http

HTTP(stateful, stateless, connectionless)

by kcj3054 2021. 10. 27.

무상태 프로토콜(stateless)

stateful(상태 유지)

  • 서버가 클라이언트의 이전 상태를 유지하는 것이다.
  • 중간에 다른 점원으로 바뀌면안된다 -> 다른 점원으로 바뀔때 상태 정보를 다른 점원에게 알려줘야한다, stateful이기때문에 상태유지기라서!!!!
  • 항상 같은 서버로 유지 되어야한다 이러한 상황에서 서버가 장애가 나면 통신이 장애가 발생한다.
  • 고객 : 이 차가 얼마죠?
  • 점원 : 2억입니다. (차라는 상태를 유지)
  • 고객 : 2대 두개하겠습니다.
  • 점원 : 4억입니다. 신용카드, 현금 어떤 걸로하시겠습니까 (차, 2대라는 상태 유지)
  • 고객 : 신용카드로 구매하겠습니다.
  • 점원 : 결제완료 (차, 2대, 신용카드)
  • stateful은 중간에 점원이 바뀌게 된다면 꼬이게 된다.. 해당 정보를 처리한 상태를 하기때문

stateless

  • 중간에 점원이 바뀌어도 괜찮다
  • 클라이언트의 요청이 증가해도 서버를 대거 투입 가능하다
  • 무상태응답은 서버를 쉽게 바꿀 수 있다 -> 무한 서버 증설 가능
  • 하나의 서버가 장애가 나더라도 다른 서버가 요청을 처리해서 응답을 보낼 수 있다
  • 무상태는 수평확장에 유리하다(스케일 아웃)
  • ex: 이벤트를 할때 이벤트페이지에 서버를 쫙 늘리는 경우가 있다.

 

그러나 stateless 한계

  • 로그인이 필요없는 것은 무상태로 설계가 가능하지만, 로그인이 필요한 경우에는 stateful로 상태유지를 해주어야한다
  • 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지한다
  • stateless단점 중 하나는 데이터를 보낼 것이 너무 많다... 모든 정보를 계속 보내야하니.

http메서드 특정

  • safe 안전
    • 호출을 해도 리소스가 변경이 되지않는다면 안전하다고 본다, get은 조회를 하니 리소스가 변경이 되지않아서 안전하다 포스트는 주어진 데이터를 처리하니 safe하지않다.
    • 계속 호출하면 서버에 로그가 쌓이는 것은 고려하지않는다(해당 리소스만 고려한다)
  • 멱등(Idempotent)
    • 몇번을 호출하든 결과는 똑같은 것이다.
    • GET(), PUT(기존에 있던 것들 날리고 덮는 것이라서, A를 한번 PUT하든 10번하든 A를 PUT하는 것이다)
    • POST는 멱등하지 않다 왜냐하면 (주문을 10, 100번 하면 결과는 다르다!)
    • 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지는 않는다 (중간에 GET을 하다가 PUT -> GET을 해서 리소스가 변경 될 수 있는데 그것은 고려하지않는다)
    •  
  • 캐시가능 (cacheable)
    • 캐시를 할려면 key값이 일치해야하는데 post는 바디안의 것을 키로 할려면 복잡하다 그래서 get은 url 값만 가지고 key를 받아들여서 get은 일반적으로 캐시가 가능하다.
    • GET, POST, PUT, PATCH가 가능은한데 실제적으로는 GET정도만 캐시를한다.

HTTP

동적조회

  • 주로 검색, 목록에서 정렬필터, 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
  • 조회는 GET
  •  

HTML Form 데이터 전송

  • post가 데이터를 변경하는 것이 있다고만 알면안된다!!!!
  • form의 내용을 메시지 바디를 통해서 전송한다(쿼리파라미터 형식)
  • 전송 데이터를 urlencoding 처리한다 ( abc김 -> abc%..)
  • HTML Form은 get, post만 지원한다
  • 파일 업로드 같은 바이너리 데이터 전송시 get전송도 사용한다(multipart/form-data)

HTML Form 데이터 전송

  • multipart/form-dta(주로 바이너리데이터 전송시 사용)
    • 이름이나 나이 텍스트뿐만아니라, 이미지파일도 같이 보낼 때, multipart/form-data를 쓴다
    • content-Type: multipart/form-data로 들어가고, boundary=---xxxx면서 경계가 잘린다..
    • multipart이다 여러개의 파트로 나눠서 데이터를 보낼 수 있게된다.
    • 그림..

post랑 put의 차이

  • post는 자세한 정보가 없다 /members까지로 끝이다
  • put은 /members/1을 변경하겠다고 명시가 가능하다..
  • post
    • 클라이언트는 등록될 리소스의 URI를 모른다 ( post /members)
    • 서버가 새로 등록된 리소스 URI를 생성해준다 (Location: /members/100
    • 컬렉션
      • 서버가 관리하는 리소스 디렉토리, 리소스의 URI를 생성하고 관리한다, (ex : /members )
  • put 기반 등록
    • 파일 등록 /files/{filename} (파일 업로드할때 기존 파일이 있으면 지우고 새로 업로드하니 정확하다)

HTTP API 설계 예시

  • POST도 데이터 변경, PUT도 변경 차이점을 명확히 알자!
  • API설계시 resource를 중점적으로 둬서 설계한다
  • 회원목록, 등록, 조회, 수정, 삭제.. 회원의 정보를 건드리는 것이다. 여기서 리소스는 회원!
  • /members/~로 거의 모든 것이 가능하다
  • 회원 목록 -> /members (get)
  • 회원 등록 -> /members (post)
  • (게시판에서 )게시글을 다시 쓸때는 put을 사용하면된다 (다시 사용하는 것이니 덮으면된다)
  • 애매하면 post를 쓰면된다 post는 거의 무적이다
  •  

출처 : 김영한님 http강의

'http' 카테고리의 다른 글

http vs https (ssl)  (0) 2021.12.31
http(1) . (tcp, udp, osi)  (0) 2021.10.26
jwt, 쿠기  (0) 2021.10.08
인터넷 네트워크  (0) 2021.08.01