2단계 인증은 왜 사용하는 걸까?

2023. 7. 6. 04:11카테고리 없음

평소 여러 서비스를 사용하다 보면 2단계 인증을 진행하라는 문구를 자주 볼 수 있다.

이때마다 귀찮게 핸드폰이나 이메일을 통한 2단계 인증을 해야 한다.

왜 그런 것일까?

 

어차피 뚫릴 수 있는 보안

결론부터 말하자면 어떤 방식으로 보안을 강화하든 로그인 정보는 탈취당할 수 있기 때문이다.

왜 그런지 알기 위해선 로그인을 유지하는 방법을 알아야 한다.

 

로그인 유지에는 대표적으로 session과 JWT(json web token)를 많이 쓴다.

session

session은 서버에 session 정보를 저장하고 클라이언트의 cookie에 session의 id 값을 저장한다.

session의 인증 방식

 

JWT - json web token

jwt는 session과 비슷하며 다르다.

JWT의 구조는 아래와 같다

JWT의 구조

Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.

payload는 claim 정보를 담고 있다. signature는 secret key를 포함해 암호화 돼있다.

 

이 JWT를 클라이언트가 로컬 스토리지에 저장한다. 서버 측에서도 JWT의 발급 유무를 저장해 유효성을 확인한다.

 

또한 JWT가 탈취당할 수 있기에 refresh token이라는 기법을 사용한다.

사실 어려운 기법은 아니고 JWT의 유효 기간을 짧게 15분 정도로 설정하고 refresh token을 길게 15일 정도 설정한다고 보면 된다.

 

하지만 access token이나 refresh token이나 차이가 거의 없기 때문에 둘 다 탈취에 취약하다.

 

CSRF 공격

앞서 말한 탈취를 통한 공격은 보통 CSRF 공격을 말한다.

 

CSRF란 페이크 사이트를 통해 JSESSIONID나 JWT access token을 탈취, 사용하는 공격 방법이다.

JSESSIONID나 JWT access token은 결국 서버에서 인증 데이터를 관리하거나 유효성을 관리하는 거지 모든 걸 서버에서 관리하는 게 아니다. 서버에서 할 수 있는 보안은 한계가 있다.

 

그럼 어떻게 해야 할까?

SESSION의 보안 취약점을 보완하기 위해 나온 JWT도 결국 클라이언트에 저장된 데이터를 사용하여 식별하기에 탈취의 위험이 있고 session은 쿠키를 통하기에 탈취의 위험이 있다.

 

둘 다 비슷한 이유이고 현재로선 JWT 이상의 방어 방법은 찾기 어렵다.

 

이는 인증의 방식을 바꾸면 된다.

민감한 정보와 그렇지 않은 정보의 등급을 나눠 관리하는 것이다.

민감치 않은 정보의 접근은 PUB, 민감한 정보의 접근은 PRI라고 할 때

PUB는 JWT나 SESSION을 통해 검증한다.

PRI는 이메일 인증, 전화번호 인증과 같은 좀 더 직접적인 인증을 요구한다.

 

이 방법은 유저 입장에서 매우 귀찮은 작업이다.

하지만 현시점에서의 최선의 방법이 아닐까 싶다.

 

최근 GITHUB가 2단계 인증이 필수가 됐는데 이와 같은 이유가 아닐까 싶다.