[GO] 상태 생성

타키탸키·2022년 11월 14일
0

GO-WEB

목록 보기
6/11
post-custom-banner

URL을 통해 값 전달하기

  • data 전달하기
    • Form
      • request의 body를 통해 전달
      • POST 메서드 사용
      • request line + header + body(payload)
    • URL
      • GET 메서드 사용
    • POST 및 PUT body 매개변수는 url 쿼리 문자열 값보다 우선 순위
  • URL 구조
    • protocol[https]
    • subdomain[video]
    • domain name[google.co.kr]
    • port[80]
    • path[videoplay]
    • query[?]
    • parameters[docid=-7846411354845&hl=en]
      • 식별자 사용 시, 여러 값 가짐
      • docid와 hl을 &으로 묶음
    • fragment[#00h02m30s]
https://video.google.co.kr:80/videoplay?docid=-7846411354845&hl=en#00h02m30s
  • 앵커 태그
    • <a>
    • 바다(네트워크) 위를 떠다니는 배(사용자)가 정박할 수 있도록 좌표(주소/url)를 가리키는 역할 수행
    • url을 기준으로 link를 만드는 태그
    • 페이지 연결을 위해 사용
    • 연결 대상이 되는 페이지는 href 속정을 통해 정의
      • <a href="https://video.google.co.kr"></a>
  • UUID
    • 네트워크 상에서 고유성을 보장하는 ID를 만들기 위한 표준 규약
    • 32개의 16진수로 구성됨
    • 5개의 그룹으로 표시됨
    • 각 그룹은 붙임표(-)로 구분
    • 데이터베이스의 primary key로 종종 사용
    • UUID를 각 링크에 동적으로 삽입하여 해당 링크의 값으로 활용
    • 클릭하는 모든 링크에는 값이 있고 그 값이 서버로 돌아옴
280a8a4d-a27f-4d01-b031-2a003cc4c039
  • FormValue
    • url과 form으로부터 값을 불러오는 함수
    • 인자로 넘긴 식별자가 존재할 때, 그 값을 반환
    • 쿼리의 구성 요소로 지정된 첫 번째 값 반환
    • 필요 시, Parse를 호출하고 반환된 오류 무시
    • key가 없으면 빈 문자열 반환
    • 예시
      • url에 값 입력(?q=dog)
      • FormValue가 q에 대한 값인 dog를 값으로 저장
      • 그 값을 브라우저에 전송

Form으로부터 값 전달하기

  • 절차
    • 식별자 q가 있는 FormValue 요청
      • 식별자가 없으면 빈 문자열 반환
    • HTML의 응답에 대한 header 설정(.Header().Set())
    • form 메서드를 POST로 설정
      • form(request body)을 통해서 data 전송
      • 식별자 q에 대한 값이 저장하여 브라우저에 띄운다
    • form 끝에 값 추가
      ▼▼▼
    • form 메서드를 GET으로 설정
      ▼▼▼
      • URL로 값이 넘어가서 서버의 FormValue의 반환값이 된다
  • <input type="submit"> vs. <button>
    • 기능적으로 동일
    • button 요소는 type 속성을 명시하지 않으면 submit 기능 수행
      • submit이 button의 속성값
      • 폼의 전송 기능 담당
    • button이 속성일 경우, JS를 이용한 기능 구현에 많이 사용

서버에 파일 업로드, 읽기, 생성하기

  • 파일 업로드
    • 사용자가 파일을 업로드할 폼 필요
    • <input type="file">
      • choose file 버튼
  • .FormFile
    • 사용자가 제출한 파일을 catch하기 위해 사용
      • catch: 오는 것을 잡음
    • 식별자 사용
    • MultiPart.File
      • io.Reader, io.ReaderAt, io.Seeker, io.Closer
    • io.Seeker
      • 재생 헤드
  • 파일 생성
    • os.Create
      • 파일 경로(이름)을 인자로 받는다
      • 사용자가 넘긴 파일의 header를 통해 이름을 얻는다
    • 생성되는 target 파일 스트림에 대한 종료를 지연시킨다
    • .Write
      • 파일에 읽어온 내용을 적는다
  • enctype
    • application/x-www-form-urlencoded
      • 기본 enctype
      • 앰퍼샌드(&)로 구분된 키-값 쌍 제공
      • POST가 포함된 body를 살펴볼 때, url이 기본값으로 코딩되지 않도록 설정
    • multipart/form-data
      • <form> 요소가 파일이나 이미지를 서버로 전송할 때 주로 사용
      • 이 옵션을 사용하지 않으면 파일 내용 없이 파일 경로만 서버에 전송된다
    • text/plain
      • 공백 문자를 제외한 나머지 문자는 모두 인코딩되지 않는다
      • 표준 기관에서 디버깅 시에만 사용할 것을 권고
  • slice
    • make(타입, 사이즈)
    • 사이즈의 값은 길이와 용량을 설정하는 데 사용된다
    • 사이즈에 인자를 두 개 받을 수 있다
      • 첫번째는 초기화된 슬라이스 크기 설정
      • 두번째는 기본 배열의 크기 설정

Redirection

  • 리다이렉션
    • 요청을 한 위치에서 다른 위치로 전송 하는 것
    • 클라이언트는 서버에 요청할 때 url이라는 특정 리소스를 요청
      • 해당 위치에 있는 리소스 제공 요청
    • 상태 코드 300번대
    • ex:) A라는 페이지를 요청했는데 url이 b라는 페이지로 변경된 경우
  • 301, MovedPermanently
    • 요청된 리소스가 Location 헤더에 주어진 url로 완전히 이동되었다는 것을 의미함
    • 브라우저는 새 페이지로 리다이렉트
      • 301 응답을 받으면, 새 주소를 기억하여 그 주소로만 접근
      • 서버에 닿기도 전에 브라우저가 알아서 바뀐 주소로 접근
      • 이를 막으려면 캐시를 비워야 한다
    • 검색 엔진은 해당 리소스로 연결되는 링크 갱신
    • 원 콘텐츠가 새로운 url로 옮겨졌다
  • 302, Found
    • 요청된 리소스에는 새로운 url이 지정되어 있기 때문에 이후로는 새 url을 사용해야 한다는 것을 의미함
    • header에 새 url 첨부
    • 301과 유사하지만 일시적인 이동을 한다는 점에서 차이가 있다
    • 원본 요청을 다른 위치에 보존
    • 처리가 모호하여 주로 303과 307을 대신 사용
  • 303, SeeOther
    • 요청에 대한 리소스는 다른 url에 있기 때문에 GET 메서드를 사용해서 얻어야 한다는 것을 의미함
    • 리다이렉션 위치를 GET 메서드를 통해 얻어야 한다
    • 항상 메서드를 GET으로 바꾼다
    • 가지고만(GET) 올 뿐 수정하지(POST) 않는다
    • 주로 307보다 303이 활용됨(90%)
  • 307, Temporary Redirect
    • 임시로 페이지를 리다이렉트 함
    • 메서드가 POST든, GET이든 상관 없이 일시적으로 다른 위치로 리다이렉션 함
    • 항상 메서드를 유지
      • POST이면 그대로 POST
    • 새로운 위치에 게시하고 싶을 때만 사용(제한적)
  • 실습
    • /barred에 접속하여 데이터 제출
    • /bar에 POST 요청이 전송
      • 응답 헤더에 location을 /로 설정
      • 응답 헤더를 303으로 설정
    • /로 리다이렉션
      • 메서드는 GET으로 변경
      • 307 응답 시 결과(method 유지)
