HTTP 특징
- Stateless protocol
- 여러 클라이언트가 서버에게 요청을 할때, 각 개별적인 요청은 서로 연관되어 있지 않다.
- 그럼 이렇게 상태가 없는 HTTP 프로토콜에서 사용자가 로그인 되었음을 어떻게 알 수 있을까 ? => 보통 세션과 쿠키를 이용함
- Sessions & Cookies
- 클라이언트가 서버에거 로그인 요청을 하면, 서버가 클라이언트에게 성공 응답값(200)과 함께 response를 준다
- 서버는 이 response의 헤더에 Set-Cookie 라는 auth 토큰을 보내준다.
- 클라이언트의 브라우저는 header에 cookie가 들어있으면 자동으로 로컬 쿠키에 저장해준다. 클라이언트측에서 따로 처리해줘야할 건 없다.
- 브라우저가 자동으로 해당 서버에 해당하는 쿠키를 저장하고 있다가, 다음 요청시 header에 똑같은 auth 쿠키를 넣어서 서버에 보냄)
이렇게 쿠키와 헤더를 이용하여 각각의 요청이 stateless(상태가 없음)임에도 불구하고, 사용자가 로그인 했다는 정보를 알 수 있다.
- Cache-control
- 서버에서 클라이언트에게 데이터를 줄 때 헤더에 ‘cache-control’을 명시하면, 브라우저는 자동으로 저장소에 이 데이터를 저장하고 있다가 클라이언트가 동일한 요청을 하면 서버에 또 다시 요청하는 것이 아니라 저장되어있는 데이터를 그대로 재활용한다.
- User-Agent
- 서버에서 요청하는 클라이언트가 누구인지 알고 싶을때 쓰는 것
- 브라우저와 운영체제에 대한 정보가 들어있음
이렇듯 HTTP 헤더에는 여러가지 약속된(표준화된) 데이터들을 넣을 수 있고, 커스터마이징된 데이터를 넣을 수도 있다.
헤더에 다른 원하는 정보를 추가하고 싶으면 Custom 하게 사용하면 되는데, 여기서도 규칙이 있다. 예전에는 ‘x-auth’ 와 같이 사용했으나, 2012년도부터 이 방법은 더 이상 권고되지 않는다.( x- 로 시작되는 것 중에 표준화가 된 것이 꽤 있기 때문에, 충돌이 날 수 있기 때문)
이제는 domain-key 혹은 domain.key 로 사용하여야 한다.
ex) dylan.com-auth , dylan.com.auth
✏️ 헤더에 인증을 위해 ‘x-auth’ 를 추가하여 사용하는 경우가 많은데, 되도록이면 header에서 표준화가 된 ‘Authorization’ 을 사용하는 것이 좋다.
표준화된 Headers 값
- User-Agent
- user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
- Authorization
- 로그인에 관련된 정보를 저장한다면, 아무 커스텀한 필드를 사용하는게 아니라, 표준화된 ‘Authorization’ 으로 데이터를 주고 받는다.
- Basic YWxhZGRpbjpvcDKDdekdm14
- Content-Length
- 컨텐츠가 얼마나 큰지 bytes로 표기
- Content-Type
- text/html|application/json
- Content-Language
- en
- Cache-Control
- 얼마나 오랫동안 이 데이터를 캐시해야하는지
- Cache-Control: max-age=<seconds>
- Cache-Control: no-cache
…
그외 표준화된 HTTP Headers 를 확인하려면 아래 MDN 사이트 참고