이번 포스팅에서는 URL에 내포한 URL QueryString에 대해 다룹니다.
1. QueryString ? Request Body ?
HTTP Request에 인자를 전달하는 방법들 입니다.
1) Query String
- URL에 노출되어 이해하거나, 디버깅 등의 요청에 의미를 파악하기 쉬움.
- 민감한 정보의 경우 보안상의 이슈가 될 수 있음.
- URL의 길이 제한에 따라, 너무 많은 인자를 전달하는 경우 오류가 발생할 수 있음.
2) Request Body
- 민감한 정보를 노출하지 않으므로 보안에 저촉되지 않음.
- QueryString에 비해 더 많은 데이터를 전달 할 수 있음. (파일업로드 등)
- 데이터 형식(Format)에 대해서 JSON, XML, FormData등 다양한 형태로 전달 가능.
2. URL 가져오기, QueryString 값 다루기
QueryString은 도메인 주소 뒤에 물음표(?)로 붙는 항목들을 뜻하며, 보통 key-value 형태로 구성합니다.
[예제] https://itteamb.blogspot.com/search/label/javascript?updated-max=2023-07-09T17:33:00%2B09:00
1) URL, SearchParams
Javascript에서 URL 객체와, URLSearchParams 객체를 통해 쉽게 다룰 수 있으며,
현재 브라우저의 URL을 window.location에서 참조하여 생성할 수 있습니다.
현재 브라우저의 URL을 window.location에서 참조하여 생성할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 | /** * URL 객체 (현재 전체 URL 획득 : window.location.href ) * [예제] https://itteamb.blogspot.com/search/label/javascript?updated-max=2023-07-09T17:33:00%2B09:00&max-results=20&start=3&by-date=false */ let exUrl = new URL(window.location.href); /** * URL QueryString 객체 (현재 URL의 QueryString 정보 : window.location.search) * ?updated-max=2023-07-09T17:33:00%2B09:00&max-results=20&start=3&by-date=false */ let exUrlSearch = new URLSearchParams(window.location.search); |
2) 값 확인 (entry 순회)
URL 객체의 searchParams와 URLSearchParams 객체는 같은 값을 갖습니다.
따라서, 아래와 같이 두 가지 형태로 표현할 수 있습니다.
따라서, 아래와 같이 두 가지 형태로 표현할 수 있습니다.
1 2 3 4 5 6 7 8 9 | /** Key, Value 순회 (1) */ for(const [key, value] of exUrl.searchParams.entries()){ console.log(key + ':' + value); } /** Key, Value 순회 (2)*/ for(const [key, value] of exUrlSearch.entries()){ console.log(key + ':' + value); } |
3) 퍼센트 디코딩
한글 또는 일부 특수문자에 대해서는 '퍼센트 디코딩' 방식에 따라 변환됩니다.
아래 예시와 같이 퍼센트(%)로 구분된 듯한 모습을 보이는 것이 인코딩된 인자입니다.
아래 예시와 같이 퍼센트(%)로 구분된 듯한 모습을 보이는 것이 인코딩된 인자입니다.
퍼센트 디코딩 값은 위에서 다룬 URL, URLSearchParams 객체에서는 디코딩된 값으로 읽게 됩니다.
[예시] https://itteamb.blogspot.com?a=%ED%85%8C%EC%8A%A4%ED%8A%B8
=> https://itteamb.blogspot.com?a=테스트
[예시] https://itteamb.blogspot.com?a=%ED%85%8C%EC%8A%A4%ED%8A%B8
=> https://itteamb.blogspot.com?a=테스트
그 외에 문자열에 대해 다뤄야할 경우 기본적으로 탑재된 encodeURL, encodeURIComponent, decodeURI, decodeURIComponent를 통해 다룰 수 있습니다.
- encodeURL, decodeURI : 예약어를 제외한 값들을 대상으로 인/디코딩 합니다.
- encodeURIComponent, decodeURIComponent : 예약어를 포함한 모든 값을 대상으로 인/디코딩합니다.
1 2 3 4 5 6 7 8 9 10 11 | // 결과 :: https://itteamb.blogspot.com?a=%ED%85%8C%EC%8A%A4%ED%8A%B8 encodeURI('https://itteamb.blogspot.com?a=테스트'); // 결과 :: https://itteamb.blogspot.com?a=테스트 decodeURI('https://itteamb.blogspot.com?a=%ED%85%8C%EC%8A%A4%ED%8A%B8') // 결과 :: https%3A%2F%2Fitteamb.blogspot.com%3Fa%3D%ED%85%8C%EC%8A%A4%ED%8A%B8 encodeURIComponent('https://itteamb.blogspot.com?a=테스트'); // 결과 :: https://itteamb.blogspot.com?a=테스트 decodeURIComponent('https%3A%2F%2Fitteamb.blogspot.com%3Fa%3D%ED%85%8C%EC%8A%A4%ED%8A%B8'); |
3. 그 외 '#' (hash)
URL에 해쉬(#) 값으로 구분되어 있는 경우는 보통 FE F/W에서 라우팅되는 경우에도 볼 수 있는 데,
Vue의 경우 Router mode를 'hash/history'로 변경함에 따라 URL에 붙는 형식입니다.
[예시 1] https://itteamb.blogspot.com/#home
[예시 2 : vue playground] https://play.vuejs.org/#eNp9kUFLwzAUx7/KM5cqzBXZbXQDlYF6UFHBSy6je+sy0yQkL3NQ+t19SdncYezW9//9X/pL24l758a7iGIqqlB75QgCUnRzaVTrrCfowOMaelh720LB1UIaaWprAkEbGpglfl08odYWvq3Xq6viRpqqHI7jg3ggbJ1eEvIEUG3u5l2Xl/u+KnnKqTIuEuxuW7tCPZOCuRRQMqzKk30xEhT49WvVjLfBGjbv0r4UtW2d0ujfHCnWk2IKmSS2ZLvfl5yRjzg65PUG658z+TbsUybFu8eAfodSHBktfYM04MXnK+75+QjZPmpuX4AfGKyOyXGoPUSzYu2TXrZ9zt9fmeYrLPaEJhwulURTs899KfifPF64+r/uZDzJe9L0ov8DExSnNA==
[예시 2 : vue playground] https://play.vuejs.org/#eNp9kUFLwzAUx7/KM5cqzBXZbXQDlYF6UFHBSy6je+sy0yQkL3NQ+t19SdncYezW9//9X/pL24l758a7iGIqqlB75QgCUnRzaVTrrCfowOMaelh720LB1UIaaWprAkEbGpglfl08odYWvq3Xq6viRpqqHI7jg3ggbJ1eEvIEUG3u5l2Xl/u+KnnKqTIuEuxuW7tCPZOCuRRQMqzKk30xEhT49WvVjLfBGjbv0r4UtW2d0ujfHCnWk2IKmSS2ZLvfl5yRjzg65PUG658z+TbsUybFu8eAfodSHBktfYM04MXnK+75+QjZPmpuX4AfGKyOyXGoPUSzYu2TXrZ9zt9fmeYrLPaEJhwulURTs899KfifPF64+r/uZDzJe9L0ov8DExSnNA==
아래는 Javascript에서 현재 URL의 해시값을 얻는 예제 입니다.
1 2 3 4 | window.location.hash; let temp = new URL(window.location.href) temp.hash; |
0 댓글