본문 바로가기
TIL

11. 22. 30일차 TIL 세션, 토큰, 쿠키, JWT

by 눈 새 2024. 11. 22.

오늘은 챌린지 반에서 과제를 통해 세션이란 무엇인지, 토큰, 쿠키, JWT란 무엇인지에 대해 알게 되었다.


1. 쿠키

쿠키는 웹 브라우저에 저장되는 작은 데이터 조각이다. 쿠키는 서버가 클라이언트에게 데이터를 저장하도록 요청하면, 브라우저는 해당 데이터를 저장하고 이후 요청에서 다시 서버로 보내는 방식으로 작동한다.

 

1) 주요 특징

- 클라이언트(-라우저) 측에 저장됨.

  • 쿠키는 사용자의 컴퓨터에 저장된다.
  • 저장된 쿠키는 동일한 도메인에 대한 요청 시 자동으로 서버에 전달된다.

- 크기 제한

  • 쿠키는 보통 4KB이하의 데이터를 저장할 수 있다.

- 수명

  • 쿠키에는 만료 시간이 설정될 수 있다.
  • 만료 시간이 없는 쿠키는 브라우저를 닫으면 삭제 된다. (세션쿠키)
  • 만료 시간이 설정된 쿠키는 브라우저를 껏다 켜도 유지된다. (영구 쿠키)

- HTTP 요청과 함께 전송됨.

  • HTTP 요청 헤더에 포함되어 서버로 전송된다.
  • 따라서 서버와 클라이언트 간의 요청마다 오고 가게 된다.

 

2) 구조

- 쿠키는 간단한 키-값 쌍으로 이루어져 있다.

  • 키-값 : user_name=NoonSae → 저장된 데이터
  • Expires : 쿠키의 만료 시간
  • Path: 이 쿠키가 유효한 URL 경로
  • HttpOnly : JS로 접근할 수 없도록 설정해 보완을 강화
  • 예시코드
Set-Cookie: 
	username=JohnDoe; 
	Expires=Fri, 
	25-Dec-2024 23:59:59 GMT; 
	Path=/; 
	HttpOnly

 

3) 주요 용도

  • 사용자 인증 : 사용자가 로그인하면 서버는 쿠키를 통해 인증 정보를 저장하고, 사용자가 로그인 상태를 유지하도록 돕는다.
  • 사용자 설정 : 웹사이트는 사용자의언어, 테마, 지역, 등의 선호도를 쿠키에 저장한다.
  • 세션 관리 : 쿠키를 사용해 세션 ID를 저장하고, 이를 통해 세션을 식별한다.
  • 트래킹 : 사용자의 웹 활동을 추척하는 데 사용 될 수 있다. (ex: 유튜브 알고리즘)

 

4) 쿠키의 장단점

- 장점

  • 간단함 : 데이터를 클라이언트 측에 저장해 서버의 부담을 줄인다.
  • 지속성 : 만료 시간이 설정된 쿠키는 사용자가 브라우저를 닫아도 유지된다.

- 단점

  • 보완문제
    • 쿠키는 클라이언트에 저장되므로, 데이터 조작이나 탈취의 위험이 있다.
    • HTTPS를 사용하지 않으면 쿠키가 쉽게 탈취될 수 있다.
  • 용량 제한
    • 데이터 크기가 제한적이다.

쿠키는 클라이언트(브라우저)에 저장되어 서버와의 요청마다 자동으로 전달되는 사용자의 정보를 담은 작은 데이터 조각으로, 주로 사용자 인증, 사용자 설정, 세션의 관리, 트래킹에 사용된다.


2. 세션

세션은 웹 애플리케이션에서 클라이언트(사용자)와 서버 간의 상태를 유지하기 위한 방법 중 하나이다. 세션은 특히 사용자가 로그인한 상태나 특정 작업을 수행하는 동안 정보를 유지하는 데 사용된다.

 

1) 주요 특징

- 서버 중심의 상태 관리

  • 세션 데이터는 서버에 저장된다.
  • 클라이언트는 세션의 식별자(Session ID)만 가지고 있으며, 서버에서 해당 ID를 통해 세션 데이터를 식별한다.

