[TIL] 2020/10/30

yongkini ·2020년 10월 30일
0

Today I Learned

목록 보기
68/172

Today, I Learned


  • 여전히 쿠키, 세션, 토큰 헷갈리는 중.. 그래도 헬프 데스크에 좋은 글이 있어서 참고하자(혹시 지워질 수 있으니 복붙) **레퍼런스 : (주)코드스테이츠 깃헙 페이지 헬프 데스크 댓글
    정확히 짚어주신 대로, http에서 통신은 매번 독립적으로 이루어지며, 개별 통신에 대한 별다른 정보를 저장하여 기억해 두지 않습니다(stateless). 
    때문에 같은 사용자가 요청을 여러 번 하더라도 해당 사용자에 대한 정보(이전에도 방문한 적이 있는지, 로그인을 했는지 등등..)를 알 길이 없죠. 
    하지만 쿠키와 세션을 활용하면 여러 번의 통신에 걸쳐, 어떤 사용자에 대한 상태를 파악할 수 있습니다.
    

    세션에 대해 이해하려면 쿠키에 대한 개념부터 간략하게 짚고 넘어가면 좋을 것 같습니다. 쿠키는 일종의 서버와 클라이언트가 대화하기 위한 수단입니다.
    요청 헤더의 set-cookie 속성에 정보를 담을 수 있어요.(express에서 쿠키 활용은 res.cookie, req.cookie, cookie-parser 모듈에 대해 찾아 보시면 쉽게 이해하실 수 있을 겁니다.)
    말씀해주신 대로 쿠키에 담기는 어떤 데이터는 브라우저에서 관리를 하고요.
    반면 세션은 서버와 클라이언트가 연결되어 있는 상태입니다.
    세션 활성화가 시작되면, 다시 말해 어떤 클라이언트가 서버와 통신을 시작하면 서버는 해당 클라이언트에 대해 유일한 아이디(세션 id)를 부여하고, 세션 스토리지에 세션에 대한 정보를 저장해 둡니다.
    클라이언트는 이 세션 id를 쿠키를 통해 기억하고요. 이후 클라이언트는 어떤 요청을 보낼 때마다 헤더의 cookie에 세션 id를 담아 전송합니다.
    서버는 클라이언트가 보낸 요청의 쿠키에 담긴 세션 id와, 세션 스토리지에 저장된 세션 id를 대조하여 인증 상태를 판단합니다.
    (여기서 다시 한 번 강조하고 싶은 부분이 있는데요, 세션과 쿠키는 완전히 분리된 개념이 아닙니다! 세션 또한 쿠키를 기반으로 합니다.)

    각 클라이언트마다 유니크한 세션 객체가 주어지고, 이 세션 객체에 어떤 데이터를 담아 관리할 수도 있습니다.
    하지만 이 세션 객체와 데이터는 서버에 존재합니다. 클라이언트가 보내는 쿠키에 담겨 있는 것은 세션 id 뿐이고요.
    (세션id가 열쇠라면, 세션 객체는 자물쇠로 잠긴 상자라고 생각할 수도 있을 것 같아요.)
    반면 세션을 사용하지 않고 오직 쿠키만으로 어떤 데이터를 주고 받는다면, 클라이언트는 이미 모든 데이터를 다 알고 있겠죠?

    결국 쿠키 / 세션은 사용자의 정보를 저장하기 위해서 필요한 것들인가요?

    쿠키와 세션은 결국 요청을 보내는 측(사용자)에 대한 정보에 따라, 1) 적합한 사용자 경험을 제공하고(e.g. '7일간 다시 보지 않기', 인증 상태 유지 등)
    2) 보안을 유지(e.g. 인증 상태 관리)하기 위해 사용된다고 이해할 수 있을 것 같습니다. 위에서 말씀해 주신 대로, 원래 stateless한 http 통신으로는 정보를 기억할 수 없으니 쿠키와 세션이 사용되는 것이고요.

    토큰은 인증을 위해 사용되는 암호화된 문자열 입니다.
    사용자가 인증에 성공하면, 서버는 토큰을 생성해서 클라이언트로 보냅니다.
    토큰 또한 세션과 마찬가지로 사용자가 보내는 요청에 포함이 되고요.
    서버는 토큰이 유효한지 확인만 합니다. 세션 인증에서 서버가 세션 id를 저장하고, 클라이언트가 쿠키에 실어 보낸 세션 id를 세션 스토리지에 저장된 것과 대조하는 과정이 없지요.
    그래서 http 통신의 stateless한 성격과 더 적합한 인증 방식입니다. 서버 운영의 효율 측면으로도 더 좋고요.

    세션과 토큰에 대한 개념을 이해하는 데 도움이 되는 레퍼런스 자료가 있을까요?

    토큰과 세션 인증에 대한 비교 글입니다.
    https://dev.to/vasilevskialeks/token-vs-session-authentication-56ed
    쿠키-세션에 대해, 재미있는 비유를 통해 설명한 영상입니다.
    https://www.youtube.com/watch?v=OpoVuwxGRDI

  • 개인적으로 이해가 잘되도록 설명해주었던 블로그
  • 디폴트로 생성되는 connect.sid는 req.sessionID 그리고 req.session.id와 같은 값이다. 굳이 이걸 다르게 쓸 수 도 있지만, 디폴트로 제공해준다는 점 기억하기.
  • 쿠키는 클라이언트 쪽에서 저장하기에 위험하다. 그렇다면, 세션은 안전한가?(안전한 근거 찾기). 또한, 세션에 있는 쿠키의 용도는 무엇인가?. 그리고, 세션은 서버에서 범용으로 쓰는 것인지, 즉, 세션에 현재 로그인한 유저들의 정보를 담는다면, 범용적으로 유저들을 인증할 때 쓸 수 있는 것인지 공부해보기. 마지막으로, 세션에서 인증을 하고, 디비에서 자료를 찾아서 보내주는 흐름을 다시 공부해보고, 토큰 방식과 세션 방식이 어떻게 다른지 제대로 이해하기.
  • restful api? : 어떤 플랫폼(윈도우, 맥 등), 어떤 프로그래밍 언어로 만들어도 범용적으로 잘 작동하는 api를 말한다.(참고 사이트)

Planning to Study


  • DB, Authentication & Authorization 부분 복습 및 블로깅
  • Toy 30번까지 풀기
  • shortly express 복습하면서 총복습(react, redux 구조 파악하면서 공부/ DB 및 ORM 복습 / 인증 부분 복습 )MVC 패턴을 훑으면서 쭈욱 복습하자
profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글