쿠키, 세션, JWT, 캐시

Previous Next

TL;DR

아래 4개는 웹의 대표적인 저장소이다.


쿠키와 세션의 차이


JWT를 사용하는 이유


웹 캐시를 사용하는 이유




들어가기 전에

HTTP 통신은 다음과 같은 특징을 가진다.


실제로는 데이터 유지가 필요한 경우가 많다. 정보를 유지하지 않으면 페이지를 이동할 때마다 로그인을 다시하거나, 상품을 선택했는데 구매 페이지에 상품 정보가 없거나 하는 일이 발생할 수 있기 때문이다.

이에 따라 상태값을 저장할 수 있는 수단이 필요하게 됐다. 클라이언트에 정보를 파일로 남기는 것을 쿠키라고 하고 서버에서 별도로 저장하는 것을 세션이라고 한다.



쿠키, 세션, JWT, 캐시



쿠키


☝️ 여기서 잠깐!

웹 브라우저 쿠키의 최대는 왜 4KB 일까?

encodeURIComponet() 로 인코딩한 이후의 name=value 쌍은 4KB를 넘을 수 없기 때문이다.

또한 서버 도메인 하나당 저장할 수 있는 쿠키의 수는 20여개 정도로 한정되어 있다. (브라우저마다 상이)


구성요소


목적



동작 과정

cookie 동작과정

  1. 클라이언트가 서버에 요청
  2. 서버는 HTTP 응답 헤더에 set-cookie 속성을 추가하여 응답 → 클라이언트는 쿠키 저장
  3. 클라이언트는 이후 서버에 요청할 때 전달받은 쿠키를 자동으로 요청 헤더에 추가하여 요청(브라우저가 자동으로 추가)
  4. 서버에서 쿠키를 참고하여 로직 수행


쿠키 사용 예시



쿠키의 종류



단점



보안 옵션

Secure


HttpOnly


SameSite


☝️여기서 잠깐!

XSS (Cross Site Scripting) : 공격자가 웹 사이트에 악성 스크립트를 주입해 사용자 브라우저에서 악성 스크립트를 실행시키는 공격

XSRF (Cross Site Request Forgery) : 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(수정, 삭제 등)를 특정 웹사이트에 요청하게 하는 공격




세션


동작 과정

session 동작과정

  1. 클라이언트가 서버에 처음으로 요청을 보냄 (처음이라 session id가 존재하지 않음)
  2. 서버에서 session id를 발급하여 응답
  3. 클라이언트가 전달 받은 session id를 쿠키로 저장
  4. 클라이언트는 매 요청마다 헤더 쿠키에 넣어 요청
  5. 서버는 session id를 통해 사용자를 식별하고 클라이언트 상태 정보를 유지하며 응답
  6. 클라이언트 종료 시 session id 제거, 서버에서도 제거


☝️ 여기서 잠깐!

만약 클라이언트가 로그인을 성공하면 서버는 새로운 session id(로그인을 인증받은)를 발급한다. 클라이언트도 새로 발급 받은(로그인 인증 받은) session id와 함께 요청하게 된다.


세션 사용 예시



세션의 단점


해결 방법




JWT (JSON Web Token)


구성요소



토큰 전달과 저장 방법

JWT 동작 과정

로그인 시

  1. 브라우저에서 사용자가 로그인하면 서버에 이메일과 비밀번호를 전송

  2. 서버에서 이메일과 비밀번호를 확인 후 사용자가 확인되면 JWT를 생성

    (사용자 고유 ID값을 부여하고, 기타 정보와 함께 Payload에 넣음)

  3. JWT의 유효기간을 설정하고, SECRET KEY 이용해 Access Token 발급

  4. 사용자는 Access Token을 받아 쿠키에 저장

  5. 인증이 필요한 요청마다 토큰을 헤더에 실어 보냄

  6. 서버에서 해당 토큰의 Signature를 SECRET KEY로 복호화한 후, 조작 여부와 유효 기간을 확인

  7. 해당 토큰 검증이 완료되면 Payload를 디코딩하고 해석한 정보에 따라 응답



단점


해결 방법 - Refresh Token

  1. 시간이 흘러 Access Token이 만료

  2. 사용자는 만료된 Access Token을 헤더에 실어 요청을 보낸다.

  3. 서버는 Access Token이 만료됨을 확인

  4. 만료된 토큰임을 알리고 권한없음을 신호로 보낸다.

    ☝️ 여기서 잠깐!

    Access Token이 만료될때 마다 9~11 과정을 거칠 필요는 없다.

    Access Token의 Payload를 통해 유효기간을 알수 있다.

    따라서 프론트엔드 단에서 API 요청 전에 토큰이 만료 됐다면 바로 재발급 요청 가능.

  5. 사용자는 Refresh TokenAccess Token을 함께 서버로 보낸다.

  6. 서버는 받은 Access Token이 조작되지 않았는지 확인한후, Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교한다.

  7. 서버는 Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 사용자에게 보내준다.

  8. 새로운 Access Token을 헤더에 실어 API 요청


