iOS-Children-Study / Growth-Study

성장로드맵 체크포인트 기반 스터디 레포입니다.
1 stars 0 forks source link

정영오_1101 #17

Open ghost opened 11 months ago

ghost commented 11 months ago

HTTP와 HTTPS의 연결 방식의 차이와 효과

HTTP

HTTP 는 HyperText Transfer Protocol 의 약자로 HyperText 문서를 주고 받기 위해 만들어졌고, 최근에는 HTML뿐 아니라 모든 웹 관련 API 통신에 이용하고 있는 통신 프로토콜입니다. HTTP 프로토콜은 비연결성(Connectionless)과 무상태성(Stateless)의 특징을 가지는 통신 프로토콜입니다.

HTTPS

HTTPS 는 Hypertext Transfer Protocol Secure 의 약자로 간단히 HTTP 의 보안 버전입니다. HTTP 프로토콜의 최상위에 SSL/TLS 암호화를 구현합니다. 일반 HTTP 프로토콜은 서버에서부터 Client 로 전송되는 정보가 암호화되지 않아 데이터가 쉽게 도난당할 수 있다는 문제가 있습니다. HTTPS 프로토콜은 HTTP + 암호화 + 증명서 + 완전성 으로 HTTP의 보안적 약점을 보완한 프로토콜입니다.

HTTP vs HTTPS

보안 (Security):

인증 (Authentication):

SEO (Search Engine Optimization):

브라우저 표시 (Browser Display):

URLSession 을 이용한 RESTful API 연동

1. URLComponents 를 이용한 URL 객체 생성

var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/apiName"
urlComponents.queryItems = [
    URLQueryItem(name: "page", value: "1")
]

if let url = urlComponents.url {
    // URL: https://www.example.com/api/v1/apiName?page=1
    print("URL: \(url)")
}

2. URLRequest 객체 생성

var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정

// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")

// HTTP 바디 설정
let body = [
    "title": "example title",
    "body": "example body"
] as [String: Any]

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
    print("Error creating JSON data")
}

3. URLSession 객체를 이용하여 요청 및 응답 처리

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 201 {
        do {
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                print("JSON Response: \(json)")
            }
        } catch {
            print("Error parsing JSON response")
        }
    } else {
        print("Unexpected error")
    }
}

// 작업 시작
task.resume()

GET 과 POST 의 차이

GET

POST

요약

GET은 데이터 검색 및 조회에 사용되며, URL에 노출되어 데이터가 제한적이며 캐싱 가능합니다. 반면에 POST는 데이터 변경 및 서버에 대규모 데이터를 안전하게 전송하는 데 사용되며, URL에 노출되지 않으며 캐싱되지 않습니다. 선택은 사용 사례와 보안 요구 사항에 따라 달라집니다.

HTTP 상태 코드

HTTP 상태 코드(HTTP status code)는 웹 서버가 클라이언트에게 보내는 3자리 숫자로 된 응답 코드입니다. 이 코드는 HTTP 요청의 결과를 나타내며, 클라이언트에게 요청 처리 과정에 대한 정보를 전달합니다.

1xx (Informational - 정보)

2xx (Successful - 성공)

3xx (Redirection - 리디렉션)

4xx (Client Error - 클라이언트 오류)

5xx (Server Error - 서버 오류)

여러 개의 파일을 POST로 한 번에 업로드하는 방법

Multipart

Multipart 는 다중 부분으로 이루어진 데이터 형식을 나타냅니다. HTTP 프로토콜을 통해 데이터를 전송할 때 여러 종류의 데이터를 함께 전송하기 위해 사용되며, 파일 업로드, 웹 양식 데이터 전송 등에서 흔히 사용됩니다. Multipart 데이터 형식은 각 부분이 별도의 데이터 덩어리로 구분되고, 각 부분에는 해당 데이터의 종류, 길이, 이름 등의 정보가 포함됩니다. Multipart 형식을 사용할 때 아래와 같은 특징이 있습니다.

Multipart

Multipart Form Data 전송 구현

let url = URL(string: "https://example.com/upload")

var request = URLRequest(url: url!)
request.httpMethod = "POST"

let uniqString = UUID().uuidString

let contentType = "multipart/form-data; boundary=\(uniqString)"
request.setValue(contentType, forHTTPHeaderField: "Content-Type")

// 폼 데이터 생성
var body = Data()

// 멀티 파트 데이터의 구분자(boundary)
body.append("--\(uniqString)\r\n".data(using: .utf8)!)

// 멀티 파트 데이터의 파트에 대한 헤더를 추가: name 파라미터를 "image"로 설정하고, 업로드된 파일의 원래 이름을 "image.jpg"로 설정
body.append("Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n".data(using: .utf8)!)

// 업로드된 파일의 MIME 타입을 명시
body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)

// 실제 이미지 바이너리 데이터를 담고있는 값 추가
body.append(imageData)

// 각 파트 사이에 빈 줄을 추가하여 파트를 구분하며 멀티파트 데이터의 각 파트를 구분하는 구분자 역할
body.append("\r\n".data(using: .utf8)!)

// 멀티파트 데이터의 끝을 나타내는 경계값을 추가하며 멀티파트 데이터의 마지막을 나타내고 파트들을 닫는 역할
body.append("--\(uniqString)--\r\n".data(using: .utf8)!)

// 전송
let task = URLSession.shared.uploadTask(with: request, from: body) { (data, response, error) in
    // completion
}

task.resume()