HTTP프로토콜의Stateless를 보완하기 위해 사용하는 방법 :
。HTTP는Stateless Protocol이므로, Server와 Client 간HTTP Transaction후TCP Connection을 종료하면 상태정보를 유지하지 않는다.
▶ 통신이 끊어지면 상태정보가 유지되지 않으므로, 이를 보완하기위해HTTP는Cookie를 활용하여Session,Token를 사용하여상태정보유지
쿠키 (
cookie) :
。Stateless Protocol을 보완하고자HTTP Server에서 특정HTTP Client의HTTP Transaction의History를 조회할 수 있는 수단으로 활용하는 저장용 파일
▶만료기간이 존재하는4kb용량제한이 존재하는key-value저장소.
▶브라우저는Session ID또는JWT Token을 포함한쿠키를 저장 및 관리Cookie cookie = new Cookie("custom-cookie", "custom-val");// 쿠키명, 쿠키값 cookie.setMaxAge(60*60); // 쿠키는 토큰, 세션 정보를 포함하므로 수명을 지정. : 초단위 cookie.setPath("/"); // 쿠키가 유효한 경로를 지정。
HTTP는Stateless하여HTTP Request는 요청한 사용자 정보에 대한State를 포함하지 않으므로,브라우저의식별 데이터를 포함한Cookie를HTTP Request의헤더에 포함하여HTTP Server로 전송함으로써HTTP Server측에서 사용자의 신원을 파악
▶HTTP Server는 각각의브라우저에 할당한식별용 데이터를서버 백엔드 DB를 통해인덱싱함으로써 특정브라우저의History을 조회
。쿠키는Token / Session을 통한인증시서버 / 클라이언트간식별용 데이터를 포함하여 송수신하는 역할을 수행
▶HTTP Server가 아닌,브라우저에쿠키를 저장하므로 민감한사용자 정보를쿠키에 포함하지 않고, 오직식별 용도의데이터(Session ID,JWT 토큰)를쿠키에 저장하여 송수신
▶보안이 취약한 특성으로서버로 부터 접속한브라우저를식별하는 용도로 활용
ex )사용자 정보는Session으로서Server-Side의세션 저장소에 저장하고,Cookie는세션 식별용도의Session id만 송수신하는 역할을 수행
。브라우저의Cookie File에식별용 데이터를 저장 후 장시간이 지난 이후에도브라우저에서식별용 데이터를 포함하여HTTP Request하는 경우HTTP Server의백엔드 DB에서 삭제하지 않는 한 여전히브라우저에 대한 정보를 유지할 수 있다.
Cookie의 주요용도
- User Session State
。사용자의로그인 정보유지를 위한Session id또는JWT Token를 각HTTP 요청 / 응답마다 자동으로헤더에 포함하면서송수신
▶Server에 로그인 시HTTP Request에Cookie Header Line를 포함하여 전송하면사용자 세션 시간동안브라우저를HTTP Server가 식별하면서로그인유지
- 장바구니
。브라우저에 할당한식별번호를서버 백엔드 DB를 통해인덱싱함으로써브라우저에게 장바구니 등의 기능을 제공
- Recommendation
。식별번호에 해당하는브라우저의 구매정보를 조회함으로써 상품 추천이 가능
Cookie주요요소
HTTP Response Message의HTTP Header의Cookie Header Line
。Set-cookie : 쿠키식별데이터
HTTP Request Message의HTTP Header의Cookie Header Line
。cookie : 쿠키식별데이터
HTTP Client의브라우저에서 보관되는Cookie File
。Client Host의State를 유지
。HTTP Server에서 전송한쿠키식별데이터를Server Host Name과 함께 저장
HTTP Server의백엔드 DB
。식별번호로브라우저의History를 인덱싱
Cookie원리
。해당 과정은 단순히쿠키 식별번호를 활용한 과정이며, 실무에서는JWT 토큰/Session id를 포함하여 송수신하는 용도로 사용됨
。브라우저에서 초기HTTP Server접속 시HTTP Server에서 해당브라우저에 대한식별번호를 할당 후브라우저는Cookie File에 해당식별번호를 포함
▶ 이후HTTP Request에Cookie Header Line을 포함하여HTTP Server에 전송 시서버 백엔드 DB를 통해식별번호를인덱싱하여 해당브라우저의 접속기록을 조회
- 사용자가
Client의웹브라우저를 통해웹페이지를 요청하기위해 우선Amazon 웹서버에HTTP Request Message전송
。이때. 해당웹브라우저로는Amazon 웹서버에 처음 방문하고,Ebay 웹서버는 이미 방문한적이 있다고 가정
Amazon 웹서버에서HTTP Request를 수신 시 송신한브라우저에 대한 유일한쿠키식별번호를 생성 및백엔드 DB에Entry생성
。해당쿠키식별번호를 통해 차후백엔드 DB에서인덱싱을 수행
Amazon 웹서버에서 해당식별번호를HTTP Response Message에HTTP Header로서Set-cookie : 쿠키식별번호를 포함하여 해당하는브라우저로 응답
ex )Set-cookie : 1678
。Set-cookie:서버에서쿠키 / 세션을 생성 후쿠키 / 세션ID를브라우저로 전달 시 이를 포함하는헤더
▶ 이후 해당 생성된쿠키 / 세션ID는cookie 헤더에 포함되어 통신됨
HTTP Response Message수신 시브라우저의Cookie File에Server Host name과Set-cookie :쿠키식별번호를 추가
。이를 통해 현재브라우저는Amazon 웹서버와Ebay 웹서버의Entry를 보유한 상태
브라우저에서 해당웹페이지를 요청하고자HTTP Request Message의헤더에Cookie : 쿠키식별번호를 포함 후Amazon 웹서버로 요청
。브라우저는Cookie File을 참조하여Server에 대한식별번호를 발췌 후HTTP Request Message에식별번호를 포함하는Cookie를 포함
Amazon 웹서버에서 해당식별번호를백엔드 DB에서인덱싱함으로써 해당브라우저의 할도을 추적가능
。Amazon의 경우 해당식별번호에 해당하는브라우저의웹페이지방문기록을 조회할 수 있고, 회원가입을 하지 않더라도장바구니등의 서비스를 제공가능
- Cookie 종류
Session Cookie
。만료시간(Expire data)를 설정 및메모리에만 저장.
。Browser 종료 시 Cookie를 삭제.
Persistent Cookie
。장기간 유지되는 Cookie.
。파일로 저장되어 Browser 종료와 관계없이영속적으로 존재
Secure Cookie
。HTTPS에서만 사용.
。cookie 정보가 암호화되어 전송.
Third-Party Cookie
。방문 domain 및 다른 domain의 cookie( ex. 광고 배너 )등을 관리 시 유입경로를 추적하기위해 사용.
세션(Http session)
。브라우저와Server간의 송수신 연결상태를 유지할 수 있는 방법
ex)웹서버에 로그인 시, 새로고침하거나 브라우저를 닫았다 열어도 일정 기간은로그인 유지되어있는데, 이처럼연결상태 유지할수있게 하는 것이Session
。HTTP는세션을 구현하므로로그인 인증을 유지하지만FTP의 경우세션을 구현하지 않으므로 매요청마다 인증을 수행해야한다.
。서버에서브라우저를 식별하기 위해쿠키를 활용하여Set-cookie / cookie 헤더에Session ID를 포함하면서HTTP 요청 / 응답을 수행하여 통신
▶HTTP Session id를 식별자로 구별하여 접속한 Server의Session Storage에서세션을 식별
쿠키와 차이점?
。Cookie는식별용 데이터를 포함하여브라우저에 저장 및 관리되지만,Session은HTTP Server측의Session Storage에 저장하여 관리됨
▶브라우저에쿠키를 저장하므로 민감한사용자 정보를쿠키에 포함하지 않고, 오직식별 용도의데이터만쿠키에 포함
。쿠키의 경우 단순히식별용 데이터(Session ID등 )를 송수신하여서버에서브라우저를식별하고로그인 상태를 유지하는 역할을 수행하지만,세션은사용자 정보를Server Side의세션 저장소에 저장되므로로그인 인증 정보등 민감한 정보를 관리하는 역할을 수행
▶HTTP 요청 / 응답시cookie 헤더를 통해Session ID만 송수신되고, 이를 통해서버에서만세션 저장소의Session을 식별하여 활용하므로 보안이 우수.Http Session 절차 출처
HTTP Client가HTTP Server에 Resource를 요청.
HTTP Server에서는Http Request에 포함된Cookie에서Session id를 확인 후 없을 경우, 새로 발행한Session을세션 저장소에 저장 및 해당세션의Session id를HTTP Response Message의Cookie Header Line인Set-Cookie에 포함하여 응답
。Set-cookie:서버에서쿠키 / 세션을 생성 후쿠키 / 세션ID를브라우저로 전달 시 이를 포함하는헤더
▶ 이후 해당 생성된쿠키 / 세션ID는cookie 헤더에 포함되어 통신됨
- Client는
브라우저에 수신한Cookie에 포함된Session id를쿠키로 저장 및Http Request Message의Cookie Header Line에서Session id를 포함하여 원하는 Resource를 요청
- Server는
HTTP Request에 포함된Session id를 통해세션저장소에서 해당Session을 찾은 후 상태정보를 유지하며 request에 대한 response를 전송.
토큰 (
token)
。Client-side에서 인증정보를 보관하는 방법.
▶ Server가 아닌, 인증정보를client-side에 암호화하여 저장.
。Cookie에토큰을 저장 및 송수신 함으로써서버와클라이언트간요청 / 응답을 수행
▶클라이언트 브라우저에는토큰을쿠키로 저장 후서버에요청시토큰을 전송
。Session기반 인증방식은 Client에서 Server에 특정 User에 대한 정보를 요청할때마다 일일이Session id의 일치여부를 확인.
▶ 매요청마다 Server의 DB를 일일이인덱싱하는 것이 부담이되므로Token기반 인증방식이 등장하여 단순히인즌 헤더에 포함된토큰에 대해 해당서버로부터의 발급여부와 유효여부에 대해서만 검증만 수행
- JSON 토큰 (
JWT: Json Web Token ) :
。Web에서Authentication과 정보교환 등을 수행하기위해 사용하는Token기반 인증 방식.
。로그인 후 Server가 Client에게 발급하는Token으로 활용
▶이후 Client에서 전송하는HTTP Request마다JWT를 포함하여 인증을 수행.
。Client가Token을 보관하면서Stateless특징을 지니므로,Session이 필요없다.
▶ 또한Session처럼 DB 조회없이token만으로 Authenticate가 가능.
。JWT의payload에 사용자 정보를 보관 가능.