비밀번호를 안전하게 저장하는 일은 까다롭고, 사용자에게 또 하나의 비밀번호를 만들게 하는 것도 부담이다. 그래서 많은 서비스가 사용자가 이미 가진 다른 곳의 계정을 빌려 로그인하게 한다. 이미 신뢰받는 큰 서비스의 계정으로 우리 서비스에 들어오게 하는 이 방식이 소셜 로그인이다. 사용자는 새 비밀번호를 만들지 않아 편하고, 서비스는 비밀번호를 직접 다루지 않아도 된다.
이번 편은 소셜 로그인이 무엇이고 어떤 원리로 성립하는지, 신뢰를 외부에 위임한다는 것이 무엇을 뜻하는지, 이 방식으로 무엇을 얻고 무엇을 내주는지, 넘어온 신원을 우리 계정에 어떻게 잇는지, 그리고 편리함 뒤에 어떤 함정이 있는지를 다룬다. 구체적인 절차는 다음 편에서 다루고, 여기서는 그 절차가 무엇을 하려는 것인지 큰 그림을 세운다.
소셜 로그인이란 무엇인가
소셜 로그인은 사용자가 이미 가진 외부 서비스의 계정을 우리 서비스의 로그인에 빌려 쓰는 방식이다. 사용자는 우리 서비스에 비밀번호를 따로 만들지 않고, 외부 서비스에 이미 로그인되어 있음을 근거로 우리 서비스에 들어온다. 신원을 확인하는 일을 외부의 큰 서비스에 맡기고, 그 결과만 넘겨받는 구조다.
이 구조에서 우리 서비스는 사용자의 비밀번호를 보지 못한다. 사용자는 외부 서비스에서만 비밀번호를 입력하고, 우리 서비스는 그 외부 서비스가 확인해 준 결과를 받을 뿐이다. 비밀번호가 우리 쪽을 거치지 않으므로, 우리는 비밀번호를 저장하거나 지킬 부담에서 벗어난다. 대신 외부 서비스가 넘겨준 신원을 어떻게 믿을지가 새로운 과제가 된다.
사용자가 얻는 것은 편의다. 여러 서비스마다 비밀번호를 만들고 기억할 필요 없이, 자주 쓰는 하나의 계정으로 여러 곳에 들어갈 수 있다. 비밀번호를 관리하는 부담이 줄고, 그만큼 약한 비밀번호를 여기저기 재사용하는 위험도 줄어든다. 편의가 곧 방어에도 보탬이 되는 셈이다.
서비스가 얻는 것은 비밀번호를 직접 다루지 않아도 된다는 점이다. 비밀번호를 안전하게 저장하고, 새어 나가지 않게 지키고, 재설정을 다루는 일은 모두 만만치 않은데, 소셜 로그인은 이 부담의 상당 부분을 외부 서비스에 넘긴다. 다만 그 대가로 외부 서비스에 대한 의존과 신뢰라는 새로운 짐을 진다.
신뢰를 위임한다는 것
소셜 로그인의 바탕에는 신원 확인을 외부에 위임한다는 발상이 있다. 우리 서비스가 직접 사용자를 확인하는 대신, 신뢰할 만한 외부 서비스가 확인한 결과를 받아들이는 것이다. 이 위임이 성립하려면 우리가 그 외부 서비스의 확인을 믿을 수 있어야 하고, 넘어온 결과가 진짜 그 외부 서비스에서 왔음을 확인할 수 있어야 한다.
여기서 신뢰의 대상은 외부 서비스 자체다. 그 서비스가 사용자를 제대로 확인했으리라고 믿고, 그 확인 결과를 우리 서비스의 신원 근거로 삼는다. 이 신뢰가 전제되므로, 어느 외부 서비스를 신뢰의 대상으로 삼을지는 신중히 정해야 한다. 신뢰할 만한 서비스만 로그인 제공자로 받아들이는 것이 첫 번째 방어다.
넘어온 결과가 진짜인지 확인하는 것도 위임의 핵심이다. 외부 서비스가 확인해 주었다는 결과가 실제로 그 서비스에서 온 것이고 도중에 위조되지 않았음을 검증할 수 있어야, 그 결과를 믿을 수 있다. 이 검증이 없다면 누구든 외부 서비스를 사칭한 결과를 보내 우리 서비스를 속일 수 있다. 그래서 넘어온 신원 증명의 진위를 확인하는 절차가 반드시 따른다.
위임은 편리하지만 신뢰의 사슬을 늘린다. 우리 서비스의 안전이 외부 서비스의 안전에도 걸리게 되는 것이다. 외부 서비스가 뚫리면 그 계정으로 들어오는 우리 서비스도 영향을 받는다. 위임을 택한다는 것은 이 늘어난 사슬을 받아들이는 일이므로, 그만큼 신뢰의 대상을 고르는 데 신중해야 한다.
얻는 것과 내주는 것
소셜 로그인으로 얻는 이점은 분명하다. 비밀번호를 직접 다루지 않아 저장과 보호의 부담이 줄고, 사용자는 새 계정을 만드는 문턱 없이 손쉽게 들어온다. 가입 과정이 짧아지므로 서비스에 진입하는 사용자도 늘어난다. 편의와 방어와 진입의 이점이 함께 따라온다.
대신 내주는 것은 신원에 대한 통제다. 사용자의 신원을 외부 서비스가 쥐고 있으므로, 그 외부 서비스의 정책과 상태에 우리 서비스가 영향을 받는다. 외부 서비스가 계정을 정지하거나 정책을 바꾸면, 그 계정으로 들어오던 사용자가 우리 서비스에도 들어오지 못하게 될 수 있다. 신원의 주도권이 외부에 있다는 점이 대가다.
의존의 위험도 함께 따른다. 외부 서비스에 장애가 나면 그 계정으로 들어오던 사용자들의 로그인이 함께 막힌다. 하나의 외부 서비스에만 기대면 그 서비스의 상태가 곧 우리 서비스의 로그인 가능 여부를 좌우한다. 그래서 여러 로그인 제공자를 함께 두거나, 자체 로그인 수단을 나란히 마련해 의존을 분산하는 설계가 쓰인다.
넘겨받는 정보의 범위도 따져야 한다. 외부 서비스는 신원 확인 결과와 함께 사용자의 여러 정보를 넘겨줄 수 있는데, 필요 이상으로 많은 정보를 넘겨받으면 그 정보를 지킬 부담이 다시 우리에게 돌아온다. 그래서 로그인에 꼭 필요한 최소한의 정보만 요청하는 것이 원칙이다. 편의를 위해 넓게 받기보다, 필요한 만큼만 받아 지킬 것을 줄이는 편이 안전하다.
넘어온 신원을 계정에 잇기
외부 서비스가 확인해 준 신원은 우리 서비스의 계정과 이어져야 한다. 외부 서비스는 그 사용자를 가리키는 고유한 식별자를 함께 넘겨주는데, 이 식별자를 우리 계정에 연결해 두면 다음 로그인 때 같은 사용자임을 알아본다. 이 연결이 소셜 로그인이 우리 서비스 안에서 자리 잡는 방식이다.
연결의 기준으로는 외부 서비스가 주는 고유 식별자를 쓰는 것이 안전하다. 사용자의 이름이나 표시용 정보는 바뀔 수 있으므로 연결의 기준으로 삼기에 불안정하다. 반면 외부 서비스가 그 사용자에게 부여한 고유 식별자는 좀처럼 바뀌지 않으므로, 이를 기준으로 삼으면 정보가 바뀌어도 같은 사용자를 계속 알아볼 수 있다.
한 사용자가 여러 로그인 수단을 함께 쓰는 경우도 다루어야 한다. 같은 사람이 외부 서비스로도 들어오고 자체 계정으로도 들어올 수 있는데, 이를 별개의 계정으로 두면 혼란이 생긴다. 그래서 여러 로그인 수단을 하나의 계정에 이어 붙이는 연결을 마련해, 같은 사람이 어느 수단으로 들어와도 하나의 계정으로 이어지게 한다.
계정을 잇는 과정에서 다른 사람의 계정에 잘못 이어지지 않도록 주의해야 한다. 외부 서비스가 넘겨준 정보 가운데 다른 사람과 겹칠 수 있는 값을 연결의 유일한 기준으로 삼으면, 엉뚱한 계정에 이어질 위험이 있다. 그래서 연결에는 고유 식별자를 기준으로 삼고, 겹칠 수 있는 정보만으로 자동 연결하는 것은 피하며, 필요하면 사용자에게 확인을 받는 절차를 둔다.
여러 제공자를 다루는 설계
실제 서비스는 하나가 아니라 여러 외부 로그인 제공자를 함께 두는 경우가 많다. 사용자마다 즐겨 쓰는 서비스가 다르므로, 여러 선택지를 제공하면 더 많은 사용자가 편하게 들어온다. 다만 제공자가 늘수록 각 제공자의 결과를 검증하고 계정에 잇는 처리도 함께 늘어나므로, 이를 일관된 틀로 다루는 설계가 필요하다.
여러 제공자를 다룰 때는 공통의 처리 흐름을 두고 제공자별 차이만 갈라내는 방식이 깔끔하다. 넘어온 신원을 검증하고, 고유 식별자를 꺼내고, 계정에 잇는 큰 흐름은 제공자마다 비슷하므로 공통으로 두고, 제공자마다 다른 세부만 따로 처리한다. 이렇게 하면 새 제공자를 더할 때 공통 흐름을 재사용할 수 있어 실수가 줄어든다.
제공자마다 넘겨주는 정보의 형태와 범위가 다르다는 점도 고려해야 한다. 어떤 제공자는 특정 정보를 주고 어떤 제공자는 주지 않으므로, 우리 서비스가 꼭 필요로 하는 정보가 없을 때 어떻게 처리할지를 미리 정해 두어야 한다. 필요한 정보가 없으면 사용자에게 따로 받는 식으로, 제공자 간의 차이를 메우는 절차를 마련한다.
자체 로그인 수단을 함께 두는 것도 여러 제공자 설계의 일부다. 외부 제공자에만 의존하면 그 제공자의 상태에 로그인이 좌우되므로, 자체 계정을 나란히 제공해 사용자가 선택할 수 있게 한다. 여러 갈래의 로그인 수단이 하나의 계정으로 모이도록 이어 두면, 사용자는 편한 수단을 고르면서도 하나의 신원으로 서비스를 이용한다.
편리함 뒤의 함정
소셜 로그인의 첫 번째 함정은 넘어온 결과를 검증 없이 믿는 것이다. 외부 서비스가 확인해 주었다는 결과가 진짜 그 서비스에서 왔는지, 우리 서비스를 위한 것인지, 도중에 위조되지 않았는지를 확인하지 않으면, 사칭한 결과에 속을 수 있다. 위임의 편리함에 기대되 검증만큼은 우리 서비스가 엄격히 쥐고 있어야 한다.
두 번째 함정은 넘어온 정보 가운데 바뀔 수 있는 값을 신원의 기준으로 삼는 것이다. 표시용 정보나 겹칠 수 있는 값을 계정 연결의 유일한 근거로 쓰면, 다른 사람의 계정에 이어지거나 정보가 바뀌었을 때 같은 사용자를 알아보지 못하는 문제가 생긴다. 연결의 기준은 좀처럼 바뀌지 않는 고유 식별자여야 한다.
세 번째 함정은 필요 이상의 정보를 넘겨받는 것이다. 편의를 위해 넓게 정보를 받아 두면, 그 정보를 지킬 부담이 다시 우리에게 돌아오고 새어 나갔을 때의 피해도 커진다. 로그인에 꼭 필요한 최소한만 받고, 그 밖의 정보는 정말 필요할 때 따로 요청하는 절제가 방어에 보탬이 된다.
네 번째 함정은 외부 제공자에만 전적으로 의존하는 것이다. 하나의 제공자에만 기대면 그 제공자의 장애나 정책 변화가 곧 우리 서비스의 로그인 문제로 이어진다. 여러 제공자를 두거나 자체 수단을 나란히 마련해 의존을 분산하고, 한 제공자에 문제가 생겨도 사용자가 다른 수단으로 들어올 길을 열어 두어야 한다.
연결 해제와 탈퇴를 다루기
계정을 잇는 일만큼이나 잇던 연결을 끊는 일도 다루어야 한다. 사용자가 특정 외부 제공자와의 연결을 끊고 싶어 할 수 있고, 서비스를 아예 떠나려 할 수도 있다. 연결을 이어 붙일 때 신중해야 하듯, 끊을 때도 다른 로그인 수단이 남아 있는지를 확인해 사용자가 계정에서 완전히 잠기지 않게 해야 한다.
외부 제공자와의 연결을 하나 끊더라도, 그 계정에 다른 로그인 수단이 남아 있으면 사용자는 계속 들어올 수 있다. 반면 그것이 유일한 로그인 수단이라면, 연결을 끊는 순간 사용자는 계정에 들어올 길을 잃는다. 그래서 마지막 남은 로그인 수단을 끊으려 할 때는, 다른 수단을 먼저 마련하도록 안내하거나 그 동작을 막는 처리가 필요하다.
서비스를 떠나는 탈퇴에서는 외부 제공자와의 연결 정보도 함께 정리해야 한다. 계정을 지우면서 그와 이어져 있던 외부 식별자 연결도 지워, 남은 흔적이 뒷날 엉뚱한 계정에 이어지는 일이 없게 한다. 넘겨받아 두었던 사용자의 정보도 보관할 이유가 사라졌다면 함께 정리하는 것이 원칙이다.
외부 제공자 쪽에서 사용자가 우리 서비스에 대한 접근 권한을 거두어들이는 경우도 있다. 사용자가 외부 서비스의 설정에서 우리 서비스와의 연결을 해제하면, 우리는 더 이상 그 계정으로 신원을 확인받지 못한다. 이런 외부에서 시작된 해제에도 대비해, 그 사용자가 다른 수단으로 들어올 수 있게 하거나 재연결을 안내하는 흐름을 갖추어야 한다.
정리하면 소셜 로그인은 신원 확인을 신뢰할 만한 외부 서비스에 위임해 비밀번호를 직접 다루지 않는 방식으로, 편의와 진입의 이점을 얻는 대신 신원의 통제를 외부에 내주고 의존의 위험을 진다. 넘어온 결과는 반드시 검증하고, 계정은 고유 식별자를 기준으로 이으며, 정보는 최소한만 받고, 의존은 분산해야 한다. 다음 편에서는 이 위임이 실제로 이루어지는 구체적인 절차를 들여다본다.