세션 기반 인증?
세션이 뭔지부터 알아보자
🔖세션이란 서버가 저장하는 사이트 방문자들에 대한 기록
- 기록엔 id, ip주소, 마지막 방문은 언제인지, 어떤 브라우저를 사용했는지 등의 정보가 담김
< 세션 기반 인증 >
세션 기반 인증이란 세션을 활용하여 서버에서 세션 정보 기록 후 식별 id를 Set-Cookie로 클라이언트에 응답한다.
클라이언트가 서버에 요청 시 서버에서 응답한 쿠키를 자동으로 포함하며 서버가 클라이언트의 쿠키에 담긴 세션 id만 확인하여 방문자를 파악한다.
유저가 로그인하게 되면 서버에서 세션에 유저 id를 저장 후 이를 기반으로 서버가 요청을 보낸 유저를 특정한다.
세션은 일정한 기간이 지나거나 클라이언트에서 로그아웃 요청을 보낼 경우, 해당 세션이나 로그인 유저를 만료 처리한다.
토큰 기반 인증
인증 토큰
토큰 기반 인증이란 인증 토큰을 사용하며, 인증 토큰이란 유저에 대한 정보를 암호화한 문자열을 지칭
특정 콘텐츠에 접근할 수 있게 해주기 때문에 Access token이라고도 칭하며, 최근의 토큰 형식은 JWT(JSON Web Token)형식을 가장 많이 사용
< 토큰 기반 인증 >
- 토큰 기반 인증은 세션 기반 인증과 달리 유저의 로그인 상태를 저장하고 요청이 올 때마다 저장 및 확인하지 않고도 토큰 자체를 해석하여 요청을 보낸 유저의 식별이 가능하다.
< 토큰 식별 흐름 >
유저가 이메일 비밀번호를 입력해 로그인 요청을 하면 서버가 유효한지 확인한다.
서버는 유저를 식별할 수 있는 id, 만료일 등의 내용을 담은 토큰을 만들어 클라이언트에게 응답한다.
응답으로 인증 토큰을 응답의 바디로 넘기기도 하고, Set-Cookie를 하기도 합니다. 이 토큰은 담고싶은 정보와 서버에서만 알고 있는 비밀키를 활용해 만들어진 사용자가 식별할 수 없는 문자열이다.
클라이언트는 응답으로 받은 토큰을 서버에 요청할 때 Authorization 헤더에 담아 전송한다.
서버는 클라이언트의 토큰을 비밀키를 사용해 다시 해석하고 유효성 검증 및 유저를 특정한다. 인증 토큰을 사용하면 문자열 토큰을 갖고 있기만 하고 만료시간이 지나지 않았으면 항상 로그인 상태를 유지할 수 있습니다.
로그아웃을 하고 싶으면 클라이언트에서 직접 저장한 토큰을 삭제한다.
비교
✨효율성
세션 기반 인증을 사용하면 서버는 항상 로그인 세션 정보를 저장하며, 매 리퀘스트의 유저가 누구인지를 정보와 비교해야 한다.
이를 위해 용량과 시간을 소비하며 로그인한 유저가 엄청 많거나 특정 시간에 몰리게 되면 서버의 리퀘스트 처리 속도가 감소할 수도 있다.
반면에 토큰 기반 인증은 어딘가 저장한 데이터와 비교하는 게 아니라 토큰 자체 내용을 해석하기만 하면 되기 때문에 더 효율적으로 작동할 수 있다.
✨유연성
토큰 기반 인증은 세션 기반 인증보다 조금 더 유연하게 사용 가능하며 토큰을 발행하는 방법이 똑같고, 시크릿 키만 있으면, 발행한 곳과 확인하는 곳이 달라도 무방하다.
여러 서비스가 같은 방식 및 시크릿 키를 사용하여 토큰을 발행한다면 공유하는 사이트들은 모두 이를 해석해 유저를 파악할 수 있다. 따라서 유연하게 다양한 서비스를 하나의 계정으로 사용 가능해진다.
RESTFUL API
세션 정보와 같이 서버가 "상태" 정보를, 예를 들어 유저가 로그인을 했는지 안 했는지 저장하고 있을 때, stateful 하다고 표현한다.
하지만 REST에 부합하기 위해서는 서버가 상태 정보를 저장하지 않는, stateless 한 특성이 있어야 하며, 이는 곧 서버는 클라이언트에서 보내는 정보만으로 충분히 상태를 파악할 수 있어야 한다는 것을 의미한다.
따라서 RESTFUL한 API 서버를 만들고 있다면 세션 기반 인증보다 토큰 기반 인증이 더 낫다.
✨무효화
세션 기반 인증의 장점 중 하나는 바로 서버에서 세션 데이터를 따로 관리하기 때문에 특정 세션을 손쉽게 무효화할 수 있다는 것이다.
따라서 문제 발생 시에 세션을 관리하는 테이블에 가서 상태를 만료로 바꾸거나 만료일을 지금으로 해버리면 되겟지만, 토큰 기반 인증을 사용하면 따로 서버가 상태 정보를 저장하지 않기 때문에 특정 토큰을 무효화하는 게 더 복잡해진다.
이중 비밀번호나, OTP같이 이를 방지하기 위한 방법들이 있지만, 세션 기반 인증을 사용하면 한 가지 안전장치를 더 쉽게 사용할 수 있습니다.
'Front-End Study > 코드잇 위클리 페이퍼' 카테고리의 다른 글
리액트 쿼리? 리액트가 이름 막 갖다 쓴다고 뭐라 안하나.. (2) | 2024.07.19 |
---|---|
[삐릭!] 검색 엔진 로봇과 친구하기 (2) | 2024.06.04 |
CORS 에러?? 그게 뭔데. (1) | 2024.06.04 |
Next.js : 리액트 말고 나 써라. (0) | 2024.05.31 |
타입스크립트.. 누구냐 너 (0) | 2024.05.24 |