정상우
hELLO.
정상우
전체 방문자
384,511
오늘
130
어제
1,174
  • hELLO. (121)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (20)
      • 에세이 (4)
      • 개발자스럽게 살기 (14)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • 개발
  • go
  • 블록체인
  • 프로그래머스
  • 포트폴리오
  • php
  • 코딩테스트
  • 라라벨
  • Algorithm
  • 개발 리뷰

최근 댓글

  • 고맙습니다 ~^^
    정상우
  • 오늘 블로그 만들었는데 검색하⋯
    엥뿌삐
  • 좋은 스킨 정말 감사드립니다.⋯
    이태홍
  • 고맙습니다 ㅎㅎ
    정상우
  • 제가 원하던 최고의 스킨입니다⋯
    _HEON

최근 글

  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯
  • [Laravel] 카페24 호스팅에 라⋯
    2022.03.29
    [Laravel] 카페24 호스팅에 라⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/Go

Go: path vs path/filepath

2020. 12. 17. 19:17

path vs path/filepath

Go 에서 경로를 핸들링 할 수 있는 패키지에는 path, path/filepath 패키지가 있다. 이 둘은 쓰임새가 달라서 조심씨 사용하여야 하는데, 둘이 경로라는 대상을 다루지만, 실은 핸들링하는 대상이 다르다. 결론부터 말하자면 path 는 HTTP, FTP 경로 등 논리적인 경로를 핸들링한다, 즉 슬래쉬로 구분되는 경로에 대해서 다루며, 반면 path/filepath 패키지는 이름 그대로 실질적인 파일 경로를 취급하게 된다. Windows 같은 경우에는 C:\ 등으로 파일 경로가 시작되기도 하기 때문에 각별히 주의해야 할 필요가 있다.

 

data/hello.txt 파일에는 Hello, Go! 라는 텍스트가 입력되어 있다고 가정하고, 아래의 코드를 살펴보자. 파일을 열고 읽어들여 콘솔에 출력을 하는 것이 전부인데, 우리가 주목해서 보아야 하는 것은 바로 input, filepath.Base() 부분이다.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"path/filepath"
)

func main() {
	input := "hello.txt"
	p := filepath.Join("./data", filepath.Base(input))

	b, err := ioutil.ReadFile(p)
	if err != nil {
		log.Fatal(err)
	}

	// -> Hello, Go!
	fmt.Println(string(b))
}

input 변수에는 읽어들일 파일의 이름이 담겨있다. 하지만 만약 input 의 값이 ..\\main.go 처럼 된다면 어떨까? filepath.Base() 함수는 경로의 마지막 부분을 반환하기 때문에 우리가 기대하는 값은 ./data/main.go 이며 실제로 해당 경로의 파일을 읽으려고 시도한다. 하지만 아래의 이를 path.Base() 로 바꾸게 되면 놀랍게도 ..\\main.go 의 내용을 읽을 수 있게 된다.

// ...

func main() {
	input := "..\\main.go"
	p := filepath.Join("./data", path.Base(input))

	// ...
}

왜 이 둘을 구분하여야 하는가?

path 패키지의 설명을 보면 아래와 같이 나와있다. 즉, path 패키지는 위에서 언급한 것처럼 오직 슬래시로 구분되는 경로에 대해 취급해야 하며 Windows 에서 취급되는 역슬래시를 다루지 않는다고 하니까 그런 용도로는 하지말고, path/filepath 를 사용하라고 하고 있다.

Package path implements utility routines for manipulating slash-separated paths.

The path package should only be used for paths separated by forward slashes, such as the paths in URLs. This package does not deal with Windows paths with drive letters or backslashes; to manipulate operating system paths, use the path/filepath package.

따라서 우리는 파일 시스템에 대한 경로를 다루려면 반드시 path/filepath 패키지를 사용하자. path 패키지를 사용함으로써 발생하는 문제점은 파일 업로드 공격과 파일 다운로드 공격에 대해 보안 취약점을 드러내기 때문에 이를 웹서버에서 사용하게 되면 큰 문제가 될 수 있다. 

    '언어 & 프레임워크/Go' 카테고리의 다른 글
    • Go: 싱글 바이너리로 웹 서비스 제공하기 (go-bindata)
    • Go: 개발 환경과 도구, 크로스 컴파일
    • Go: flag 패키지로 CLI 도구 만들기
    • Go: Go 답게 코드 작성하기
    FilePath, go, PATH
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    다음 글
    프로그래밍 언어를 선택하고 공부하기 위한 팁, ― 개발자가 되고 싶은 당신에게
    이전 글
    Go: flag 패키지로 CLI 도구 만들기
    • 이전
    • 1
    • ···
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • ···
    • 121
    • 다음

    티스토리툴바