1. 캐시(cache)
- 데이터의 복사본을 저장하여 이후 요청 시 데이터 접근 속도를 높이는 메커니즘
서버가 클라이언트의 브라우저에 저장할 수 있는 작은 데이터 조각
- 클라이언트가 서버에 요청을 보낼 때, 서버는 캐시된 데이터를 반환 할 수있음
- 클라이언트는 캐시에서 데이터를 찾을 수 있음
- 브라우저 캐시: 웹 페이지의 이미지, 스타일 시트, 스크립트 등을 저장하여 다음 방문 시 더 빠르게 로드할 수 있게 함
- 서버 캐시: 서버에서 자주 요청되는 데이터나 계산 결과를 저장하여 서버의 부하를 줄이고 응답 속도를 향상시킴
2. 쿠키(cookie)
- 사용자의 브라우저에 저장이 되고 통신 할 때 HTTP 헤더에 포함되는 데이터 파일
= 웹 서버가 클라이언트의 브라우저에 저장할 수 있는 작은 데이터 조각
- 키와 값으로 구성
- 만료일을 설정할 수 있으며, 만료일이 지나면 브라우저가 쿠키를 삭제
- 브라우저를 닫아도 유지됨(-> 서버가 아닌 브라우저가 발급하는 거니까 브라우저는 여전히 정보를 알고 있음)
- 특정 경로와 도메인에만 유효함. 쿠키의 범위를 제한 할 수 있음
- 주로 자동 로그인 유지, 위시 리스트 저장, 팝업창 보지 않기, 뷰 설정값에 사용
브라우저에 저장되므로 해당 사용자의 컴퓨터를 사용하면 누구나 쿠키에 입력된 값을 쉽게 확인 가능 ==> 보안성이 낮다!
3. 세션(session)
- 클라이언트와 서버 간의 상태를 유지하기 위해 서버에서 관리하는 메커니즘
클라이언트가 서버에 접속 시, 세션 ID를 발급해주고 서버에서는 클라이언트에게 발급해준 세션 ID를 이용해서 저장
= 서버에 저장되는 쿠키로 클라이언트와 서버의 통신 상태
- 서버가 발급하고 내용을 다 들고 있는 것이 아니라 자기가 발급해준 JsessionID로만 비교함
- 일반적으로 브라우저가 열려 있는 동안 또는 세션이 만료될 때까지 유지됨(-> 서버 측에서 세션 만료 시간을 설정할 수 있음)
- 주로 중요한 데이터를 저장 할 때 사용
사용자의 로컬이 아닌 서버에 직접 저장되므로 클라이언트 측에서 세션 내의 데이터에 접근하기 어려움 ==> 비교적 보안성이 높다!
[작동 방식]
클라이언트가 서버에 요청을 보낼 때, 서버는 세션을 생성하고 세션 ID를 클라이언트에 쿠키로 보내줍니다.
클라이언트는 이후의 요청에서 이 세션 ID를 포함시키며, 서버는 이 ID를 통해 해당 세션의 데이터를 참조합니다.
4. 토큰(Token)
토큰은 웹 애플리케이션 및 API에서 인증과 권한 부여를 처리하는 데 널리 사용되는 메커니즘입니다. 일반적으로 JSON 웹 토큰(JSON Web Token, JWT)과 같은 형태로 사용됩니다.
토큰의 정의와 사용
1. 토큰의 기본 개념
- 정의: 토큰은 인증된 사용자의 신원을 증명하고, 특정 권한을 부여하는 데 사용되는 문자열입니다. 일반적으로 서버에서 발급되며, 클라이언트는 이 토큰을 사용하여 인증과 권한 부여를 수행합니다.
- 형식: 토큰은 문자열로, 일반적으로 JSON 형식의 데이터를 포함하며 Base64로 인코딩됩니다. 가장 널리 사용되는 형식 중 하나는 JSON 웹 토큰(JWT)입니다.
2. JSON 웹 토큰 (JWT)
- 구성: JWT는 3부분으로 나누어져 있습니다.
- 헤더 (Header): 토큰의 타입과 해싱 알고리즘 정보를 포함합니다. 예를 들어, {"alg": "HS256", "typ": "JWT"}.
- 페이로드 (Payload): 토큰에 담길 클레임(정보)을 포함합니다. 클레임은 사용자 정보, 토큰의 만료 시간 등 다양한 정보를 담을 수 있습니다.
- 서명 (Signature): 헤더와 페이로드를 조합하여 비밀 키를 사용해 서명한 부분입니다. 이 서명 부분은 토큰의 무결성을 검증하는 데 사용됩니다.
- 예시: eyJhbGciOiAiSFMyNTYiLCAidHlwIjoiSldUIn0.eyJzdWIiOiAiMTIzNDU2IiwgIm5hbWUiOiAiSm9obiBEb2UiLCAiaWF0IjoiMTYxNjEyMzQ1NiJ9.D_1Qo6XzxJ8-z_G8T9MsJ5V1AW89H0wI2-KXYfDQ6DQ
3. 토큰의 작동 방식
- 발급: 사용자가 로그인하면 서버는 인증된 사용자에게 토큰을 발급합니다.
- 전송: 클라이언트는 서버에 요청을 보낼 때 이 토큰을 HTTP 헤더(예: Authorization: Bearer <token>)에 포함시켜 전송합니다.
- 검증: 서버는 요청을 받을 때 토큰을 확인하고 서명을 검증하여 유효성을 검사합니다. 토큰이 유효하면 요청을 처리합니다.
4. 토큰의 장점
- 상태 비저장 (Stateless): 서버가 상태를 저장할 필요 없이 클라이언트가 토큰을 통해 필요한 정보를 서버에 제공할 수 있습니다.
- 확장성: 서버 간의 인증 정보 공유가 용이하여 분산 시스템에서 유용합니다.
- 자체 포함 (Self-contained): 토큰에 사용자 정보와 클레임이 포함되어 있어, 별도의 데이터베이스 조회 없이도 사용자 정보를 사용할 수 있습니다.
5. 보안 고려 사항
- 만료 시간 (Expiration): 토큰에 만료 시간을 설정하여 보안을 강화할 수 있습니다. 토큰이 만료되면 새로운 토큰을 발급받아야 합니다.
- 비밀 키 관리: 서명을 위해 사용되는 비밀 키는 안전하게 관리되어야 하며, 노출되지 않도록 주의해야 합니다.
- HTTPS 사용: 토큰을 안전하게 전송하기 위해 HTTPS를 사용하는 것이 중요합니다.
- 토큰 탈취 방지: 토큰이 탈취되지 않도록 HttpOnly와 Secure 플래그를 설정하여 쿠키로 저장하는 경우 보안을 강화할 수 있습니다.
6. 토큰의 종류
- 접근 토큰 (Access Token): API 호출 시 권한을 부여하는 데 사용됩니다. 일반적으로 짧은 만료 시간을 갖습니다.
- 갱신 토큰 (Refresh Token): 접근 토큰의 갱신을 위한 토큰으로, 상대적으로 긴 만료 시간을 갖습니다. 갱신 토큰을 사용하여 새로운 접근 토큰을 발급받을 수 있습니다.
토큰은 사용자 인증 및 권한 부여를 처리할 때 유용하며, 클라이언트와 서버 간의 효율적인 통신을 지원합니다.
'CS' 카테고리의 다른 글
URL에 대해 알아보자 (0) | 2023.05.06 |
---|---|
헷갈리기 쉬운 경로표기법 (0) | 2023.02.06 |