사용 예시




캐시


Content Delivery Network (CDN)




추가 내용

브라우저 저장소

브라우저에서 지원하는 저장소는 쿠키 외에도 로컬 스토리지(Local Storage)세션 스토리지(Session Storage)가 있다.


장점


단점



XSRF (Cross Site Request Forgery) 공격


대응 방법

  1. 쿠키의 SameSite 사용
    • SameSite 속성 값으로 Lax, Strict 사용하면 쿠키를 동일한 사이트에서만 전달 할 수 있게 할 수 있다.
    • 구형 브라우저에서는 SameSite 속성을 지원하지 않아 한계가 있다.
  2. Referer 체크
    • Request 헤더의 Referer을 확인해 유효한 사이트에서 API를 호출하는지 확인하는 방법
    • Same-Origin Policy(SOP)를 지키면 XSRF 공격을 방어할 수 있지만, 다른 출처의 자원을 사용해야 하는 경우가 있어 CORS를 허용해주는 경우가 많다.
    • 이 경우 CORS를 위해 모든 출처를 허용하지 않고 유효한 출처만 허용하는 것이 좋다.
  3. Security Token 사용
    • 사용자 인증 절차를 좀 더 복잡하게 만들어 XSRF 공격 막기
    • 임의의 토큰을 발급해 서버의 세션에 토큰을 저장하고, 그 토큰을 프론트 엔드로 전달
    • 프론트엔드에서는 API를 호출할 대 전달 받은 토큰을 함께 전달하고, 서버에서 세션에 저장된 토큰과 프론트엔드에서 전달 받은 토큰을 비교해 동일할 경우 API를 실행하는 방식



XSS (Cross Site Scripting) 공격


비 지속적(Non-persistent) 공격 방법


지속적(Persistent) 공격 방법


대응 방법




예상 질문 + 모의 면접 질문

HTTP 프로토콜의 비상태성, 비연결성의 장점이 뭐라고 생각하시나요?

계속해서 통신 연결을 유지하지 않기 때문에 리소스 낭비가 줄어듭니다.


HTTP를 사용할 때 서버는 클라이언트의 정보를 저장하지 않는데, 어떻게 자동 로그인이나 장바구니 기능을 사용할 수 있을까요?

쿠키나 세션을 이용해서 상태값을 클라이언트나 서버에 저장함으로 로그인과 장바구니 기능을 사용할 수 있습니다.



쿠키와 세션의 차이점과 쿠키와 세션 각각의 특징을 설명해주세요

가장 큰 차이는 정보가 저장되는 위치입니다. 쿠키는 클라이언트, 세션은 서버의 자원을 사용합니다.

쿠키는 요청 속도가 빠르고 세션은 쿠키보다 더 보안이 좋다는 점이 특징입니다.



인터넷 쇼핑을 할 때, 쿠팡에서 시리얼을 보고 나면 SNS에서도 시리얼 광고가 나오는데 이건 어떻게 가능한 일일까요?

서드파티 쿠키를 사용하기 때문에 가능합니다. 서드파티 쿠키란 사용자가 방문한 웹 사이트에서 발행한 쿠키가 아니라, 다른 웹 사이트에서 발행한 쿠키인데, 다른 사이트의 사용내역에 대한 정보를 쿠키로부터 가져와 활용할 수 있어 사용자의 온라인상 행동을 추적 및 데이터를 분석해 광고 등에 사용할 수 있습니다.


서드파티 쿠키의 단점은 무엇인가요?

서드파티 쿠키를 추적함으로 개인정보보호를 침해할 수 있습니다.



JWT는 무엇이고 장단점에 대해 설명해주세요.

Json Web Token의 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰입니다.

보안성 쿠키를 전달하지 않아도 되어 취약점이 사라지지만 JWT 토큰이 길어질 수록 오버헤드가 심해진다는 단점이 있습니다.



쿠키를 사용하게 될 때 예상되는 보안 문제가 있나요?

쿠키는 클라이언트 로컬에 저장되기도 하고 특히 파일로 저장되는 경우 탈취, 변조될 위험이 있어 보안이 비교적 취약합니다. 공용 PC에서 쿠키값이 유출될 수 있고, XSS (Cross Site Scripting)나 XSRF (Cross Site Request Forgery) 같은 공격에 취약합니다.


