본문 바로가기

개발일지/TIL

[230701] 쿠키, 세션, JWT ?

인증 & 인가

❓인증은 무엇인가요?
💬 사용자의 신원을 확인하는 과정으로 "너 여기 들어올 수 있는 사람이야?"라고 물어보는 거와 같다. 
❓인가는 무엇인가?
💬 인증된 사용자에 대한 접근 권한을 결정하는 과정으로 "너 이거 사용할 수 있는 사람이야?"라고 물어보는 거와 같다.

쿠키 & 세션

❓쿠키가 나온 이유는 무엇인가?
💬 클라이언트와 서버가 연결이 계속되어 있는 경우 자원의 소비가 너무 많다. 특히 서버 쪽에 부하가 많이 걸린다. 그래서 클라이언트와 서버는 비연결 방식을 사용한다. 비연결 방식을 사용하면 클라이언트와 서버가 서로의 상태를 알지 못하게 되는데, 이를 보완하고자 필요한 정보를 저장을 해뒀다고 주고받는 쿠키를 사용하는 것 같다.  
❓쿠키는 무엇인가? 
💬 쿠키는 클라이언트에 통신간에 필요한 정보를 저장해 놓을 수 있는 저장소이다. 쿠키의 최대 4KB까지 저장할 수 있으며, 서버에 요청을 할 때마다 헤더에 담겨 전송이 된다. 그리고 클라이언트 쪽에 저장이 되다 보니 누구에게나 쉽게 노출이 되어 보안이 약하다.
❓세션이 나온 이유가 무엇인가?
💬 쿠키와 나온 이유가 똑같은 것 같다. 클라이언트와 서버가 비연결 방식을 사용하기 때문에, 클라이언트의 요청에 따라 서버에서 필요한 사용자 정보를 저장해 뒀다가 활용하기 위해 세션을 사용하는 것 같다. 
❓세션은 무엇인가?
💬 서버는 서버에 통신간에 필요한 정보를 저장해 놓을 수 있는 저장소이다. 세션은 최대 128MB까지 저장할 수 있으며, 클라이언트가 서버에 요청을 하면 필요한 정보를 꺼내 사용할 수 있다. 그리고 쿠키와 비교했을 때 정보가 서버에 저장이 되기 때문에 상대적으로 보안이 강하다.

JWT

❓JWT가 나온 이유가 무엇인가?
💬 가장 핵심은 Stateless라는 것이다. 그동안 Stateful로 세션을 통해 State를 서버 쪽에서 가지고 있었다. 그러다 보니 사용하던 서버가 죽어버린다면 다른 서버를 사용해야 하는데 이때 필요한 State가 소실할 우려가 있다. 이를 방지하고자 데이터베이스에 저장을 한다고 하면 State를 위해 자원을 많이 사용해야 하는 문제가 발생할 수 있었다. 이런 것들 보완해 보고자 Stateless가 나온 것이 아닌가 싶다. 꼭 JWT가 아니어도 Statless 방식이 가능하면 다른 것을 사용해도 무방하다.
❓State란?
💬 내 방식으로 풀자면, 요청이 들어왔을 때 응답을 다르게 해 줄 수 있는 내부에서 가지고 있는 데이터라고 표현할 수 있을 것이다.
❓JWT란?
💬 JOSN 개체로 된 정보를 안정하게 전송하기 위해 암호화를 해서 사용하는 토큰이다. 헤더, 페이로드, 서명으로 이루어져 있다. 
❓JWT 사용 흐름?
💬 사용자가 로그인을 하면 JWT를 하나 발급을 하며, 그 이후부터는 JWT가 만료되기 전까지 JWT를 통해 인가를 한다. 인가는 서버에 들어온 JWT의 헤더. 페이로드, 서버에 있는 시크릿 키를 조합해서 알고리즘을 통해 변환한다. 변환 값이 보낸 JWT의 서명 부분과 일치하는지 확인을 한다.

생각

어떤 용어를 내가 이해할 수 있는, 내가 다른 사람에게 전달할 수 있는 말로 풀어내는 것은 쉽지 않은 것 같다. 최대한 바꿔보았는데도 다시 읽어보면 뭔 말인지 싶다. 이번 JWT에 대해서 다루면서 많이 느낀 것 같다. 경험치를 쌓아가며, 이러한 것들을 더 쉽게 풀어낼 수 있는 개발자가 되고 싶다.