- 세션 ID (Session ID)

  • 클라이언트가 서버에 요청을 보낼 때마다 세션 ID를 함께 전달한다.
  • 서버가 사용자를 구별하는 데 사용된다.
  • 보통 쿠키에 저장되어 클라이언트와 서버 간에 전달된다.

- 수명

  • 대게적으로 일정 시간이 지나면 만료된다.
  • 만료 시간은 서버 설정에 따라 조정할 수 있다.
  • 사용자가 브라우저를 닫으면 세션이 종료되도록 설정할 수 있다.

- 보안

  • 서버에 데이터를 저장하기 때문에 클라이언트 측에서 데이터를 조작할 위험이 적다.
  • 하지만 노출되면 보안 문제가 발생할 수 있으므로 HTTPS를 사용하여 세션 ID를 안전하게 전달하는 것이 중요하다.

 

2) 세션의 작동 방식

  1. 클라이언트가 서버에 처음 요청을 보낸다.
  2. 서버는 새로운 세션을 생성하고, 고유한 세션 ID를 생성한다.
  3. 서버는 이 세션 ID를 클라이언트에 반환한다.
  4. 클라이언트는 이후 요청에서 세션 ID를 포함해 서버에 요청을 보낸다.
  5. 서버는 세션 ID를 확인하여 클라이언트를 식별하고 해당 세션에 저장된 데이터를 사용한다.

 

3) 세션의 장단점

- 장점

  • 서버에 데이터가 저장되므로 클라이언트 측에서 조작이 어렵다.
  • 다양한 정보를 안전하게 유지할 수 있다.

- 단점

  • 서버의 메모리를 사용하므로 사용자 수가 많아지면 서버 부하가 증가할 수 있다.
  • 클라이언트와 서버 간 상태를 유지하려면 지속적으로 세션 ID를 주고 받아야한다.

 세션은 서버가 사용자 상태를 기억하는 방법으로 로그인과 같은 사용자 인증 상태를 유지하거나, 즐겨찾기와 같은 사용자 식별과 데이터를 관리하는 데 주로 사용된다.


3. 토큰

토큰이란 사용자의 인증 정보를 포함하는 문자열이다.토큰은 서버와 클라이언트 간의 통신에서 인증이나 권한 부여를 위해 사용된다. 일반적으로 서버는 사용자가 로그인 성공 시 생성한 뒤, 클라이언트에게 전달하고 이후 요청에 포함시킨다.

 

1) 특징

- 문자열 형식

  • 특정 구조를 가진 문자열로 보통 JSON 형식을 기반으로 한다 (ex: JWT)
  • 예시 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…

- 클라이언트 중심

  • 토큰은 클라이언트 측에서 저장된다 ( 로컬 스토리지 || 쿠키 )
  • 서버는 토큰 자체를 저장하지 않고, 요청에서 받은 토큰을 검증한다.

- 탈중앙화

  • 서버는 클라이언트를 식별할 수 있지만, 사용자 상태 정보를 직접 관리하지 않는다.

- 수명

  • 토큰은 만료 시간이 설정되며, 만료 후에는 새 토큰이 필요하다
  • 예시 : Access Token, Refresh Token, 등

 

2) 주요 용도

- 인증 (Authentication)

  • 사용자가 로그인하면 서버는 사용자 정보를 기반으로 토큰을 생성하고, 클라이언트에게 전달한다. 이후 클라이언트는 이 토큰을 통해 인증을 수행한다.
  • 예시 : JSON Web Token (JWT)을 이용한 인증

- 권한 부여 (Authorization)

  • 토큰에 포함된 정보를 기반으로 특정 리소스에 접근할 권한을 부여한다.

- API 호출

  • API 요청에서 사용자의 인증을 확인하는 데 자주 사용된다.
  • 예시 : REST API, GraphQL API, 등

- 상태 유지

  • 로그인 상태를 유지하거나 특정 작업을 처리하기 위해 사용된다.

 

