http, restful, jwt

HTTP 와 RESTful JWT 에 관해 학습 및 정리

HTTP

Hyper Text Transfer Protocol
하이퍼텍스트(HTML) 문서를 교환하기 위해 만들어진 통신규약이다. 즉 웹상에서 네트워크로 서버끼리 통신을 할때 어떠한 형식으로 통신을 하자고 규정해놓은 통신 형식 또는 통신 구조이다.

핵심요소

  • 통신방식 HTTP의 통신방식은 기본적으로 요청/응답 구조로 되어있다.
    클라이언트가 HTTP request를 서버에 보내면 서버는 HTTP response를 보내는 구조.
    HTTP는 stateless 이다.
    stateless란 말 그대로 상태를 저장하지 않는다. 요청이 오면 그에 응답을 할 뿐, 여러 요청/응답끼리 연결되어 있지 않다. 독립적이다.
  • Request 구조

    start line

    말 그대로 HTTP request의 첫 라인 start line 또한 3부분으로 구성되어 있다.
    HTTP Method
    request가 의도한 action을 정의하는 부분.
    get,post,put,delete,options 등이 있으며 주로 get 과 Post가 쓰인다. request target
    요청이 전송되는 목표 uri 예를들어 /login
    HTTP Version
    말 그대로 버전 1.0, 1.1, 2.0

    headers

    해당 요청에 대한 추가 정보를 담고 있는 부분. key : value 값으로 되어있다.
    자주 사용되는 headers 정보

    • Host 요청이 전송되는 target의 host uri: 예를들어 google.com
    • User-Agent 요청을 보내는 클라이언트에 대한 정보 예를들어 웹브라우저에 대한 정보
    • Accept 해당 요청이 받을 수 있는 응답 타입
    • Connection 해당 요청이 끝난 후 클라이언트와 서버가 계속 네트워크 커넥션을 유지할지 끊을지 지시
    • Content-Type 해당 요청이 보내는 메시지 body의 타입 예 application/json
    • Content-Length 메시지 body의 길이

      Body

      해당 request의 실제 메시지/내용 이며 body가 없는 request도 많다. get 요청들은 대부분 바디가 없다.

    • Response 구조

      status linre

      response의 상태를 간략하게 나타내주는 부분

      headers

      request의 headers와 거의 동일하며 response에서만 사용되는 header값들이 있다. 예 user-agent 대신 server

      body

      request의 body와 동일하다. 모든 응답에 body가 있지 않다.

RESTful

resful을 알기전 알아두면 좋은 배경지식!

  • URI Uniform Resourece Identifier 의 약자이다.
    해당 사이트의 특정 자원의 위치를 나타내는 유일한 주소
    /login, /news
  • payload http request에서 보내는 데이터.

REpresentational State Transfer

웹상에서 사용되는 여러 리소스를 http uri로 표현하고 그 리소스에 대한 행위를 http method로 정의하는 방식이다.
즉 리소스(http uri로 정의된)를 어떻게 한다 (http method + payload)를 구조적으로 깔끔하게 표현하는것.

RESTful API의 장점

  • 가장 명확한 장점은 바로 self-descriptiveness 셀프 서술
  • restful api는 그 자체만으로 api의 목적이 쉽게 이해가 된다.

restful 개발시 유의점

  • /슬래시 는 계층관계를 나타낼때 사용된다.
  • URI에 _언더바는 주로 쓰지 않고 대문자보다 소문자를 쓴다 긴단어도 사용안한다. 가독성을위해
  • URI는 명사를 사용 HTTP method에서 동사의미를 표현

JWT

JWT 란 JSON Web Token 의 약자이며 웹표준 으로서 두 개체에서 JSON객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안정성 있게 전달해준다.
대부분의 주로 사용되는 프로그래밍 언어에서 지원이 되며 JWT는 HTTP 헤더에 넣어서 전달 할 수 있고, URL의 파라미터로 손쉽게 전달될 수 있다.

어느 상황에서 JWT를 사용할까

  • 회원 인증: 주로 JWT는 로그인을 하면 서버는 유저에게 토큰을 발급하고 그 후 유저가 서버에 요청을 할 때 마다 JWT를 포함하여 전달한다. 서버가 클라이언트에게 요청을 받을때 마다, 토큰이 유효하고 인증됐는지 검증하고 권한이 있는지 확인한다.
  • 정보 교류: JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다. 그 이유는 정보가 sign이 되어있기 때문.

JWT의 구조

JWT는 .을 구분으로 3가지의 문자열로 되어있다.

  • header 헤더는 두가지의 정보를 지니고 있다.
    type: 토큰의 타입을 지정한다. JWT
    alg: 해싱 알고리즘을 지정한다. 보통 HMAC SHA256 또는 RSA 알고리즘은 토큰을 검증할 때 사용되는 signature 부분에서 사용된다.
  • payload payload부분에는 토큰에 담을 정보가 들어있다. 여기에 담는 정보의 한 조각을 클레임이라고 부르고 이는 nane/value의 한 쌍으로 이루어져있다.
  • signature 서명 서명은 헤더의 인코딩값과 정보의 인코딩값을 합친 후 비밀키로 해쉬를 하여 생성힌다.

Written by@jaeyoung-son
배운것을 기록하는 공간입니다.

GitHub