로그인방식에 대한 고찰(session ID, Token방식)

Mincho·2023년 5월 8일
0

cs지식

목록 보기
6/10

🔴 로그인 방식에 대한 고민

  프로젝트들은 진행하면서 로그인 방식에 대한 고민을 하였다. 기본적으로 로그인을 하기 위해서는 인증(클라이언트 본인임을 검증하는 과정)과 인가(인증 작업 후 인증된 클라이언트에게 접근 권한 부여 과정)를 통해 이루어진다. 보통 로그인을 하기 위한 방식이 두 가지가 있는데 하나는 세션을 이용한 방식, 다른 하나는 토큰을 이용한 방식이다. 이 방식들을 한번 살펴보는 과정을 가져보자.



🟠 Session ID

세션아이디 로그인 방식은 사용자가 로그인할 때 서버에서 세션 ID를 생성하고 이를 쿠키를 통해 클라이언트에게 전달하는 방식이다. 이후 사용자의 요청이 들어올 때 마다 서버는 해당 세션 ID를 통해 사용자 인증을 하는 것이다. 세션은 서버 측에서 관리되며, 서버에서 세션 정보를 저장하고 필요에 따라 세션을 삭제할 수 있다.

장점

세션아이디는 서버에서만 관리되기 때문에 사용자가 직접 정보를 변경하기가 어렵다.
클라이언트 측에서 세션 정보를 직접 저장하거나 처리할 필요가 없다.
세션 만료시간과 같은 조건도 서버에서 발급할 때 처리해 줄 수 있다.
==> 결론적으로 보안성이 뛰어나다.

단점

서버에서 세션 정보를 저장하기 때문에, 서버의 메모리를 많이 사용할 수 있다.
서버의 부하가 크고, 서버와 클라이언트 간의 통신 횟수가 많아질 수 있다.

어떤 경우에 사용하는 것이 적합할까??

서버에 누가 로그인을 했는지, 특정 유저를 로그아웃 시켜버리기, 계정 공유 숫자 제한 두기 등을 시도 할 수 있다. 이런 것들이 가능한 이유는 DB에 접근하는 session id의 방식때문이다. (그 만큼 DB를 사고 유지해야한다...)



🟡 JWT

JWT방식은 사용자가 로그인할 때 서버에서 JWT(Json web Token)을 생성하고 이를 클라이언트에게 전달한다. 이 후 사용자의 요청이 들어올 때마다 클라이언트는 JWT를 서버에 전달하여 사용자 인증을 진행한다. JWT는 클라이언트 측에서 관리되는 것이다.

장점

클라이언트 측에서 JWT를 관리하게 되므로, 서버 부하가 줄어든다.
jwt를 사용하면 서버와 클라이언트 간의 통신 횟수가 줄어들 수 있다.

단점

클라이언트에서 처리해주어야 하기 때문에 jwt를 해독할 수 있는 키가 유출되기 쉬울 수 있다.
한 번 발급되면 유효기간이 지나기 전까지 계속 사용될 수 있으므로, 보안에 더 취약하다.

어떤 경우에 사용하는 것이 적합할까??

jwt방식은 db를 사거나 관리할 필요가 없다 그리고 서버가 알아야할 정보는 단지 토큰이 유효한지 아닌지를 체크하는 것 뿐이다. 그 만큼 제약이 없고 간편한 방식이다. 간단한 구성을 갖추기가 쉬운 것이다.



🟢 session ID 실사용해보기

프로젝트를 session ID를 사용하여 진행을 해보았다.

위와 같이 curb.site에 접속했을 때 로그인이 되어 있지 않은 상태이다. session ID가 쿠키에 쌓여 있지 않은 상태이다. 아직 인증을 하지 않았기 때문이다.

 그리고 로그인 요청을 하게되면 네트워크 탭을 확인하면 login요청을 했을 때 받은 응답과 쿠키 요청을 확인할 수 있다. sessionID와 csrftoken이 응답된 쿠키로 온 것을 확인할 수 있으며 이 session ID는 httpOnly
로 클라이언트에서 접근하지 못하게 보안을 잡아 놓은 것이다.

 추가로 csrf token에 대해 설명하자면 csrf는 사용자가 요청을 보낼 때, 웹사이트에서 랜덤한 값으로 생성되어 사용자의 세션에 저장되고 해당 토큰을 실제로 웹사이트에 요청하여 사용자가 보낸 요청인지 확인할 수 있다. 이렇게 하여 csrf공격(사용자 권한을 도용하여 악성 코드를 실행시키는 공격)을 방지 할 수 있다. 보통 요청 헤더에 포함하여 보내는 것이 안정적이고 권장되는 방식이다.

 또한 추가적으로 클라이언트와 서버 둘다 credentailstrue로 설정해주어야 한다. withCredentials 옵션은 다른 도메인에 요청을 보낼 때 요청에 인증 정보를 담아서 보낼 지를 결정하는 항목이다. 즉, 쿠키나 인증 헤더 정보를 포함시켜 요청하고 싶다면 클라이언트에서는 widhcredentials를 true로 설정해 주어야 한다. 또한 서버에서도 Access-Control-Allow-credentials를 true로 하여 인증에 옵션을 주어야한다.

👉 후기

프로젝트를 진행하면서 로그인 인증 처리 방식에 대한 고민을 하였고 session ID로만 실제로 처리를 해주었다. 하지만 아직 jwt token에 대한 방식은 도입해보지 못하였다. jwt에 대한 개념과 과정에 대한 공부는 하였지만 실제 도입하기 위한 정보가 부족하기도 하였고 시간도 부족했다. 시간이 된다면 jwt로그인 방식에 대해 실제로 사용해 보는 기회가 있으면 적용해보고 싶다.

👍올바른 피드백은 언제든지 환영입니다~!

참고자료

https://inpa.tistory.com/entry/AXIOS-%F0%9F%93%9A-CORS-%EC%BF%A0%ED%82%A4-%EC%A0%84%EC%86%A1withCredentials-%EC%98%B5%EC%85%98
https://hudi.blog/session-based-auth-vs-token-based-auth/

profile
사진찍는 개발자.

0개의 댓글