func foo(w http.ResponseWriter, req *http.Request) {
	// 303 request method - always GET
	fmt.Print("Your request method at foo: ", req.Method, "\n\n")
}

func bar(w http.ResponseWriter, req *http.Request) {
	// post
	fmt.Println("Your request method at bar:", req.Method)
	// process form data
	w.Header().Set("Location", "/")    // location in response header
	w.WriteHeader(http.StatusSeeOther) // 303
}

func barred(w http.ResponseWriter, req *http.Request) {
	fmt.Println("Your request method at barred:", req.Method)
	// submit form to bar
	tpl.ExecuteTemplate(w, "index.gohtml", nil)
}
  • 실습 2
    • /bar에 접속
      • GET 요청
    • /로 리다이렉션
    • 다시 /bar에 접속
      • 서버를 거치지도 않고 /로 이동
      • 브라우저가 새로운 위치를 기억
  • http.Redirect
    • 인자로 ResponseWriter, *Request, 이동할 위치와 응답 코드를 받는다
    • 응답 헤더를 자동으로 설정한다
      • Location
      • 응답 코드

  • 쿠키
    • 클라이언트가 허용할 경우, 서버가 클라이언트 컴퓨터에 사용할 수 있는 정보를 저장하는 파일
    • 웹 사이트에 접속할 때, 웹 사이트가 있는 서버에 의해 사용자의 컴퓨터에 저장되는 정보
      • ex:) 로그인 정보, 장바구니 정보, ...
    • 쿠키 쓰기를 허용하지 않더라도 상태 생성은 가능하다
    • 클라이언트가 서버에 요청할 때마다 쿠키를 함께 보낸다
  • 쿠키의 고유한 ID
    • 쿠키의 존재 여부를 알 수 있다
    • 특정 사용자와의 연관성을 알 수 있다
    • 특정 사용자의 애플리케이션 상태를 알 수 있다
    • 페이지의 모든 링크에 추가 가능
  • 쿠키의 작동 방식
    • 도메인이 쿠키 작성
      • 도메인에 따라 쿠키 지정
    • 브라우저가 해당 도메인에 다시 요청 시, 그 도메인에 해당하는 쿠키가 있는지 확인
    • 쿠키가 있으면, 그 도메인으로 해당 쿠키 전송
      • 각 도메인에 맞는 쿠키만을 전송
  • 쿠기가 필요한 이유
    • 인터넷 통과 시, https를 사용하여 클라이언트가 서버로 보내는 모든 내용을 암호화
      • 쿠키, url의 고유 식별자, 사용자 정보, ...
      • 컴퓨터에 도달하면 복호화
      • 재전송 시, 암화화
    • url의 고유 ID는 클라이언트 브라우저와 URL 표시줄에 암호화되지 않은 상태로 표시
      • 해킹 위험
  • .SetCookie
    • http 패키지 메서드
    • ResponseWriter와 쿠키에 대한 포인터(구조체)를 인자로 받음
    • 응답 header에 Set-Cookie header를 추가하는 함수
    • 쿠키는 반드시 유효한 이름을 가져야 한다
      • 그렇지 않으면 해당 쿠키는 무시된다
    • 쿠키는 key-value의 형태를 가진다
      • key에는 Name이 value에는 Value가 저장된다
      • 두 값 모두 string이다
    • Path는 쿠키를 전송할 요청 경로를 의미한다
    • MaxAge는 쿠키가 지속되는 시간을 의미한다
      • 0보다 작으면 즉시 쿠키를 삭제한다는 것을 의미
      • 0보다 크다면 일정 시간동안 지속
    • 여러 개의 쿠키를 설정할 수도 있다
      • Name을 다르게 지정
    • Value를 갱신하려면 Cookie struct를 바꾸는 것이 아닌 c.Value로 접근해야 한다
  • .Cookie
    • Request의 메서드
    • 반환값으로 쿠키(key-value)와 에러를 받는다
    • name을 가진 쿠키가 없을 경우 http.ErrNoCookie를 반환
      • http: named cookie not present
  • 쿠키 확인하기
    • 크롬 기준
    • 개발자 도구 - application - Cookies
  • Cookie 타입의 Path 필드
    • Path 필드를 설정하지 않으면 쿠키를 설정한 위치의 상위 경로로 자동 설정된다
      • ex:) 쿠키 설정 위치가 /user이면 /로 전송
      • ex:) 쿠키 설정 위치가 /user/goofy이면 /user로 전송 => /는 해당하지 않음
    • Path의 적용 범위는 하위 경로까지이다
      • ex:) 쿠키가 /에 전송되면 그 하위 경로는 모두 쿠키에 접근 가능하다
      • ex:) 쿠키가 /users에 전송되면 그 상위 경로인 /에서는 접근할 수 없다
profile
There's Only One Thing To Do: Learn All We Can
post-custom-banner

0개의 댓글