Cookie
- <key , value> 형태의 문자열로 브라우저에 저장되어 사용자를 인식하거나 일부 데이터를 저장하는 역할을 수행한다.
- 서버가 클라이언트에 정보를 전달할 때 저장하고자 하는 정보를 응답 헤더(Cookie)에 저장하여 전달한다.
- Cookie가 노출되었을 때 ID, PW와 같은 중요 정보들이 쉽게 노출된다.
- Cookie의 사이즈는 4KB로 제한되어 많은 양의 데이터를 담을 수 없다.
- 클라이언트 컴퓨터에 모든 데이터를 저장한다.
동작
- 클라이언트가 페이지를 요청한다. (사용자가 웹사이트 접근)
- 웹 서버는 쿠키를 생성한다.
- 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다.
- 넘겨 받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다.
- 동일 사이트 재방문시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.
Session
- Cookie에 ID, PW와 같은 중요 정보들을 담는게 아니라, 중요 정보가 아닌 인증을 위한 별개의 정보를 session 저장소에 저장하고, 클라이언트는 이 정보를 쿠키에 대신 담아서 요청하고 서버는 session 저장소에 있는 정보랑 일치하는지 확인하는 방식이다.
- 서버에 데이터를 저장하고 세션의 키값만을 클라이언트에 남겨둔다.
- http stateless를 위반
동작
- 클라이언트(사용자)가 서버로 접속(http 요청)을 시도한다.
- 서버(웹)는 접근한 클라이언트의 request-header field인 cookie를 확인해 클라이언트가 해당 session-id를 보내왔는지 확인한다.
- session-id가 존재하지 않는다면, 서버는 session-id를 생성해 클라이언트에게 돌려준다.
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장한다.
- 클라이언트는 재접속 시, 이 쿠키를 이용하여 session-id 값을 서버에 전달한다.
Cookie | Session | |
저장위치 | 클라이언트 | 서버 |
속도 | session보다 빠르다 | cookie보다 느리다 |
보안 | session보다 안좋다 | cookie보다 좋다 |
JWT
- JWT는 정보를 안전하게 전달하기 위한 JSON형식의 토큰이다.
- JWT의 형식은 .으로 구분되어 3가지 정보를 가진다. xxxxxx.yyyyyy.zzzzz 같은 모양이다. 첫 번째 부분인 xxxxx는 Header, 중간인 yyyyyy는 Payload, 마지막 zzzzz는 Signature이다.
- Header에는 일반적으로 JWT의 타입과 알고리즘 두 부분으로 구성된다. 그리고 이 JSON은 “Base64Url”로 인코딩되어 JWT의 첫 부분에 위치한다.
- Payload에는 *claim들이 포함된다. claim은 세 가지 유형으로 나뉜다.
- registered claims: 표준화된 클레임으로 다음과 같이 나뉜다.
- iss: 발급자
- sub: 주제
- aud: 청중
- exp: 만료 시간
- nbf: 활성 시간
- iat: 발급 시간
- public claims: 개인적으로 정의한 클레임이다.
- private claims: 발급자와 수신자 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임이다.
- registered claims: 표준화된 클레임으로 다음과 같이 나뉜다.
- Signature는 Base64Url(Header) + Base64Url(Payload) + 비밀 키로써 signature를 통해 토큰이 변경되지 않았음을 확인해 토큰의 무결정성을 보장한다.
동작
- 사용자 로그인
- 서버에서 액세스 토큰, 리프레시 토큰 발급후 사용자에게 지급
- 액세스 토큰과 함께 서버에 데이터를 요청
- 액세스 토큰을 서버의 비밀키로 검증
- 액세스 토큰에 문제가 없다면 요청한 데이터와 함께 사용자에게 데이터 응답
- 액세스 토큰이 만료되었다면 리프레시 토큰으로 액세스 토큰 재발급
장점
- stateless 상태를 유지한다.
- 별도의 저장소가 필요없다.
- 확장성이 우수하다
- 무결정성을 보장한다.
단점
- JWT가 탈취 당하면 페이로드의 내용이 공개된다.
- 정보가 많아 질 수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
https://88240.tistory.com/190
https://hahahoho5915.tistory.com/32
https://velog.io/@znftm97/JWT-Session-Cookie-비교-sphsi9yh#span-stylecolor0b6e992-cookie--sessionspan
*claim: key-value쌍의 데이터를 뜻한다.
'computer science > knowlege' 카테고리의 다른 글
순환 참조 (1) | 2024.08.31 |
---|---|
Git/GitHub - stash (1) | 2024.06.13 |
Authentication, Authorization (0) | 2023.10.28 |