3) 작동 방식

  1. 클라이언트가 사용자 인증 정보를 서버로 보낸다. (ex : ID, PW)
  2. 서버는 정보를 확인한 뒤, 인증에 성공하면 토큰을 생성하여 클라이언트에게 전달한다.
  3. 클라이언트는 이 토큰을 로컬 스토리지쿠키에 저장한다.
  4. 이후 클라이언트가 서버에 요청을 보낼 때, 토큰을 함께 전송한다.
  5. 서버는 이 토큰을 검증하여 요청을 처리한다.

 

4) 장단점

- 장점

  • 확장성 : 서버가 상태를 저장하지 않으므로, 여러 서버 간에 분산 처리가 용이하다.
  • 독립성 : 클라이언트는 서버와의 지속적인 연결 없이 토큰을 활용해 인증이 가능하다.
  • 보안성 : HTTPS를 사용하면 안전하게 사용할 수 있고, 토큰 자체에 정보가 암호화될 수 있다.

- 단점

  • 노출 위험 : 노큰이 탈취되면 공격자가 이를 사용해 서버에 접근할 수 있다.
  • → 때문에 .env파일에 저장하여 배포시 파일이 업로드 되지 않게 하였음.
  • 크기 부담 : 토큰은 인증 정보를 포함하기 때문에 세션 ID보다 크기가 더 크다.

 토큰은 서버가 사용자 인증에 성공한 후 발급하는 고유한 문자열로, 클라이언트는 이를 저장하고 요청 시 포함하여 서버에 신원을 증명하며, API 호출이나 권한 검증과 같은 작업에 주로 사용된다.


4. JWT (JSON Web Token)

JWT란 JSON 형식의 데이터를 안전하게 전송하기 위해 사용되는 토큰이다. JWT는 사용자의 인증 정보나 데이터를 JSON 형식으로 담고, 이를 암호화하거나 서명하여 무결성을 보장한다.

 

구조

// JWT 구조

Header.Payload.Signature

 

헤더 (Header)

  • JWT의 타입과 사용된 암호화 알고리즘 정보를 포함한다.

 

페이로드 (Payload)

  • 토큰에 담고 싶은 데이터 (주로 인증 정보)를 포함한다.
    • sub : 사용자 ID 또는 고유 식별자
    • iat : 토큰이 발급된 시간
    • exp : 토큰의 만료 시간
    // 페이로드 예시
    
    {"sub": "1234567890", "name": "John Doe", "admin": true}
    

 

서명 (Signature)

  • JWT의 무결성을 보장하는 부분
  • 서명 덕분에 토큰의 데이터가 조작되지 않았음을 확인할 수 있다.
// 서명 예시 

HMACSHA256(
  base64UrlEncode(Header) + "." + base64UrlEncode(Payload),
  secret
)

 


# 토큰과 쿠키, 세션의 차이점

  1. 저장 위치
    • 쿠키와 토큰 은 클라이언트 측에 저장된다.
    • 세션서버 측에 저장된다.
  2. 상태 관리
    • 토큰무상태(stateless) 인증을 지원하며, 서버가 상태를 저장하지 않는다.
    • 세션상태 유지(stateful) 인증 방식이다.

# JWT와 토큰의 차이점

  • 일반 토큰은 보통 단순 문자열이며, 서버가 이를 저장해 검증한다.
  • JWT는 자체적으로 정보를 포함하며, 서버는 이를 저장하지 않고 검증만 수행한다.

★ 30일차 소감

 

쿠키, 토큰, 세션이 무엇인지에 대해 새롭게 알게 되었다. 또 이를 통해 쿠팡의 맞춤형 광고, 유튜브의 알고리즘이 어떻게 작동하는 것인지 이해할 수 있게 되었다. 

'TIL' 카테고리의 다른 글

11. 25. 31일차 TIL  (0) 2024.11.25
11. 21. 30일차 TIL 팀프로젝트 회고  (0) 2024.11.22
11. 19. 29일차 TIL git reflog  (0) 2024.11.20
11.18. 28일차 TIL Team_Project 로그인, 회원가입  (0) 2024.11.18
11. 15. 27일차 TIL Team Project_01  (2) 2024.11.16