728x90
반응형
HTTP 프로토콜에서 상태를 저장하는 방법
- HTTP 는 stateless protocol 입니다. 즉, 상태가 없는 프로토콜입니다.
- 서비스를 이용할 때, 상태가 필요한 순간이 있습니다. (장바구니, 로그인 등)
쿠키
- 웹브라우저에 cookies 라는 데이터를 저장하여 HTTP 상태를 저장하는 방식입니다.
- 흐름은 다음가 같습니다.
- client --> Server 로 접속
- 서버에서 cookies 세팅
- Set-Cookie: key=value
- Set-cookie 란 header 에서 쿠키를 저장하는 공간입니다.
- 서버에서 응답을 받아 웹브라우저에 저장
- client --> server 로 요청 시, header 에 쿠키를 담아 보내기.
- server 는 이를 통해 이전에 접근한 사용자라는 것을 알 수 있습니다.
- 쿠키의 단점으로는 쿠키정보가 브라우저 상에 저장되어 데이터 변조가 일어날 수 있습니다. 그렇기에 개인정보에 민감한 정보는 쿠키 사용을 권장하지 않습니다.
session
- 서버상에 상태 정보를 저장하는 방식입니다.
- 흐름은 다음과 같습니다.
- client --> server 로 요청이 들어오면 서버는 sessionid 를 생성하고 redis 와 같은 캐시에 session 정보를 저장합니다.
- redis 와 같은 캐시를 사용하는 이유는 서버를 확장할 시, 다른 서버에 각각 요청이 들어올 수 있기에 redis 를 사용해서 관리합니다.
- 서버에서 set-cookie 에 jessionid 에 세션 ID 를 세팅해서 클라이언트로 전송합니다.
- 클라이언트는 이를 받아 다음 요청부터 sessionid 를 보내며 서버에서는 이를 인식해서 이전에 접근한 요청이라는 것을 알 수 있습니다.
- 주의사항으로는 보안을 위해서 session 유지시간 정책을 설정해서 관리해야합니다.
JWT (Json Web Token)
- Header(Json), Payload(Json), Signature(서명) 형태의 데이터를 Base64 로 인코딩하여 만든 토큰입니다. 주로 인증이나 정보 전달에 사용됩니다.
JWT 구조
- 3가지로 구성되어있으며, '.' 로 구분합니다.
Header
- 헤더는 2가지 정보를 저장하고 있습니다.
- typ : 토큰의 타입
- alg : 해싱 알고리즘을 뜻하며, 서명 부분에서 사용합니다. ex) SHA, RSA 등
- 아래와 같은 정보를 base64 로 인코딩하면 header 데이터가 완성됩니다.
{ "typ" : "JWT", "alg" : "SHA256" }
payload
- 데이터를 담을 수 있는 구조이며, name/value 방식으로 여러 데이터를 담을 수 있습니다.
서명
- 헤더의 인코딩 데이터 + payload 의 인코딩 값을 합쳐서 주어진 비밀키로 hashing 하여 생성합니다.
JWT 를 이용한 인증 흐름 예시
- client 에서 인증 서버로 접근하면 서버에서 JWT 를 만들어 응답해줍니다.
- client 에서는 이를 받아 header 의 Authrization 에 담아 api 를 요청하면 서비스를 제공하는 서버에서 해당 토큰에 대한 유효성을 검증하는 방식입니다.
- 이 때, 검증은 인증 서버를 호출해서 검증하게 돼있습니다.
- 인증을 완료하면 클라이언트에게 응답을 줍니다.
JWT 장점
- 세션에 비해 확장성을 보장할 수 있습니다. 세션은 서버에 정보를 저장해야합니다. 그렇기에 서버가 늘어날수록 분산 환경에 대한 고려를 해야합니다
- 서버 기반 인증 시스템은 CORS 문제가 있을 수 있습니다. (ex 세션) 이런 것을 토큰 기반 방식을 통해 해결가능합니다.
JWT 단점
- 만들어지면 삭제가 불가능하므로 토큰 만료시간이 반드시 필요합니다.
- 토큰 자체에 정보를 담고 있으므로 주의해야합니다.
- 정보가 늘어날수록 토큰 자체의 길이가 늘어납니다.
reference
'network' 카테고리의 다른 글
[network 3편] 네트워크 동기 vs 비동기, 블로킹 vs 논블로킹 정리 (0) | 2022.08.29 |
---|---|
[network 2편] 쿠키, session, jwt 정리 (0) | 2022.08.29 |
[network 1편] 로그인 관련 정리 (세션, JWT) (0) | 2022.07.16 |
TCP 연결 해제 (4 way hand shake) 설명 (0) | 2020.10.28 |
proxy 관련 정리 (0) | 2020.08.21 |
댓글