스티비 백엔드 엔지니어 채용 과제 - “창과 방패”

개요

각 스테이지에 필요한 방패 서버를 구성하고 주어진 미션을 달성하면 다음 스테이지로 넘어갑니다.
총 3개 스테이지가 있습니다. 스테이지 2까지 통과했다면 스테이지 1, 2에 대한 코드를, 스테이지 3까지 통과했다면 스테이지 1, 2, 3에 대한 모든 코드를 보내주세요.
recruit@stibee.com으로 코드를 보내주세요. 작성된 코드를 압축해 파일로 보내주시거나 github에 게시 후 github URL을 보내주세요.

서버 정보

창 서버

주소: http://attack.stibee.kr:8090

방패 서버

주소: 이메일로 별도 안내
계정: ubuntu
인증 키: 이메일로 별도 안내
포트: http 8090을 열고 방어

상세 내용

스테이지 1

1.
서버가 시작되면 창 서버로 스테이지 1 미션을 시작할 준비가 됐다고 알립니다.
[예시] POST {창 서버}/stage?id=gildong@stibee.com&level=1 //id는 서류 제출 시 사용한 이메일 주소를 사용한다. //id는 미션 시도에 대한 구분 값으로, 동일한 id로 동시에 미션을 진행할 수 없다. //id는 방패 서버에서 임의로 설정하되, 미션수행이 성공 또는 실패로 끝나면 동일한 id로 다시 시도해도 된다.
JavaScript
복사
2.
200 OK 응답을 받았다면, 창 서버에서 방패 서버로 공격을 시작합니다.
창 서버는 미션 시작 준비를 알린 IP에 대해 공격을 시도합니다.
3.
창 서버에서 방패 서버로 공격 내용의 예시는 다음과 같습니다. 공격 내용은 임의의 문자와 길이로 요청됩니다.
[예시] POST {방패 서버}/stage1 abcdef
GraphQL
복사
4.
방패 서버는 요청받은 콘텐츠를 읽어서 다음과 같이 응답을 주어야 합니다.
[예시] 200 OK bcdefg //요청받은 각 문자의 아스키 값에 +1을 더한 값을 응답으로 내린다. //a+1 = b //c+1 = d
JavaScript
복사
5.
30초내에 모든 요청에 대한 정답을 응답하면 미션 성공!
6.
미션에 대한 결과가 다음과 같이 창 서버방패 서버로 전달됩니다.
[예시] POST {방패 서버}/stage/result Content-Type: application/json { "id": "gildong@stibee.com", //요청 시 사용한 id 값 "level": 1, //도전한 스테이지 레벨 "success": true, //스테이지 성공 또는 실패 "want": 1000, //원하는 정답 수 "actual": 1000, //실제 정답 수 "elapsedTime": 1 //경과 시간 초 단위 }
JavaScript
복사

스테이지 2

1.
서버가 시작되면 창 서버로 스테이지 2 미션을 시작할 준비가 되었다고 알립니다.
[예시] POST {창 서버}/stage?id=gildong@stibee.com&level=2
JavaScript
복사
2.
200 OK 응답을 받았다면, 창 서버에서 방패 서버로 공격을 시작합니다.
3.
창 서버에서 방패 서버로 공격 내용의 예시는 다음과 같습니다. 공격 내용은 임의의 문자와 길이로 요청됩니다.
[예시] POST {방패 서버}/stage2 abcdef bcdefg cdefgh ...... //요청에 대한 개행은 '\n' 이다
JavaScript
복사
4.
방패 서버는 요청받은 콘텐츠를 읽어서 아래와 같이 응답을 주어야 합니다.
[예시] 200 OK bcdefg cdefgh defghi ...... //요청받은 각 문자의 아스키 값에 +1을 더한 값을 응답으로 내린다. //a+1 = b //c+1 = d
JavaScript
복사
5.
120초내에 모든 요청에 대한 정답을 응답하면 미션 성공!
6.
미션에 대한 결과가 다음과 같이 창 서버방패 서버로 전달됩니다.
[예시] POST {방패 서버}/stage/result Content-Type: application/json { "id": "gildong@stibee.com", //요청 시 사용한 id 값 "level": 2, //도전한 스테이지 레벨 "success": true, //스테이지 성공 또는 실패 "want": 1000, //원하는 정답 수 "actual": 1000, //실제 정답 수 "elapsedTime": 1 //경과 시간 초 단위 }
JavaScript
복사

스테이지3

1.
서버가 시작되면 창 서버로 스테이지 3 미션을 시작할 준비가 되었다고 알립니다.
[예시] POST {창 서버}/stage?id=gildong@stibee.com&level=3
JavaScript
복사
2.
200 OK 응답을 받았다면, 창 서버에서 방패 서버로 공격을 시작합니다.
3.
창 서버에서 방패 서버로 공격 내용의 예시는 다음과 같습니다. 공격 내용은 임의의 문자와 길이로 요청됩니다.
[예시] POST {방패 서버}/stage3 abcdefabcdefabcdefabcdefabcdefabcdef bcdefgbcdefgbcdefgbcdefgbcdefgbcdefg cdefghcdefghcdefghcdefghcdefghcdefgh ...... //요청에 대한 개행은 '\n' 이다
JavaScript
복사
4.
방패 서버는 요청받은 콘텐츠를 읽어서 아래와 같이 응답을 주어야 합니다.
[예시] 200 OK bcdefgbcdefgbcdefgbcdefgbcdefgbcdefg cdefghcdefghcdefghcdefghcdefghcdefgh defghidefghidefghidefghidefghidefghi ...... //요청받은 각 문자의 아스키 값에 +1을 더한 값을 응답으로 내린다. //a+1 = b //c+1 = d
JavaScript
복사
5.
10초내에 모든 요청에 대한 정답을 응답하면 미션 성공!
6.
미션에 대한 결과과 다음과 같이 창 서버방패 서버로 전달됩니다.
[예시] POST {방패 서버}/stage/result Content-Type: application/json { "id": "gildong@stibee.com", //요청 시 사용한 id 값 "level": 3, //도전한 스테이지 레벨 "success": true, //미션 성공 또는 실패 "want": 1000, //원하는 정답 수 "actual": 1000, //실제 정답 수 "elapsedTime": 1 //경과 시간 초 단위 }
JavaScript
복사
7.
구현에 따라 OOM(Out Of Memory)이 발생할 수 있으니 이를 해결 해야 합니다. (해결 방식에 대한 제한은 없습니다.)