프론트엔드 로그인 개념
종강 한지 벌써 2주가 넘어가는 시점에 팀원을 꾸려서 사이드 프로젝트를 진행하게 되었다. 해당 프로젝트에서는 로그인 기능을 구현해야했다. 전에 하던 스터디에서 로그인 기능을 구현해보면서 개념을 살펴본 적이 있는데 리마인드를 해볼겸 포스팅을 하고자 한다.
로그인 방식
로그인 방식에는 크게 3가지가 있다.
- id와 pw를 요청 헤더에 넣는 방식
- 세션 id를 이용하는 방식
- JWT 토큰을 이용하는 방식
id와 pw를 요청 헤더에 넣는 방식
가장 단순한 방식으로 HTTP 메세지에 사용자의 계정정보를 넣어 서버에게 보내는 메커니즘이다. 매 요청이 들어올때마다 서버는 DB를 조회하여 들어온 계정정보를 비교한다. 이 방식은 다른 처리를 필요로 하지 않기에 쉽고 빠르지만 보안에 매우 취약하다는 단점을 가지고 있다. 그 이유로는 비암호화된 HTTP 요청을 가로채기만 한다면 계정정보를 손쉽게 알아낼 수 있기 때문이다.
세션 id를 이용하는 방식
1. 유저는 암호화된 방식으로 로그인을 한번 하면 서버에서 고유한 세션을 만들어 저장소에 저장한다.
2. 서버는 만든 세션을 열 수 있는 고유한 key인 세션 ID를 사용자에게 발행한다.
3. 클라이언트는 받은 세션 ID를 쿠키에 저장하고, 요청 할 때마다 쿠키를 전달한다.
4. 서버는 쿠키가 유효한지 검증 후 그에 맞는 유저 정보를 얻어 데이터를 반환한다.
JWT 를 이용하는 방식
1. 유저가 로그인을 하게 되면 서버에서 인증 정보를 암호화된 데이터 패키지(JWT)안에 담아 클라이언트에 보내준다.
2. 받은 accessToken와 refreshToken은 이후 유저 인증에 사용되므로 클라이언트에 저장한다.
3. accessToken을 게스트가 아닌 유저에게만 보여줄 수 있는 정보에 접근 할 때 서버에 보낸다.
4. 서버는 그 토큰이 유효한지 검증 후 그에 맞는 유저 정보를 얻어 데이터를 반환한다.
accessToken과 refreshToken
실질적인 인증에는 의미없는 문자열인 accessToken만을 이용한다. 그러나 accessToken에는 문제점이 존재한다. 바로 '보안'이다. 서버는 한번 발급한 토큰에 대해서 제어권을 가지고 있지 않기 때문에 만약 accessToken이 탈취된다면 사용자는 계정의 제어권을 내어줄 수 밖에 없다. 이러한 문제점 때문에 refreshToken이 생기게 되었다.
refreshToken은 accessToken의 유효기간을 짧게 하고, 자주 재발급 하도록 만들어 보안을 강화시키면서도 사용자에게 잦은 로그아웃 경험을 주지 않도록 하는 역할을 한다.