web study/배경지식
로그인 JWT VS 쿠키&세션 방식
65살까지 코딩
2022. 1. 13. 13:46
728x90
반응형
회원가입 로그인 서비스를 만들다 보면 JWT를 사용할지 쿠키&세션을 사용할지 고민하게 된다. 이 글을 통해 알맞은 선택을 하기 바랍니다.
먼저 JWT란 무엇일까?
JWT란 JsonWebToken으로 클라이언트의 정보를 암호화하여 발급한 토큰이다.
예를들어 클라이언트가 로그인을 하면 서버에서 유저의 특정 정보(중요한 정보X)을 암호화하여 토큰을 발급해 클라이언트에게 전달한다. 클라이언트는 받은 토큰을 쿠키나 로컬스토리지에 저장하고 인증이 필요한 요청마다 쿠키에든 토큰을 HTTP 헤더에 넣어 서버에 전달하여 인증한다.
세부적으로 살펴보면
1. 클라이언트가 로그인을 한다.
2. 서버가 클라이언트에게 받은 특정값을 암호화하여 토큰을 발급하여 클라이언트에게 전달한다.
3. 클라이언트는 받은 토큰을 쿠키나 로컬스토리지에 저장한다.
4. 클라이언트가 인증이 필요한 요청을 하면 서버는 토큰을 이용하여 클라이언트를 인증하고 리스폰을 보내준다.
5. 토큰은 만들어질때 유효시간이 정해지는데 시간이지나면 만료되어 사라진다.
6. 토큰이 사라지면 클라이언트는 다시 토큰을 발급받아야한다.
JWT의 구조
- Header -> type과 암호화할 알고리즘이 들어가며 type은 항상 JWT이다.
- Payload -> 토큰이 갖는 정보로 유저의 특정값, 유효시간 등이 들어가 있다.
- Signature -> Header 인코딩 값과 정보의 인코딩값을 합치고 서버의 SECRET_KEY를 통해 암호화함
JWT의 장점
- 세션과 달리 stateless 상태이기 때문에 서버에 비용이 작고 확장에 용이하다. -> 트래픽이 적음
- 인증과정에서 db를 이용하지 않아 더 빠르다.(위와 같은말이긴함)
JWT의 단점
- 쿠키에 저장하면 CSRF에 취약하다.
- 로컬스토리지에 저장한 XSS에 취약하다.
- 토큰이 해킹당하면 유효시간이 지날떄까지 만료되지 않아 위험하다.
- 해결책 -> refresh token을 사용하자!
쿠키와 세션 방식
쿠키는 무엇이고 세션은 무엇일까?
쿠키는 간단하게 보면 서버대신 웹브라우저에 저장되는 key와 value구조로 저장되는 정보들이다. 세션은 쿠키가 노출되는 보안 문제를 해결하기위해 쿠키의 상세정보 ID, 로그인 상태, 시간 등을 가지고 있는 저장소이다.
예를들어 클라이언트가 로그인을 하면 서버는 requset를 처리하여 DB에 저장하고 sessionID쿠키값을 확인하고 db에 없다면 새로만들어 클라이언트에게 전달한다. 클라이언트는 인증이 필요한 요청마다 sessionId쿠키값을 header에 넣어 요청한다. 서버는 sessionid쿠키를 sessiondb에서 인증한후 리스폰을보낸다.
세부적으로 살펴보면
1. 클라이언트가 로그인을 하면서 서버에게 요청한다.(sessionid 쿠키가 없다고 가정)
2. 서버는 sessionid쿠키가 없음을 확인하고 새로생성한후 sessiondb에 인증에 필요한 값을 저장하고 sessionid쿠키를 전달한다.
3. 클라이언트는 인증이 필요할때마다 sessionid쿠키를 헤더에 담아 서버에 요청한다.
4. 서버는 sessionid쿠키를 sessiondb를 통해 인증, 갱신한 후 클라이언트에게 리스폰을 보낸다.
5. 클라이언트가 종료시 sessionid쿠키 제거, sessiondb에서도 제거됨
쿠키와 세션의 장점
- 보안 유지 -> SessionID만을 사용하기 때문에 보안에 있어서 JWT보다 안전하다
- 클라이언트의 웹브라우저에 의존하지 않아도 된다.
쿠키와 세션의 단점
- 한번에 접속하는 이용자가 많아질수록 세션의 양이커져 서버에 부하가 커진다.
- 서버의 확장성이 낮다.
728x90
반응형