Session / Cookie 방식
한마디로 요약하면, 사용자는 Cookie를 이용하여 인증받고, 서버에서는 Cookie를 통해 Session 정보를 인증함
우선 Session과 Cookie가 의미하는 바는 다음과 같습니다.
Session : 서버에서 클라이언트 정보를 가지고 있는 것을 의미
Cookie : 서버에서 발급된 세션을 열기 위한 값 (= Session ID라는 Key값 저장)
Session / Cookie 방식의 특징
- 인증 간 기본적으로 Session 저장소(DB, Memory DB, WAS 등의 방법이 있음)를 활용함
- Session 저장소는 사용자가 로그인시 로그인한 사용자의 정보를 저장하고, 세션 ID (Key 값)를 만들어 Response의 HTTP Header에 같이 보냄
- 브라우저는 Session ID를 포함하는 쿠키를 만들어 저장하고 추후에 인증 요청에 쿠키 정보를 같이 보냄
Session 작동 Flow
1. 유저가 웹사이트에 접속 (로그인)
2. 서버가 유저에게 sessionId를 부여 및 세션 저장소에 sessionId 저장
3. 유저의 브라우저가 응답 받은 sessionId를 cookie에 기록
4. 이후 인증이 필요한 Request 마다 sessionId를 Webserver에 전송
5. sessionId에 의해 서버는 해당 특정 유저를 인식 가능
Token 방식
인증에 필요한 정보들을 암호화하는 방법을 의미. 사용자는 Access Token 을 HTTP 헤더에 실어 서버에 전송하여 인증 인가를 받음. 한정된 시간(expiration time)을 가지며, 새로운 토큰은 한번 만료되면 새로 생성되어야합니다.(Refresh Token)
Token 방식의 대표적인 방법인 JWT Token에 대한 설명은 이전 글들을 참조
https://yubi5050.tistory.com/170 // JWT Token - Access Token과 Refresh Token
https://yubi5050.tistory.com/67 // JWT Token , CSRF Token
Token 방식 작동 Flow
1. 유저가 웹사이트에 접속 (로그인)
2. 서버에서 계정 정보를 읽어 사용자를 확인 후, 사용자의 고유 ID 값 부여
3. 서버에서 Secret key 를 이용해 Access Token 을 발급
4. 사용자는 Access Token 을 받아 저장 후, 인증이 필요한 요청마다 Token을 헤더에 입력
5. 서버에서 들어온 Token의 Signature를 Secret Key로 복호화 및 유효 기간 등 검증
6. 검증 통과시 Payload 디코딩을 통한 사용자의 ID 에 맞는 데이터 조회
두 방법의 차이점
두 방법 모두 HTTP Header에 인증정보(세션 ID , Token)를 실어 서버로 보냄
가장 큰 차이로는 Session의 경우 서버 측에서 별도의 저장소를 이용해 관리한다 vs Token은 인증을 위해 암호화/복호화를 한다는 점
1. 인증 도구의 사이즈 (길이)
Session의 session id 크기는 작은 반면, Token은 data를 base64url로 변환하여 보내기 때문에 비교적 크기가 큼
2. 안정성(보안) + 저장
Session/Cookie는 서버의 세션 저장소에서 유저 정보를 저장/관리하는 반면, Token은 웹 브라우저의 Token에 저장되므로 비교적 Token이 안정성이 떨어짐
3. 확장성 (가장 중요한 이유)
세션은 서버를 여러대를 쓸 경우, request 마다 접속한 서버가 달라질 수 있음 (A1 서버에서는 session id가 3번, A2 서버에서는 session id가 2번..) 매번 다른 서버를 통할 때마다 로그인을 해줘야 되므로 매우 비효율적인 반면 Token은 들어온 Token의 Signuature를 서버측 Secret Key로 풀기만 하면 정보가 확인 가능하기 때문에 이런 과정이 불필요.
두 과정의 Flow를 잘 설명한 그림 (출처 : https://fierycoding.tistory.com/69)
참고 문헌
- https://valuefactory.tistory.com/708
- https://tofusand-dev.tistory.com/89
- https://fierycoding.tistory.com/69
- https://runebook.dev/ko/docs/django/topics/http/sessions // (+ Django의 세션 setting)
'기술 정리 & CS > 인증, 인가' 카테고리의 다른 글
[Authentication] JWT Token - Access Token과 Refresh Token (0) | 2022.09.05 |
---|---|
[Authentication] JWT Token , CSRF Token (0) | 2022.06.09 |
[Authentication] Token 기반 시스템이란? (0) | 2022.06.09 |