Login Process

logY·2022년 8월 3일
0

로그인을 하기 위해서는 고려해야할 것들이 몇가지 있는데 그중에 가장 중요한 것이 보안일 것이다.
로그인 프로세스를 배우기에 앞서 간략하게 암호화에 대해 알아보자

우선 암호화가 왜 필요한지 생각해보자
내가 가입한 사이트에 비밀번호가 1234라고 했을 때 이것을 그대로 DB에 1234라고 저장하게 된다면 DB가 해킹을 당했을 때 해커가 해당 서비스의 이메일과 비밀번호를 가져갈 수 있게 된다.
DB가 해킹 당하지 않는 것이 최선이겠지만 해킹을 당하더라도 암호화를 통해 저장된 비밀번호라면 쉽게 비밀번호를 알아내기란 쉽지 않을 것이다.

암호화는 크게 양방향 암호화단방향 암호화로 나눌 수 있다.

양방향 암호화

암호화와 복호화 과정을 통해 송·수신 간 주고받는 메시지를 안전하게 암호화하고 평문으로 복호화할 수 있는 암호화 방식

양방향 암호화는 위의 설명처럼 암호화에 사용된 키를 통해 암호화와 복호화를 할 수 있는 방식이다. 때문에 암호화에 사용된 키를 해킹 당하게 된다면 복호화는 자동적으로 이루어지게 된다.

이에 따른 대책으로 해싱(단방향 암호화) 이라는 기술이 나타나게 되었다.

해싱(단방향 암호화)

평문을 암호문으로 암호화하는 것은 가능하지만 암호문을 평문으로 복호화 하는 것은 불가능한 암호화 방식

해시는 수학적인 연산(또는 알고리즘)에 의해 원본 데이터를 매핑 시켜 완전히 다른 암호화된 데이터로 변환시키는 것을 의미한다. 여기서 해싱은 단방향 즉, 해시 함수를 사용해 암호화한 데이터는 복호화할 수 없다.

하지만 해시 함수를 통해서 암호화한다고 보완이 완벽하다고 할 수 있는 없는데, 암호화에 사용되는 알고리즘에 무작위로 데이터를 대입해 복호화하는 경우가 존재하기 때문이다.

**이런 점을 보완하기 위해 생겨난 방법이 키-스트레칭소트이다.

Key Stretching

Key Stretching은 임의로 횟수를 정해 Hash 함수를 여러 번 돌리는 방법이다.
단순한 방법이지만 구현이 쉽다. 하지만 암호화하는 횟수를 늘리게 된다면 시간이 그만큼 소요되기 때문에 속도 측면에서 불리하다.

Salt

Key Stretching의 경우 시간 문제를 제외하고도 몇번의 함수를 돌렸는지 알게 된다면 공격하는 입장에서는 쉽게 복호화할 수 있을 것이다.
때문에 Salt라는 기법을 사용하는데 의미 그대로 암호화를 하기전 데이터에 임의의 문자열을 붙인 후에 암호화하는 방식이다.


여기까지 암호화에 대해 알아보았다. 이제 본격적으로 로그인에 대해 알아보자

로그인은 인증과 인가로 나뉘어진다.
인증은 해당 사용자가 올바른 사용자인지를 판단하는 것이고
인가는 해당 사용자가 서비스를 사용할 수 있는 상태인지를 확인하는 것이다.

우선 인증에 대해 알아보자

인증 시스템

서버 기반 인증 시스템

서버 인증 시스템은 서버측에서 유저들의 정보를 기억하고 있어야 한다.
하지만 이러한 방식의 인증 방식은 여러가지 문제점을 가지게 되는데

  • 서버가 유저의 인증 기록을 세션에 정하는데, 로그인 유저가 많아지면 서버가 과부하된다.
  • 세션을 사용하면 분산된 시스템을 설계하고 **서버를 확장하는 것이 어렵다
  • 세션을 관리할 때 사용되는 쿠키는 여러 도메인에서 관리하는 것이 번거롭다.

이처럼 서버에서 모든 인증 정보를 가지고 있는 상태를 Statefull이라고 한다.

토큰 기반 인증 시스템

무상태(Stateless) & 확장성(Scalability)
Stateful Server의 경우 클라이언트에게 요청을 받을 때마다 상태를 유지하고 정보를 서비스 제공에 이용한다.
반면 Stateless Server에서는 상태정보를 저장하지 않고, 서버는 클라이언트의 요청만으로 작업을 처리하여 세션을 사용하지 않는다.
따라서 토큰을 사용하면 클라이언트와 서버의 연결고리가 없어 서버를 확장하기에 매우 적합한 환경이 제공되게 된다.

확장성(Extensibility)

서버를 확장시키는 것 뿐 아니라 로그인 정보가 사용되는 분야를 확장할 수 있다.

작동 원리

  1. 유저가 아이디와 비밀번호로 로그인한다.
  2. 서버측에서 해당 계정 정보를 검증한다.
  3. 계정 정보가 정확하다면, 서버측에서 유저에게 signed 토큰(accesstoken)을 발급해준다.
  4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다 해당 토큰을 함께 서버에 전달한다.
  5. 서버는 토큰을 검증하고, 요청에 응답한다.

인가

위에서 토큰 기반의 인증 시스템에 대해 배웠다. 위에서 발급 받은 토큰은 유저 정보를 가지고 있게 되는데 이 토큰을 사용해 유저의 상태를 알 수 있게 되고 유효한 유저인지를 판단하는 지표로 활용할 수 있게 된다.

profile
백엔드 개발자

0개의 댓글