2024. 2. 23. 02:07ㆍBACKEND/Security
글 다 썼는데.. 갑자기 사라졌다. 화가 나지만 복습 겸 다시 쓴다.. 다른 분들은 꼭 임시 저장하시길..
그동안 프로젝트를 하면서 로그인, 회원가입 부분을 구현하다 보면 세션 방식, JWT 방식으로 구현해보곤 했다. 구체적인 차이에 대해서 잘 몰랐으나 이번 프로젝트를 하면서 다시 공부하였고 공부한 부분을 정리해보고자 한다.
1. JWT(Json Web Token) 란 무엇인가?
JWT는 클라이언트와 서버 간 인증방식을 안전하게 하기 위해 이용하는 토큰이다. .(점)으로 이루어진 세 문자열로 이루어져 있다.
https://jwt.io/ 이 사이트에서 JWT 토큰 인코딩 디코딩을 해볼 수 있다.
세 부분은 다음과 같이 나눠진다.
Header
헤더 부분에는 토큰의 종류 (JWT), 사용된 해쉬암호화 방식 등의 메타데이터가 들어 있다.
Payload
페이로드는 토큰 내에 들아가는 클레임(Claim)의 집합이다. 클레임은 데이터 정도로 생각하면 될 것 같다. JWT는 디코딩이 몹시 쉽기 때문에 민감한 정보는 담지 않는 것이 좋다.
Signature
Header, Payload의 정보들과 서버에서 가지고 있는 secret key 의 값을 통해 헤더에서 정의한 알고리즘으로 암호화를 한다. 이때, Header, Payload의 정보 중 한글자라도 바뀌거나 secret key 값이 바뀐다면 Signature 값은 완전히 다르게 변한다. 서버에서는 이 Signature 값을 보고 우리 서버에서 발급한 토큰인지 확인 가능하다.
즉 JWT 는 정보 전달의 목적보다는 우리 서버에서 발급한 토큰인지 인증하는 역할이 더 크다.
2. 쿠키 vs 세션 vs jwt
JWT 작동 방식을 알기에 앞서 쿠키와 세션에 대해 살펴보자.
2-1. 쿠키 작동 방식
쿠키는 Key-Value를 가진 문자열 쌍이다. 클라이언트의 브라우저에 저장이 된다.
- 클라이언트가 서버에 로그인 요청
- 서버는 로그인 요청을 확인하고 응답 헤더에 user에 대한 정보 추가
- 클라이언트는 갖고 있던 쿠키를 서버에 요청을 보낼 때 헤더에 담아서 전달
- 해당 정보를 바탕으로 서버는 클라이언트의 사용자가 누군지 식별
단점
- 쿠키 안에 값이 그대로 들어 있기 때문에 보안에 취약하다.
- 쿠키의 용량제한이 있어 많은 정보를 담지 못한다.
- 쿠키가 많아질 수록 네트워크에 부하가 간다.
2-2. 세션 작동 방식
위의 쿠키의 단점을 극복하기 위해 세션 방식이 사용된다. 가장 큰 차이는 서버에 세션 DB를 두어 인증 정보를 브라우저가 아닌 서버에 둔다.
- 클라이언트가 서버에 로그인 요청
- 서버는 세션용 DB에 유저를 만들고 세션 id 값을 생성
- 세션 id는 쿠키를 통해 서버에서 클라이언트로 전달
- 클라이언트는 쿠키를 저장하고 서버에 요청을 보낼 때마다 쿠키를 통해 세션 id 전달
- 서버는 쿠키를 통해 받은 세션 id를 통해 사용자 식별
단점
- 세션 id 자체가 탈취 당하면 클라이언트 위장을 할 수가 있다.
- 서버에서 DB를 사용하므로 리소스가 많이 든다.
2-3. JWT 작동 방식
JWT 를 이용한 방식은 Token을 이용하기 때문에 DB를 사용하지 않는다는 큰 장점이 있다.
- 클라이언트가 서버에 로그인 요청
- 서버는 JWT 를 만들고 쿠키에 담아 클라이언트에 전달 (최초 로그인 시 Refresh Token도 같이 발급)
- 클라이언트는 JWT를 로컬 스토리지에 저장
- 클라이언트는 서버에 요청을 보낼 때마다 Header에 Access Token을 전달
- 서버는 클라이언트에서 보낸 토큰이 우리 서버에서 만든 것인지 확인
- 우리 서버에서 만든 토큰이라면 request에 맞는 응답을 보내준다.
- Access Token이 만료되면, 클라이언트는 Refresh Token을 보내서 새로운 Access Token을 발급받는다.
단점
- 서버가 Stateless 하기 때문에 토큰이 탈취되더라도 만료시간이 지날 때까지 유효하다. -> 이러한 단점을 극복하기 위해 Access Token의 만료시간을 짧게 설정하는 경우가 많다.
그렇다고 JWT만 사용하는 것은 아니다. 상황에 따라 쿠키, 세션, JWT를 모두 사용하기 때문에 세 가지 특징에 대해 서로 알고 있으면 좋을 것 같다.