본문 바로가기
개발하는 일상

잘못된 로그인 시도를 네이버 CAPTCHA로 막아보자

by 노슬로 2024. 5. 3.

 

브루트 포스 공격(brute force attack)이란?

무차별 암호 대입 공격으로 비밀번호, PIN 번호, 암호화 키를 무작위로 계속해서 입력함으로써 해킹을 시도하는 공격 방식이다.

 

서비스가 어느 정도 알려지게 되면 해커의 눈을 피할 수 없게 되면서 각종 공격을 받게 된다. 그중에 하나가 이메일 로그인에 아주 꾸준하고 끈질기게 로그인을 무작위로 시도하는 브루트 포스 공격이다.

 

네이버의 경우에도 아래 이미지와 비밀번호를 5회 이상 틀리면 아래와 같이 이미지를 띄우고 이미지 속의 글자를 입력하게 하는데 이것이 바로 CAPTCHA이다.

 

CAPTCHA는 컴퓨터와 인간을 구분하기 위한, 완전 자동화된 공개 튜링 테스트(Completely Automated Public Turing test to tell Computers and Humans Apart.)의 약자이며, 위에서 보는 이미지 방식의 캡차도 있고, 오디오를 듣고 적는 캡차, 그리고 은근 난이도가 있는 사진 속 횡단보도, 신호등을 고르는 방식의 캡차도 있다. 캡차는 한 번 틀리면 계속 난이도가 올라가는 방식들을 취하고 있기 때문에 계속 틀리면 난이도 급상승으로 그냥 사이트를 이탈해리는 허들이 되기도 한다.

 

요즘은 해당 기능을 제공하는 구글 reCAPTCHA에서 invisible방식의 CAPTCHA도 도입하여 사용자가 의식적으로 문자나 사진을 고르지 않고도 사용자의 행동 패턴을 통해 인간인지 봇인지 구분할 수 있다고 한다.

 

어쨌든, 나는 비밀번호를 n번 이상 틀리면 해당 경우에만 캡차를 띄워서 보여주는 방식을 구현하려하였고, 실제 사용예가 존재하는 네이버 캡차를 도입하기로 하였다.

 

네이버 캡차의 서비스는 아래 url을 통해 확인가능하다.

https://www.ncloud.com/product/applicationService/captcha

 

이용 요금은 묻지도 따지지도 않고 건당 1원이다. 

 

요청 흐름은 다음과 같다. API-KEY를 통해 API를 호출하고 있으므로 서비스가 멀티 플랫폼일 경우에는 이미지까지 서버에서 얻어서 캡차 key와 함께 내려주는 것이 key 관리 측면에서 적합해 보인다.

 

1. api-key를 넣고 캡차 Key를 요청한다.

> GET /v1/captcha/nkey?code=0 HTTP/1.1
> Host: naveropenapi.apigw.ntruss.com
> User-Agent: curl/7.49.1
> Accept: */*
> X-NCP-APIGW-API-KEY-ID: {애플리케이션 등록 시 발급받은 client id 값}
> X-NCP-APIGW-API-KEY: {애플리케이션 등록 시 발급받은 client secret 값}

 

2. 받은 캡차 Key를 가지고 캡차 Image를 요청한다.

> GET /v1/captcha-bin/ncaptcha.bin?key=t521bp3qM7Qyk2X2&X-NCP-APIGW-API-KEY-ID={애플리케이션 등록 시 발급받은 client id 값} HTTP/1.1
> Host: naveropenapi.apigw.ntruss.com
> User-Agent: curl/7.49.1
> Accept: */*

 

3. 캡차 Image는 아래아 같은 JPG 포맷의 이미지 데이터이므로 image로 변환하여 보여주어야 한다.

data:image/jpeg;base64,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

 

4. 사용자가 입력한 값과 캡차 key를 전송하여 일치 여부를 확인한다.

> GET /v1/captcha/nkey?code=1&key=eioDb7T8M703uht0&value=1PUNUST HTTP/1.1
> Host: naveropenapi.apigw.ntruss.com
> User-Agent: curl/7.49.1
> Accept: */*
> X-NCP-APIGW-API-KEY-ID: {애플리케이션 등록 시 발급받은 client id 값}
> X-NCP-APIGW-API-KEY: {애플리케이션 등록 시 발급받은 client secret 값}

 

자세한 API에 대한 설명과 각 언어별 호출 예제는 아래 사이트를 참고하면 좋다.

https://api.ncloud-docs.com/docs/ai-naver-captcha-image

 

 

'개발하는 일상' 카테고리의 다른 글

단축URL 구축 개요  (0) 2024.05.19
휴대폰 본인인증 서비스 적용기  (0) 2024.05.15