우선 기존 프로젝트에서 커피 products와 member 데이터를 sql에서 불러오고 저장하며, 회원가입과 로그인을 구현했었다.
오늘은 이 개발자도구의 애플리케이션에서 보이는 쿠키와 세션에 대해 자세히 다루어보겠다.
쿠키는 길거리에 흘린 쪽지로 비유할 수 있다.
(누구나 볼 수 있고, 내용도 간단하며 분실 가능)
세션은 도서관 사물함으로 예시를 들수 있다.
(중요한 물건을 안전하게 보관, 열쇠(세션 ID)만 가지고 다님)
-> 이는 세션 ID를 통해 쿠키를 만든다고 생각하면된다.
구분 | 쿠키 | 세션 |
---|---|---|
저장 위치 | 클라이언트 (브라우저) | 서버 |
보안성 | 낮음 | 높음 |
저장 용량 | 제한됨 | 서버 용량에 따라 다름 |
정보 유출 위험 | 높음 | 낮음 |
용도 | 사용자 설정, 간단한 정보 저장 | 로그인 정보, 장바구니 등 중요 정보 저장 |
그럼 프로젝트의 개발자 도구의 애플리케이션을 보면 쿠키에서 JSESSIONID를 볼 수 있다. 이게 세션에서 던져주는 세션의 아이디 값 (도서관 사물함 열쇠)이다.
이 과정을 위의 그림과 같이 나타낼 수 있다. (ㅇㅈ님 감사합니다. 참고했어요..)
1. 로그인 요청 (Web Browser -> Server)
/login
{"email": "a@a.com", "pwd": "a" }
2. 세션 생성 및 쿠키 전달 (Server)
K
(키) - V
(값) 형태 저장member
키에 @100
(메모리 주소) 값 저장@100
메모리 주소에 Member
객체 생성email
, pwd
, nickname
등 사용자 정보 저장200 OK
Set-Cookie: JSESSIONID=1; Domain=example.com;
JSESSIONID=1
쿠키 생성 (세션 ID: 1)Domain=example.com
쿠키 적용 범위 설정{"msg": "ok"}
3. 쿠키 저장 (Web Browser)
example.com
도메인에 JSESSIONID=1
쿠키 저장naver.com
도메인에 name=2
쿠키 저장 (별도의 쿠키, 예시)4. 장바구니 요청 (Web Browser -> Server)
/cart
example.com
도메인의 JSESSIONID=1
쿠키 자동 전송그렇다면 세션관리 측면에서 Fetch와 Axios의 차이는 뭘까?
Fetch는 쿠키 자동 전송 X, 직접 구현 필요한 부분이(json 직접 변환) 많아 불편하다.
반면 Axios는 쿠키 자동 전송 O, 인터셉터 등 편의 기능(json 자동 변환) 다수 제공하여 편리하다.
때문에 세션관리와 JWT 인증시에도 Axios가 개발 편의성과 효율성 훨씬 높다!!
JWT(JSON Web Token)는 정보를 안전하게 전달하기 위한 개방형 웹 표준으로 JSON 형식으로 정보를 표현한다.
대표적으로 우리가 알고있는 큐알코드가 JWT방식이다!
디지털 서명을 통해 위변조를 방지하는 주로 사용자 인증 및 권한 부여에 사용되어 기존 방식보다 현대적인 웹 표준이라고 볼 수 있다.
-> 다만 토큰 털리면 다털리는 정보라 보안에 매우 취약
위 그림은 JWT(왼쪽)와 기존 세션 방식(오른쪽)을 보여준다.
[오른쪽: 기존 세션 방식]
기존 세션 방식은 세션 ID를 통해 접근한다.
-> DB부하 증가
[왼쪽: JWT 방식]
JWT 방식은 API GATEWAY를 통해 접근한다.
API Gateway는 클라이언트 요청을 받아서 각 서비스로 전달하고, 검증, 인증, 권한을 부여한다.
JWT의 장점과 단점 (결론)
이처럼 JWT는 서버 부담을 줄이고 확장성을 높여 MSA 환경에 적합하며, API Gateway와 함께 사용하여 MSA 구성을 단순화할 수 있다는 장점을 가지고 있다.
하지만 토큰 하나가 탈취되면 전체 시스템이 위험에 노출될 수 있다는 보안상의 취약점을 해결하기 위해 JWT를 사용할 때는 다음과 같은 추가적인 보안 조치를 고려해야 한다.
이러한 단점 때문에 SNS 계정은 계정 탈취 및 악용을 방지하기 위해 특정 환경에서만 로그인을 허용하여 JWT를 지양한다.