금오산성의 초축 연대는 문헌상으로 알 수 없다. 그러나 『신증동국여지승람』에 "고려 말에는 인동, 개령, 성주의 백성들이 왜구의 침입을 피하여 성 안에 들어와 사는 자가 매우 많았으며 병사를 징발하여 성을 지키게 하였고, 조선 초에는 여기에 군창(軍倉)도 있었다."라고 기록되어 있는 것으로 보아, 고려 후기에는 이미 성을 사용하고 있었던 것을 알 수 있다. 조선 전기인 1410년(태종 10)과 1413년(태종 13)에 성을 수축(修築)한 기록이 있다. 금오산성은 임진왜란 때 인동의 천생산성과 더불어 영남 지역의 요충지로 중요한 기능을 담당하였다. 정유재란 때는 산성이 왜적의 손에 들어가 많은 피해를 입었다.
1606년(선조 39)에 금오산성의 내성을 대대적으로 수축하였다. 금오산성 수성장이자 산성 수축 당시 감동관(監董官)이었던 정방준(鄭邦俊)이 쓴 「축성금오시일기(築城金烏時日記)」가 있어 당시 금오산성의 수축에 대한 자세한 내용을 알 수 있다. 1606년(선조 39) 4월 1일 승군(僧軍)을 주축으로 벌목을 시작하여 금산 · 선산 · 지례 · 상주 · 고령 · 용궁 · 예천 · 합천 · 거창 등 9개 고을의 군일꾼들이 금오산성을 쌓는 일에 동원되었으며, 1606년 10월 23일 성이 완성되었다. 성을 쌓기 위해 먼저 벌목과 정지(整地) 작업을 한 뒤, 산성의 제일 중요한 요소인 물을 확보하기 위해 제언(堤堰)과 샘, 우물을 만들었다. 이어 창고나 군기고 등을 마련하였고, 그 위에 성곽의 몸체를 본격적으로 쌓았으며, 포루(鋪樓), 문루(門樓) 등을 정비했다. 이렇게 금오산성을 수축하는 데 대략 7개월 정도의 기간이 소요되었다. 수축 당시 왜성(倭城)의 모양과 같이 산성의 외면은 높고 가파르게 만들고 내면은 평탄하게 만들었다. 또한 이전에 놓였던 잡석(雜石)을 제거하고 대석을 놓았는데, 이는 여장(女牆, 女墻) 안에 말이 달리거나 많은 사람들을 수용할 수 있도록 만든 것으로 보인다. 그러나 발굴 조사가 이루어지지 않아 자세한 내용은 알 수 없다.
1639년(인조 17) 경상감사 이병진의 건의로 금오산성의 외성이 축조되었다. 선산군수 이각(李恪)이 외성의 축조를 담당하였다. 당시 축조한 외성은 둘레 4,135척, 높이 14척으로 개령, 금산, 지례 지역의 군량과 병기를 비축하였다. 1735년(영조 11) 선산부는 우병사영 관하의 독진(獨鎭)으로 승격되었고, 선산도호부사가 금오산성 별장을 겸임하였다. 이때 금오산성진의 병력은 3,500명에 이르렀다.
금오산성 지표 조사 결과 북문, 남문, 서문, 중문 등 성문 4개소가 확인되었으며, 일부는 협축식(夾築式)으로 쌓았고 경사면은 편축식으로 축조하였다. 북문은 홍예식(虹霓式, 虹蜺式) 누문(樓門)으로 복원해 ‘대혜문(大惠門)’이란 현판을 걸었다. 내성의 성안마을 입구에는 1866년(고종 3) 병인양요 이후 유비무환의 자세로 국방을 지키기 위해 산성을 고쳐 쌓은 기록이 담긴 ‘금오산성중수송공비(金烏山城重修頌功碑)’가 남아 있다.