🍪 쿠키
서버가 사용자의 브라우저에 데이터를 저장하기 위해 사용하는 key-value 형태의 문자열입니다.
특징
- 서버가 유효기간을 설정할 수 있습니다.
- 브라우저 종료 후에도 데이터가 유지됩니다.
- 요청 시 자동으로 브라우저가 쿠키를 서버에 전송합니다.
- 해당 도메인에서만 사용 가능합니다.
- 인증 외에도 다양한 데이터(예: 언어 설정)를 저장할 수 있습니다.
- 저장할 수 있는 데이터 크기에 제한이 있습니다.
동작 방식
- 사용자가 웹페이지를 요청합니다.
- 서버는 쿠키를 생성하여 응답에 포함시킵니다.
- 브라우저는 쿠키를 저장합니다.
- 이후 서버로 요청이 있을 때마다 브라우저는 저장된 쿠키를 자동으로 서버에 전송합니다.
📄 세션
서버에서 사용자 정보를 관리하는 방법으로, 사용자별로 고유한 ID(세션 ID)를 부여하여 관리합니다.
특징
- 사용자가 많을 경우 서버의 부하가 증가합니다.
- 보안성이 높지만, 서버 자원을 많이 사용합니다.
- 브라우저 종료 시 인증 상태가 소멸합니다.
- 사용자는 세션 ID만을 가지고 있으며, 서버에서 사용자 정보를 관리합니다.
- 서버에서 사용자의 로그인 상태 등을 직접 관리할 수 있습니다.
동작 방식
- 사용자가 서버에 접속하면 서버는 세션 ID를 생성하고, 이를 쿠키를 통해 사용자에게 전달합니다.
- 사용자가 다른 페이지에 접속할 때, 브라우저는 세션 ID가 담긴 쿠키를 서버에 전송합니다.
- 서버는 세션 ID를 통해 사용자를 식별하고 인증합니다.
토큰(JWT)
JSON Web Token의 약자로, 서버와 클라이언트 간에 정보를 안전하게 전송하기 위해 사용되는 토큰입니다.
특징
- 설정된 유효기간 동안 사용 가능합니다.
- HTTP 통신의 헤더에 담겨 전송됩니다.
- 사용자 인증에 필요한 정보가 토큰에 포함됩니다.
- header | payload | signature로 구성됩니다.
- 공간 제약이 없습니다.
- 사용자 정보의 변경 관리가 어렵습니다.
- 암호화된 것이 아니므로, 중요한 개인 정보를 포함시키지 않는 것이 바람직합니다.
JWT의 정의는 정의서명 알고리즘을 이용해 암호화된 토큰입니다.
근데 왜 암호화된것이 아닐까요?
우선 첫번째 JWT는 누구나 볼 수 있다는 점
따라서 암호화가 되었더라도 유저의 정보가 노출될 가능성 자체가 존재하게 됩니다.
두번째 알고리즘의 레인보우 테이블이 공개되어있다.
벡엔드에서 유저 정보를 받아 JWT를 만드는 과정에서 몇번의 암호화, 어떤 암호화 방식 등 사용할 수 있는 라이브러리를 사용합니다.
이것은 공격을 마음을 먹은 해커에게 장벽이 되지 않습니다. 레인보우 테이블이 존재하는 이상 언제든지 암호화를 풀어버릴 수 있습니다.
따라서 JWT에는 유저의 개인정보, 비밀번호 등의 중요한 정보를 넣지 않는 것이 바람직합니다.
동작 방식
- 사용자가 로그인 정보를 서버에 전송합니다.
- 서버는 사인 알고리즘을 사용하여 토큰을 생성하고, 이를 사용자에게 전송합니다.
- 이후 사용자는 서버에 요청을 보낼 때 마다 이 토큰을 함께 전송합니다.
- 서버는 토큰의 유효성을 검증하고, 유효하면 요청을 처리합니다.