본문으로 건너뛰기
yceffort
PostsSeriesTagsAbout🧪 Research
EN

Tweaks

theme
accent palette
film grain
minimal mode
BACK TO INDEX
◆ ESSAY
--min
--year
KOoriginal

mailMail icongithubtwitter
yceffort
•
© 2026
•
https://yceffort.kr
BACK TO INDEX
◆ ESSAY

브라우저 히스토리 조작

avatar
yceffort
2019-09-30 · 4분
4min
2019year
KOoriginal
javascriptbrowser

브라우저 히스토리

브라우저의 히스토리는 window.history안에 있다.

History {length: 3, scrollRestoration: "auto", state: null}

length만 가져올 수 있을 뿐, 실제 내부에 리스트는 가져올 수가 없는데 이는 보안상의 문제 때문이다.

window.history.back() window.history.forward()는 각각 브라우저의 앞으로가기 뒤로 가기와 동일한 역할을 한다.

특정 위치로 가기

window.history.go(n) 현재 페이지의 index는 0 이라고 볼 수 있다. -1 은 바로 전 페이지, 1 은 다음 페이지라고 볼 수 있다.

히스토리 추가 및 변경

pushState

window.pushState(state, title, url)

아래와 같이 한번 사용해보자.

history.pushState({hello: 'world'}, 'title', 'hello')

현재 있는 페이지 주소창에서 hello가 추가되었음을 알 수 있다. 그러나 브라우저는 이를 불러오지도 않고, 해당 주소의 존재여부도 파악하지 않는다. 그저 주소만 바뀐 것이다.

아래 프로세스를 살펴보자.

  1. www.google.com 접속 -> history: 1
  2. history.pushState({ hello: "world" }, "title", "hello"); 입력 -> 주소창: google.com/hello / history: 2
  3. www.naver.com 접속 -> history: 3
  4. 뒤로가기 버튼 클릭
  5. https://www.google.com/hello 가 404를 띄움 -> history.state에 hello: world 가 있음.
  6. 뒤로가기 버튼 클릭
  7. www.google.com 으로 돌아가지만, 여전히 404

따라서 pushState는 history에 새로운 history만을 추가할 뿐, 실질적으로 페이지 이동은 일으키지 않는 다는 것을 볼 수 있다.

state

javascript object로, pushState로 새로운 히스토리를 만드는 것과 관련이 있다. 사용자가 새로운 상태로 이동할 때마다, popState이벤트가 발생해서, state의 사본을 가져온다. 파이어폭스의 경우 640k정도의 데이터를 저장할 수 있으며, 이는 브라우저를 재시작해도 사용할 수 있다. 즉, 해당 history state에서 필요한 값을 넣어두는 용도로 사용하면 좋다.

title

현재 파이어폭스나 크롬에서 쓰지 않는 변수로 보인다. state의 명칭을 기록해 두는 용도로 사용하면 될 것 같다.

URL

새로운 history의 url을 지정한다. 이 전 예제에서도 봤던 것처럼, 브라우저는 해당 URL을 호출하지 않는다.

어째 돌아가는 모양, 주소는 바뀌지만 url을 로딩하지 않는 다는 것이 window.location = '#foo' 와 비슷해 보이는 측면이 있다. 이렇게 쓸모없어보이는 pushState는 아래와 같은 장점이 있다.

  • pushState로 생성한 URL은 현재 URL을 기준으로 한다. 반대로 window.location는 해쉬값을 지정할 경우에만 같은 document에 머물러 있다. (아무튼 URL로딩을 안함)
  • URL 변경이 필요 없다면, URL값을 안넣어서 변경을 안해주어도 된다. 반대로 해쉬값 지정의 경우에는 현재 해쉬값과 다른 경우에만 새로운 히스토리를 생성한다.
  • state 오브젝트로 데이터를 저장할 수 있다. 반면 해쉬는 해쉬값을 활용해야 한다.

replaceState

replaceState는 pushState와 동작이 거의 비슷하다. 다만 히스토리를 추가하는 것이 아닌, 덮어 쓴다는 것에서 차이가 있다.

관련 글

  • #javascript#browser

    V8에서 관리되는 자바스크립트 변수

    V8 내부 코드를 자유롭게 읽을 수 있는 그날까지

    2022-04-21·10분
  • #javascript#nodejs#browser

    브라우저와 Nodejs의 이벤트 루프는 무엇이 다를까

    인생은 돌고 도는 이벤트 루프

    2021-08-10·16분
  • #web-performance#javascript#browser

    웹 페이지에서의 자바스크립트 메모리 사용량 벤치마킹

    분석할 때 마다 한숨이 나오는 그것

    2021-08-07·13분
  • #javascript#browser

    V8 엔진에 대해 가볍게 살펴보기

    맛만 볼게 아니고 직접 코드 까봐서 공부를 해봐야 되는데 😭

    2020-11-27·14분

새 글을 놓치고 싶지 않으시다면 RSS로 구독해 주세요.

RSS 구독 →

yceffort — 프론트엔드 엔지니어입니다. 발표·기술 자문·기고 문의는 이곳에서 받고 있습니다.

← Back to the blogIssue on GitHub →