[ETC] 로그인에 관하여 - 1

Noah Ko·2022년 8월 7일
0
post-thumbnail

이 질문은 사실 잘못된 질문인데, 아마 Cookie가 어떻게 작동하는지 잘 알지 못해서 생기는 질문일 것이다.

- Cookie는 어떻게 작동하는가? : 정보를 담아서 나중에 같이 제출

쿠키를 이용해서 서버는 사용자에 관한 것을 기억하기 위해 사용자의 브라우저에 사용자와 관련된 데이터를 넣을 수 있다.

사이트에 방문하게 되면, 브라우저는 서버에 요청을 보내게 된다. 응답에는 모든 데이터와 사용자가 찾던 페이지 정보가 들어있는데, 그와 함께 브라우저에 저장하고자 하는 쿠키가 함께 담겨있다.

그래서 쿠키가 저장된 후 같은 웹사이트를 다시 방문하게 되면 브라우저가 이번에는 쿠키와 함께 서버에 요청을 보낸다.
(쿠키는 도메인에 따라 제한됨. 같은 도메인에 한해서만 쿠키를 주고 받을 수 있음, 서버에서 정한 유효기간 있음.)

쿠키는 인증뿐만 아니라, 여러가지 정보를 저장할수도 있다. 예를 들어 페이지를 볼 때, 언어를 영어로 설정했다면 쿠키에 해당 페이지의 언어는 영어로 저장 되었을 것이고, 다음에 사이트를 재방문하게 되면 저장했던 쿠키를 받아 서버는 영어 페이지를 보여줄 것이다.

이러한 방식으로 Cookie가 작동하게 되는 것이다.

사실 Cookie는 전달책에 불가하다.

2. Session vs Token

Session과 Token이 왜 필요한지 이해하려면 Http 프로토콜이 Stateless임을 알고 있어야 한다.

- Stateless라는게 뭐야? : 흔적을 남기지 않는 요청. 말하자면 익명의 요청.

Stateless는 서버로의 요청이 각각 독립적임을 의미한다. 이전 요청의 흔적이 남지 않아 매번 새로운 요청이 되는 것이다.
그렇기 때문에 요청이 끝나게 되면 서버는 요청을 했던 사람이 누군지 잊어버리게 되고 요청을 할때마다 내가 누구인지 알려야 한다.

- Session : 매번 요청할때 마다 내가 누구인지 알려주는 방법 -1

Session은 Server가 있고 Session DB가 있다. 사용자가 ID와 PW로 로그인을 하게 되면, 해당 ID와 PW는 Server로 가게 되고, 이게 맞다면 Server는 Session DB에 사용자의 이름으로 저장소를 만든 후에 그곳에 저장할 것이고 그렇게 저장한 Session DB의 저장소는 고유 ID가 생기게 된다.

그 ID는 쿠키에 담겨저서 Server에서 Browser로 돌아오게 되고 브라우저에 저장된다.그후 사용자가 같은 웹사이트의 다른 페이지로 가게 되면, 브라우저는 세션 ID를 가지고 있는 쿠키를 다시 서버에게 보낸다.(쿠키는 자동으로 보내진다.)

서버는 세션 ID와 함께오는 쿠키를 확인하고는 이를 그 안에 세션 ID를 가지고 세션 DB를 확인할 것이고, 그제서야 사용자가 누구인지 알게 되는 것이다.

참고로 웹에서는 세션과 쿠키를 사용할 수 있지만, 앱에서는 쿠키를 사용할수 없기 때문에 Token을 사용한다.

Token은 암호화된 문자열인데 앱에서는 서버에서 Token을 보내게 된다.

중요한 점은 사용자의 정보는 모두 DB에 들어있다는 점이다. 사용자가 가지고 있는 건 정보가 저장된 고유의 세션 DB ID만 있을 뿐이다.

그렇기 때문에, Session은 로그인을 할 때마다 매번 DB를 체크해야 하고 이는 유저가 늘어나면 그와 함께 DB 리소스도 더 필요하게 된다.

- JWT : 매번 요청할때 마다 내가 누구인지 알려주는 방법 -2

유저가 늘어남에 따라 DB 리소스가 늘어나게 되자 이를 막기 위해 등장한 방법이 JWT 인증 방식이 등장하게 된다.

JWT는 이름에서도 알수 있듯이 Token 방식인데, 이렇게 하게되면 세션 DB도 필요 없게되고 그렇기 때문에 유저 인증에 많은 일을 하지 않게 된다.

즉, 로그인을 하게 되면 서버는 Session DB를 생성하지 않고 사용자의 ID를 가지고 새로운 문자열을 만들어내는 알고리즘을 통해 Token을 생성해 내고, 그 Token을 사용자에게 전달해 준다.

그 후 사용자가 해당 사이트에 들어와 로그인 하게 되면, 서버는 DB를 거치지 않고 그 토큰이 유효한지만 검증하면 되는 것이다.

- Session vs JWT

  • Session : 모든 정보가 DB에 담겨져 있기 때문에, 원하는 않는 사용자를 제거할 수도 있고 사용자의 수를 제한 할 수도 있다. 하지만 이 모든것은 DB가 있다는 전제하에 가능한 일이며, 사용자가 늘어나면 그 맞는 DB 리소스가 필요하게 된다.

  • JWT : 서버가 로그인 된 사용자의 정보를 Token을 바꾸어 전달해 주게되고, 요청시 토큰의 유효성만 검사하면 되기 때문에 많은 부분에서 효율적이라고 할 수 있다. 하지만 DB가 없고 사용자를 추적할 수 없기 때문에 Session처럼 원하지 않는 사용자를 제거하는 기능은 가질 수 없다.

Cookie는 공간제약이 있지만 JWT는 공간제약이 없음. 문자열이 계속 길어져도 됨.

3. 결론

Session은 DB에 사용자의 정보가 저장되어있고 그 ID를 주고 받는 형식, 그 ID를 담는게 쿠키
JWT는 토큰인데 유효성을 확인하여 사용자를 확인한다. 이 토큰을 담는게 쿠키

profile
아코 자네 개발이 하고 싶나

0개의 댓글