개요
진행 중인 프로젝트에서 사용자 로그인 과정 중 사용자 인증 방식으로 어떤 방법이 있는지, 각각의 인증 방법의 장단점은 무엇인지에 대해 알아보고, 프로젝트에는 어떤 걸 적용하는 게 좋을지에 대해 얘기해 보겠습니다.
인증이란?
인증 방식을 설명하기에 앞서 간단하게 인증이란 무엇인지에 대해 설명하겠습니다.
인증은 프로젝트를 예로 들어 굿즈 포유 시스템이 제공하는 서비스에 접근하기 위해 사용자의 정보를 확인하는 과정입니다.
세션 인증 방식
세션 기반의 인증 방식은 오랫동안 웹 애플리케이션의 기본 인증 방식이었습니다. 세션 인증 방식을 사용하고, 세션을 데이터베이스에 저장하는 방식을 사용하면 사용자가 로그인을 요청하면 사용자의 로그인 세션이 서버에 의해 생성됩니다. 그리고 이 로그인 세션 정보가 데이터베이스에 저장됩니다.
세션 인증 과정에 대해 그림과 함께 좀 더 자세히 알아보도록 하겠습니다.
- 사용자가 로그인 요청을 서버로 보냅니다.
- 서버는 로그인 요청을 인증하고 세션 정보를 데이터베이스로 전송해 저장합니다.
- 서버는 사용자에게 세션 ID를 포함하는 쿠키를 포함해서 사용자에게 응답을 보냅니다.
- 사용자는 새로운 요청을 전송할 시, 쿠키를 포함한 새로운 요청을 서버로 전송합니다.
- 서버는 데이터베이스에서 사용자가 요청을 전송할 때 보낸 쿠키에 포함되어 있는 세션 ID를 확인합니다.
- 서버는 데이터베이스에 사용자의 세션 정보가 있음을 확인하고, 사용자가 요청한 페이지를 사용자에게 보냅니다.
세션 방식의 장/단점
세션은 위 그림에서도 알 수 있듯이 서버에 저장되므로 서버 관리자는 해당 세션의 권한을 가집니다. 예를 들어, 보안 팀은 사용자의 계정이 손상된 것으로 의심되는 경우 세션 ID를 즉시 비활성화하여 사용자가 즉시 로그아웃되도록 할 수 있습니다.
하지만 이런 세션 방식은 서버에 저장되므로 서버에서 사용자가 보낸 세션 ID를 검색해야 합니다. 이로 인해 사용자의 세션이라는 상태가 생기기 때문에, 추후 서버를 수평 확장할 때 Scalability 문제가 발생할 수도 있습니다.
또한 세션 ID를 전송할 때, 쿠키를 사용하는데 이 쿠키는 사이트 간 위조 공격에 노출될 수도 있습니다.
토큰 기반 인증 방식
토큰은 변경할 수 없는 권한 부여 파일입니다. 서버에서 Secrect Key를 사용하여, 토큰을 생성하고 이렇게 생성된 토큰을 사용자가 로컬 저장소에 저장합니다. 세션 방식에서의 Cookie와 마찬가지로 사용자는 새로운 요청 때마다. 이 토큰을 서버로 전송하여 서버가 해당 토큰의 시그니처를 확인하고 요청을 인가합니다.
- 사용자가 로그인 요청을 서버로 보냅니다.
- 서버는 로그인 요청을 승인하고 사용자에게 토큰을 전송합니다.
- 사용자가 서버가 보내준 토큰을 사용해 새로운 요청을 서버로 보냅니다.
- 서버는 사용자가 보낸 토큰이 유효한지 여부를 확인하고, 토큰이 유효한 경우 요청된 페이지를 사용자한테 보냅니다.
참고로 해당 토큰은 인증 파일(authentication files)이 아니라 인가 파일(authorization files)입니다.
그렇기 때문에 토큰을 수신하는 동안 서버는 사용자가 누구인지 검색(인증) 하지 않고, 토큰의 유효성에 따라 사용자의 요청을 승인합니다(인가).
토큰 기반 인증 방식의 장/단점
토큰은 사용자가 자격 증명을 전송해야 하는 횟수를 줄이려는 경우 유용합니다(인가 상황). server-to-server로 연결된 경우, credential을 사용하는 것이 어려워지기 때문에 토큰은 이런 문제를 해결해 줍니다. 토큰을 사용하는 서버는 사용자의 요청을 승인하기 위해 세션 세부정보를 지속적으로 검토할 필요가 없기 때문에 서버의 성능을 향상할 수 있습니다.
단, 인증 세부 정보는 클라이언트에 저장되므로 서버는 세션 기반 인증 방식처럼 특정한 보안 작업을 수행할 수 없습니다. 또 앞서 설명한 내용처럼 서버는 사용자를 인증하지 않았기 때문에, 사용자에게 해당 토큰을 링크하는 것이 더 어려울 수도 있습니다. 또한 악의를 가진 사용자가 유효한 토큰을 얻었을 경우 서버의 데이터베이스에 무제한으로 접근할 수 있습니다. 서버가 오래된 알고리즘을 사용해 secretKey를 생성하면, 해당 키가 탈취당할 수도 있습니다.
마치면서
현재 진행 중인 프로젝트에서 사용자의 로그인 요청에 대한, 인증 방식을 구현하기 위해 세션과 토큰 기반 인증 방식에 알아보았습니다. 요청에 대한 사용자의 아이디와 비밀번호와 같은 정보를 클라이언트에서 관리를 하는 것보다, 서버의 데이터베이스를 이용해 관리하는 것이 보안적인 측면에서 옳다고 생각해 세션 기반 인증방식을 선택하게 되었습니다.
'프로그래밍 > 프로젝트' 카테고리의 다른 글
도커 컴포즈 사용 시 DB 초기화 문제 해결 과정 (0) | 2023.03.18 |
---|---|
캐싱은 언제 적용하는게 좋을까? (2) | 2023.03.07 |
CAP 이론을 바탕으로 NoSQL 을 적용 할 만한 포인트 고려 (0) | 2023.03.02 |
GoodsForYou 패키지 구조에 대한 고민(포트와 어댑터) (0) | 2023.02.25 |
다중 서버 환경에서 사용자 로그인 구현시 세션 관리 방법으로 어떤걸 선택해야할까? (0) | 2023.01.16 |