ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 96일차] 나만의 무기 4일차 (쿠키, 세션 인증 구현)
    기타/SW 사관학교 정글 2021. 11. 7. 03:18

    오늘은 로그인/로그아웃 그리고 회원가입 구현을 위한 기초학습인 쿠기, 세션 인증을 nodejs로 구현하는 과정을 학습했다.

    파이썬 플라스크를 이용하여 로그인 기능은 만들어봤지만 nodejs에서는 어떠한 모듈을 이용하여 하는지를 알아볼 필요성이 있어서 생활코딩의 강의를 참고하여 학습을 진행했다.

     

     

     

    먼저, 쿠키 인증단계에서는 cookie라는 모듈을 사용했다.

    쿠키는 사용자 개인화 서비스 위해 사용되기도 하고 지금은 보안 상 세션이나 jwt를 사용하지만 인증을 위해 사용되었다.

    쿠키의 방식은 클라이언트가 어떠한 요청을 보내면 서버가 이후에 요청 때는 '이러한 정보를 담고 있는 쿠키를 보내면 사용자의 정보를 알고 누구인지 알 수 있을 것같아요.'하는 것을 쿠키로 만들어 응답과 함께 보낸다.

    쿠키를 받은 클라이언트는 추후에 요청을 보낼 때 body에 쿠키헤더를 사용하여 쿠키를 보내면 서버는 클라이언트가 누구인지 알 수 있는 정보를 얻을 수 있다.

     

    이러한 쿠키는 session 쿠키와 permanent 쿠키가 있다.

    session 쿠키는 세션이 이루어지고 있는 동안, 브라우저 측면에서 말하면 창이 닫히기 전까지 유지될 수 있다.

    물론 expires나 Max-age가 설정되어있으면 해당 유효기간이 지난 쿠키는 무효해진다.

    permanent 쿠키는 서버가 '이 쿠키는 영원히 쓸 수 있어요'라는 설정값을 주어 보내면 클라이언트는 영구적인 쿠키를 사용할 수 있다.

     

    이외에도 쿠키에는 다양한 옵션을 줄 수 있다.

    첫 번째로 Sercure 옵션을 주어 프로토콜이 HTTP인 클라이언트는 해당 쿠키를 받지 못하게 해주고 HTTPS 프로토콜을 사용한 클라이언트만 받게 해준다.

    두 번째로 HTTPOnly옵션을 줄 수 있는데 HTTPOnly가 달린 쿠키는 클라이언트가 JS언어를 사용하여 쿠키를 읽었을 때 보이지 않고 오직 HTTP로 받았을 경우만 쿠키를 볼 수 있다.

    세 번째로 path와 domain이다.

    path옵션을 주면 해당 path를 포함한 요청에게만 응답으로 쿠키를 보내게 해준다.

    domain은 코드를 보면서 정리를 해야 이해가 될 것 같다.

    Domain=Domain; Domain=ratel.org

    위와 같이 domain 옵션을 줄 수 있는데 ratel.org에 어떠한 서브도메인이 붙어도 해당 쿠키를 얻을 수 있다는 것이다.

     

     

     

     

    다음으로 세션 인증을 공부했다.

    앞에서 말한 쿠키는 너무 law하기 때문에 공격자가 가로채어 보안 상의 문제를 일으킬 수도 있고 자신이 얻은 쿠키를 조작하여 공격할 수 있는 여지가 너무 충분하다.

    그래서 다음으로 나온 것이 세션이다.

    세션의 방식은 처음 인증을 하는 클라이언트에게 서버는 응답과 함께 세션ID를 준다.

    이 세션ID는 암호화된 값으로 해독한다고해서 사용자에 대한 정보가 나오는 것은 아니다.

    그러면 사용자에 대한 정보는 어디에 있을까?

    사용자의 정보는 서버가 파일로 가지고 있다.

    이렇게 되면 클라이언트가 추후에 세션ID를 보내면 해당 세션ID를 서버가 보고 ID에 해당하는 파일을 읽어 사용자의 정보를 알 수 있는 구조이다.

    즉, 쿠키는 사용자에 대한 정보를 클라이언트가 가지고 있었지만 세션은 오직 식별자 역할을 하는 세션ID만 클라이언트가 가지고 있는 것이다.

     

    세션도 쿠키처럼 module이 주어지고 module의 이름은 express-session이다.

    간단하게 클라이언트에게 세션ID를 보내고 접속횟수를 확인하는 것을 구현해보고 세션 정보가 file store에 저장되도록 하는 것도 구현해봤다.

    이렇게 세션의 흐름을 파악한 후에 세션을 이용하여 로그인/로그아웃 기능을 구현해봤다.

     

     

    오늘 공부한 것과 어제 공부한 mysql을 연결해서 생각해보면 나만의 무기에서 사용할 수 있는 로그인/로그아웃기능을 완성할 수 있을 것같다.

    댓글

Designed by Tistory.