URL을 통해 값 전달하기
- data 전달하기
- Form
- request의 body를 통해 전달
- POST 메서드 사용
- request line + header + body(payload)
- URL
- 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
를 값으로 저장
- 그 값을 브라우저에 전송
- 절차
- 식별자 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">
.FormFile
- 사용자가 제출한 파일을 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이든 상관 없이 일시적으로 다른 위치로 리다이렉션 함
- 항상 메서드를 유지
- 새로운 위치에 게시하고 싶을 때만 사용(제한적)
- 실습
/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
에 접속
/
로 리다이렉션
- 다시
/bar
에 접속
- 서버를 거치지도 않고
/
로 이동
- 브라우저가 새로운 위치를 기억
http.Redirect
- 인자로 ResponseWriter, *Request, 이동할 위치와 응답 코드를 받는다
- 응답 헤더를 자동으로 설정한다
Cookie
- 쿠키
- 클라이언트가 허용할 경우, 서버가 클라이언트 컴퓨터에 사용할 수 있는 정보를 저장하는 파일
- 웹 사이트에 접속할 때, 웹 사이트가 있는 서버에 의해 사용자의 컴퓨터에 저장되는 정보
- 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보다 크다면 일정 시간동안 지속
- 여러 개의 쿠키를 설정할 수도 있다
- 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
에 전송되면 그 상위 경로인 /
에서는 접근할 수 없다