인증을 하는 방법, 세션과 토큰?

Hyunta·2022년 5월 26일
0

학습동기

프론트와 협업을 하는데 첫번째 미션이 사용자가 로그인을 할 수 있도록 구현하는 것이다. JWT라는 말을 처음 들어보고 auth 학습 테스트를 진행하는데 어떻게 인증을 하는지 모르겠고 막연해서 공부를 해봤다. 인증에 대해서 모호하게 알고 있었기 때문에 세션,쿠키,토큰에 관한 용어에 대해서 정리하고 김영한님 강의 중 MVC 2편에서 인증과 관련된 부분을 듣고 최대한 정리해보려고 한다.

문제 상황

인터넷 쇼핑을 하던 중 30분마다 자동으로 로그아웃이 되서 주기적으로 로그인을 해야한다고 생각해보자. 너무 화나지 않는가? 한 번 로그인하면 내가 사용을 종료할 때 까지 혹은 내가 로그아웃을 할 때 까지 로그인 상태를 유지하는 것을 원할 것이다. 동시에 보안도 유지하면서. HTTP는 stateless 라는 특성 때문에 각 통신의 상태를 저장하지 않는다. 이를 해결하기 위해서 세션과 토큰이라는 개념이 생겼다.

쿠키

로그인 상태를 유지하기 위한 핵심 메커니즘은 쿠키다. 처음 로그인을 하면 서버가 클라이언트에게 쿠키를 보내준다.

Cookie : USER_ID=arthur123 & USER_PW=qwer

클라이언트가 이 문자열을 수신한 뒤에, 이후 요청에서 쿠키를 항상 응답한다. 이는 보안에서 매우 취약하다. 클라이언트가 직접 쿠키를 수정할 수 있고, 해킹을 시도할 수도 있다. 따라서 쿠키에 민감한 정보는 담지 않는 것이 바람직하다. 회원의 비밀번호는 민감한 정보라서 쿠키에 담아두면 안된다. 이러한 문제를 해결하는 방법으로 세션과 토큰이 있다.

세션


전반적인 흐름은 위 그림과 같다. 로그인을 하면 Server에서 개인 정보가 담긴 쿠키를 응답해주는 것이 아니라, 세션 아이디를 반환해준다. 추후에 클라이언트가 요청할 때 쿠키에 있는 세션아이디를 통해서 조회를 하고 세션에 값이 있을 경우 성공을, 없을 경우 실패를 반환해준다.

Cookie : JSESSIONID = FCE2F60D842D6CAB6EFA02621082EB67

토큰

토큰도 흐름은 세션과 마찬가지다. 하지만 차이점은 서버내에서 토큰과 관련된 정보는 Secret Key를 제외하고는 없다. 처음 로그인을 하면 키를 이용해서 암호화를 한 다음 반환해준다. 이후 클라이언트는 해당 토큰을 요청할 때마다 쿠키로 보내주고 키를 이용해 복호화 해서 서버는 정보를 확인할 수 있다. 세션과는 다르게 이 방법은 서버에서 다른 Redis나 다른 DB를 사용할 필요 없이 세션 데이터를 저장할 수 있다. 모든 정보는 JWT에 있어서 인프라가 가벼워질 수 있다.

Reference

https://yceffort.kr/2021/05/drawback-of-jwt

profile
세상을 아름답게!

0개의 댓글