XSS 와 XSRF란?


해당 문제에 대한 해결책은?

기본적으로 사용자가 쿠키를 잘 관리해야 하고, 쿠키 내에는 웹 공격에 대응하기 위해 XSS를 대비한 HttpOnly 옵션과 XSRF를 대비한 Samesite 옵션이 있습니다.

HttpOnly 옵션은 쿠키를 서버에 전송하는 용도로만 사용할 수 있도록 지정함으로써 자바스크립트 같은 외부 프로그램이 접근할 수 없도록 막는 것이고, SameSite 옵션은 Cross-Site 요청이 들어올 때 쿠키를 포함하지 않도록 막는 방법입니다.


많은 단점에도 굳이 쿠키를 사용하는 이유는?

세션은 서버에 데이터를 저장, 즉 서버의 자원을 사용하기 때문에 서버 자원에 한계가 있고 메모리를 사용하다 보면 속도 저하도 올 수 있기 때문입니다.

특히 쿠키는 Load Balancing이 필요할 때 큰 역할을 할 수 있습니다.



세션 인증 방식과 토큰 인증 방식(JWT)의 차이점은?

세션 인증에서는 서버가 세션 ID를 저장하고 클라이언트가 쿠키에 실어보낸 세션 ID와 대조해서 확인하는 반면, 토큰을 사용하면 요청을 받은 서버는 토큰이 유효한지를 확인만 하기때문에 세션 인증에 비해 서버 운영의 효율이 더 좋습니다.



Refresh Token을 프론트 서버의 세션과 백엔드 서버 중 어디에 저장해야 될까요?

1) 프론트 서버의 세션에 저장하는 경우

Refresh token을 프론트 서버의 세션에 저장하면 클라이언트가 토큰이 저장된 세션에 접근하기 위해 Session ID를 쿠키로 가지고 있어야 합니다.

이 경우 새로 고침 상황에서 access token을 얻기 위해 벡엔드 서버로 요청을 보낼 필요가 없어 경제적입니다. 하지만 사용자가 많아질 수록 세션 관리가 힘들어질 수 있다는 단점이 있습니다.


2) 백엔드 서버에 저장하는 경우

Refresh token을 벡엔드 서버에 저장하면 새로 고침했을 때 Access token을 얻기위해 백엔드 서버를 거쳐야 해서 비용이 더 들게 됩니다. 하지만 사용자가 많아짐에 따라 생기는 서버 이슈가 프론트, 벡엔드로 나뉘지 않고 백엔드에서 대부분 처리하기 때문에 관리에 용이하다는 장점이 있습니다.



Refresh Token을 사용한다고 가정하고, 네이버 블로그의 Access token의 유효기간이 1시간이면 글을 작성하다 1시간이 지나서 글을 발행할 때 오류가 발생할텐데 이 문제는 어떻게 해결할 수 있을까요?

일정 시간마다 새로운 Access Token을 발급 받는 설정을 추가할 수 있습니다. Access Token의 만료 기간이 1시간이라면 55분 정도에 새로운 token을 발급 받도록 해서 사용자가 Access token이 만료되었다는 사실을 모르게 연장시킬 수 있습니다.



만약 Refresh Token이 탈취 당해 해커가 Refresh Token을 이용해 새로운 Access Token을 요청할 수 있지 않나요? 보안에 취약한 것 아닌가요?

Refresh Token은 클라이언트와 서버 두 곳에 저장됩니다. 만약 Refresh Token이 탈취되어 해커가 새로운 Access Token을 발급한다면 서버는 다른 나라의 IP주소로 요청이 들어왔다거나 하는 검증 작업을 통해 요청을 거절하고 Refresh Token을 서버에서 지워버려 Access Token을 해커에게 발급하지 않을 수 있습니다. 즉, Refresh Token은 서버가 해킹된 토큰에 대한 방어 행동을 취할 수 있게 해주는 도구가 됩니다.

그리고 Access token과 Refresh Token은 보안성뿐 아니라 성능과 사용 편의성 등을 적절하게 타협한 결과입니다. 보안만 추구한다면 더 좋은 방법들이 있을 것입니다.



Secure 쿠키가 어떻게 암호화되는지 설명해주세요.

통신 과정에서 정보 유출을 막기 위해 HTTPS 프로토콜을 사용해 데이터를 암호화해 서버에 넘겨줍니다.

암호화는 SSL/TLS 프로토콜에서 진행합니다.



웹 브라우저 쿠키의 최대는 왜 4KB인가?




References