사용자의 세션정보를 저장해서 로그인 기능을 구현하는 방법이다.
간단히 정리해보면 다음과 같다.
유저가 로그인 했었다는 정보를 서버의 메모리에 기록해놓는다. (세션을 저장)
유저가 로그인이 필요한 페이지(Mypage 등)를 요청할 경우,
세션에서 해당 유저가 로그인했다는 정보가 발견되면 해당 페이지를 유저에게 제공한다.
좀 더 자세한 과정은 다음과 같다.
1. 유저가 로그인을 한다.
이때 유저가 제출한 아이디, 비번이 DB에 저장된 회원정보와 일치한다면,
서버는 세션스토어에 세션을 하나 만들어 저장한다.
📖 세션 : 유저가 언제 어디서 로그인 했는지 등의 정보를 담은 자료.
ex) "dev_sony 라는 사람이 20시에 서울시에서 로그인했습니다."
2. 로그인한 유저마다 유니크한 세션아이디를 발급한다.
이때 로그인한 사람이 여러명일 수 있으니, 유저마다 유니크한 세션아이디를 발급해서 서로 구분지어준다.
3. 발급한 세션아이디는 쿠키에 담아서 고객 브라우저에 전송해준다.
세션아이디는 고객과 서버 둘다 보관하기에 쿠키에 담아서 고객에게 보내준다.
📖 쿠키 : 브라우저에 마련되어있는 일종의 문자데이터 저장공간으로 이곳에 세션아이디가 기록된다.
1. 유저가 로그인을 한다.
이때 ID / PW 를 서버로 전송하면
서버는 DB에 해당 ID / PW 가 존재하면 세션아이디를 만들어준다.
그리고 세션아이디들을 담을 변수 혹은 DB 공간을 마련해 저장하는데, 이걸 세션데이터라고한다.
그후 세션아이디를 쿠키에 담고 유저의 브라우저에 쿠키를 저장한다.
2. 유저가 페이지를 요청한다.
유저가 로그인이 필요한 페이지를 요청하면 서버는 렌더링을 해주기 전
해당 유저가 로그인을 한 상태인지 확인한다.
3. 쿠키에 세션아이디가 포함되어있는지 검사한다.
유저가 페이지를 요청하면 자동으로 쿠키가 서버로 전송된다.
서버는 쿠키에 기록된 세션아이디를 서버메모리, 혹은 DB에 저장되어있던 세션아이디와 비교해서
해당 세션아이디가 존재하면 해당 유저가 로그인을 한 상태라고 판단한다.
4. 서버는 유저가 요청한 페이지를 보내준다.
이때 DB상의 정보가 필요하다면 세션데이터를 참고해서
해당 정보를 DB에서 꺼내온다.
⚡️ 다시 한번 정리해보자면 다음과 같다.
JWT 는 세션데이터를 서버에 저장하지 않은채로
페이지를 열람할 수 있는 열쇠(토큰)를 유저에게 부여하는 방식이다.
따라서 토큰은 session 방식 보다 더 많은 정보들을 담게된다.
아무튼 어떤 방식인지 자세히 알아보도록 합시다.
1. 유저가 로그인을 한다.
유저가 로그인시 제출한 ID / PW 가 DB 상에 저장되어 있다면 서버는 Token 하나를 만들어서 유저의 브라우저로 보내준다.
📖 Token : 암호화된 긴 문자열로, 유저의 로그인 유무, 아이디 등의 정보들을 넣을 수 있다.
이때 위조가 불가능하도록 특별한 서명이 추가된다.
그리고 토큰은 쿠키 또는 로컬스토리지에 저장된다.
2. 유저가 페이지를 요청한다.
유저가 로그인이 필요한 페이지를 요청하면 서버는 렌더링을 해주기 전
해당 유저의 토큰을 검사한다.
3. 서버는 토큰을 검사한다.
유저가 페이지 요청 시 함께 보낸 Token이 적법한지 검사한다.
유통기한이 지나지 않았는지, 서명이 잘 되어있는지, 블랙리스트에 등록된 토큰인지 등의 검사를 거친 후
이상이 없으면 요청한 페이지로 통과시켜준다.
💥 장점
💥 단점
유저의 로그인 유무에 대한 정보 전체를 서버는 가지고 있지 않고
유저만 가지고 있다는 점에서 보안상 좋은 방법은 아니다.
JWT 정보가 도난 될 경우 보안에 매우 취약해진다.
📖 stateful JWT : '어떤 사람이 언제 어디서 로그인했는지'룰 서버에 저장해두는 방식.
ex) refresh token
이 방법은 쉽게말하면 페이스북, 구글 로그인입니다.
고객의 페이스북, 구글 계정정보를 불러와서 그걸 가지고 가입을 승인시켜주는 방법입니다.
💥 장점
💥 단점