반응형

↓↓↓ 이전내용

2024.01.05 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (7) - JUnit TEST service 계층 test 예제

 

[REST API] Spring Boot로 REST API CRUD 간단 구현 (7) - JUnit TEST service 계층 test 예제

↓↓↓ 이전 내용 2023.12.30 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (6) - JUnit TEST 기본 설정 및 repository 계층 test 예제 [REST API] Spring Boot로 REST API CRUD 간단 구현 (6) - JUnit TEST

im-gonna.tistory.com

 

이전 내용에 이어서 이번에는 최상단 layer인 Controller의 test를 진행해보자.

 

main에 있는 controller class 이름에 ctrl+shift+t를 눌러서 test 클래스를 자동 생성해준다.

 

💡 Controller test class

 

import 되어있는 jupiter assertion은 제거한다. (이전에 설명했지만 기본 assertion 사용!)

 

  • 클래스 어노테이션 추가

외부 data와 직접 상호작용하는 계층이기 때문에 test class에 어노테이션을 추가해준다.

 

그리고 컨트롤러 클래스를 인자로 가져온다.

 

  • mockMvc 주입

 

web layer url test이기 때문에, 모의 MVC가 필요하다.

따라서 MockMvc 객체를 하나 선언하여 사용한다.

 

  • 필요한 객체 선언

controller 레이어는 service 레이어와 통신하기 때문에 모의 service를 만들어주어야 한다.

그리고 cloudvendor 인스턴스 2개를 각각 만들어 주고, 이들을 담을 리스트로 하나 선언해준다.

 

  • setUp 메서드

 cloudVendorOne 인스턴스와 cloudVendorTwo 인스턴스를 생성해주고, list에 담아준다.

 

 

  • getCloudVendorDetails()의 test 메서드

  • controller에 정의된 getCloudVendorDetails()의 로직을 보면, cloudVendorService의 getCloudVendor()를 호출한 결과를 반환한다.
  • 따라서 cloudVendorService의 getCloudVendor()에 cloudVendorId가 1로 전달하며, 이 메서드를 호출하면 cloudVendorOne을 return하여 성공적으로 보이도록 한다.
  • 그리고 mockMvc의 perform메서드를 통해 get 동작을 수행하도록 하고 url은 controller에서 지정한대로 cloudVendorId에 따라 달라지므로, /cloudvendor/1 로 가져오도록 한다.
  • andDo(print()): 이 메서드는 테스트 결과를 출력한다. 테스트가 실행될 때 컨트롤러가 반환하는 HTTP 응답 등의 정보를 콘솔에 출력하여 디버깅이나 테스트 결과 확인을 도와준다.
  • andExpect(status().isOk()): 이 메서드는 특정한 조건을 검증하는데, 여기서는 HTTP 응답의 상태 코드가 "200 OK"인지 확인한다. 만약 상태 코드가 200이 아니면 테스트는 실패하는 것이다.
  • 여기까지하면, perform get에서 빨간 줄이 쳐질 것이다. 예외처리가 필요하다. 메서드에 throws Exception을 추가해주자.

getCloudVendorDetails test 결과

 

테스트 결과 성공이다.

getCloudVendorDetails()의 test를 위해 모의(mock) http 서블릿 요청이 제대로 구축되는 것을 확인할 수 있다.

(이는 마치 레포지토리 레이어에서 내장된 데이터베이스 h2를 사용하는 것과 유사한 상황이다)

파라미터와 헤더는 아무것도 필요로 하지 않았다.

 

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = {"data":{"vendorId":"1","vendorName":"Amazon","vendorAddress":"USA","vendorPhoneNumber":"xxxxx"},"httpStatus":"OK","message":"Requested Vendor Details are given here"}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

그 아래 더 내려서 response 부분을 보면, status는 200, 에러 사항 없음, body data에 controller에서 반환하는 CloudVendorOne에 대한 data가 담겨져 있는 것을 확인할 수 있다.

 

 

  • getAllCloudVendorDetails()의 test 메서드

  • 앞의 get메서드와 로직은 유사하나, service 메서드를 getAll로 수정해주고, 가져오는 단위가 list이기 때문에, 초기에 설정해주었던 cloudVendorList를 return하도록 한다.
  • 모든 cloudVendor를 가져올 때에는 기본 url을 사용하기 때문에, /cloudvendor로 mapping되도록 한다. 

getAllCloudVendorDetails test 결과

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = [{"vendorId":"1","vendorName":"Amazon","vendorAddress":"USA","vendorPhoneNumber":"xxxxx"},{"vendorId":"2","vendorName":"GCP","vendorAddress":"UK","vendorPhoneNumber":"yyyyy"}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

body를 보면 one, tow 모두 값을 가져오는 것을 확인할 수 있다.

 

 

  • deleteCloudVendorDetails()의 test 메서드

  • controller의 delete 메서드 로직을 보면, service의 delete메서드를 호출하고, 이 안에서는 Success 메시지를 반환하도록 되어있다.
  • 따라서 cloudvendorId가 1인 cloudvendor를 delete하도록 service 메서드가 호출되면, Success를 return하도록 하여, service의 delete 메서드 호출을 성공적으로 보이게 한다.
  • 그리고 mockMvc의 perform을 통해 delete mapping시 url은 /cloudvendor/1에 매핑되도록 한다.

deleteCloudVendorDetails test 결과

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"33"]
     Content type = text/plain;charset=UTF-8
             Body = Cloud Vendor Deleted Successfully
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

response의 body를 보면 controller의 해당 메서드에서 반환하는 값인 메시지를 반환하는 것을 확인할 수 있다.

 

 

  • createCloudVendorDetails()의 test 메서드

 

  • controller에서 create메서드 로직을 살펴보면, cloudVendorService의 create메서드를 호출한다. 그 메서드 안에서는 success를 return한다.
  • 따라서 create메서드가 호출되면 Sucess를 return하도록 한다.
  • perform의 post mapping 시 /cloudvendor url과 mapping되도록 한다.
  • 그런데, 내용으로 전달되는 data를 json형식으로 전달하여야 하기 때문에, contentType을 json으로 지정해준다.
  • 그런데, cloudvendor는 entity이기 때문에, json형식으로 바꾸어주기 위해 위 코드를 작성해준다.
  • json 형식의 cloudvendor를 requestJson에 저장해주고, requestJson을 content에 넣는다.

createCloudVendorDetails test 결과

 

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"33"]
     Content type = text/plain;charset=UTF-8
             Body = Cloud Vendor Created Successfully
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

response의 body를 보면 controller의 해당 메서드에서 반환하는 값인 메시지를 반환하는 것을 확인할 수 있다.

 

 

  • updateCloudVendorDetails()의 test 메서드

  • 앞의 create 메서드와 로직이 유사하기 때문에, service 메서드의 create를 update로 변경하고, perform메서드는 post를 put으로 변경한다.

updateCloudVendorDetails test 결과

 

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"33"]
     Content type = text/plain;charset=UTF-8
             Body = Cloud Vendor Updated Successfully
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

역시 response의 body에는 controller의 해당 메서드에서 반환하는 값인 메시지를 담고 있다.

 

모든 unit test를 마쳤으므로, 전체 test class의 test coverage를 확인해보자.

 

controller의 test coverage 결과

test coverage가 100% 인것을 확인하였다.

 

summery

 

 

↓↓↓ 다음 내용

2024.01.25 - [Web Application/Backend] - [REST API] Spring Boot로 REST API 프로젝트 (9) - Swagger로 api document 생성하기

 

[REST API] Spring Boot로 REST API 프로젝트 (9) - Swagger로 api document 생성하기

↓↓↓이전내용 2024.01.10 - [Web Application/Backend] - [REST API] Spring Boot로 REST API 프로젝트 (8) - JUnit TEST controller 계층 test 예제 [REST API] Spring Boot로 REST API 프로젝트 (8) - JUnit TEST controller 계층 test 예제 ↓

im-gonna.tistory.com

반응형
반응형

↓↓↓ 이전 내용

2023.12.30 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (6) - JUnit TEST 기본 설정 및 repository 계층 test 예제

 

[REST API] Spring Boot로 REST API CRUD 간단 구현 (6) - JUnit TEST 기본 설정 및 repository 계층 test 예제

↓↓↓ 이전 내용 2023.12.15 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (5)-사용자 정의 ResponseEntity [REST API] Spring Boot로 REST API CRUD 간단 구현 (5)-사용자 정의 ResponseEntity 이전 내

im-gonna.tistory.com

 

지난 시간 repository 계층의 test를 수행했다.

이번에는 service 계층의 test를 수행하겠다.

 

💡 Service layer test 클래스 자동 생성하기

 

직접 디렉토리를 생성하고 test 클래스를 작성해도 되지만, service 클래스에서 "create test" 버튼 하나로 test 클래스를 바로 생성할 수 있다.

 

create test를 누르면 다음과 같은 창이 뜬다.

 

JUnit5는 기본으로 설정되어 있으며, test class 이름도 알아서 지정해 주는데, 적절해 보이므로 그대로 사용할 것이다.

마찬가지로 설정/해제 메서드를 추가해준다. setUp과 tearDown에 해당한다.

그리고 class의 모든 메서드에 대한 단위 test를 위해 모두 ✔ 하여 추가해준다.

 

 

OK버튼을 누르면, 위와같이 test 디렉토리 하에 repository와 병렬하게 service 단이 생성되었고, 그 안에 test 클래스도 잘 생성되었다.

 

💡 CloudVendorService test 코드 작성하기

 

클래스를 들여다 보면, jUnit Jupiter assertion이 import되어 있는데, 우리는 저번 시간과 동일하게 기본 assertion을 사용할 것이기 때문에 이 부분은(이미 주석처리 되어있지만) 지워준다.

 

우리는 arg.com에서 제공하는 assertion 라이브러리를 사용할 것이다.

 

 

  • Mock 객체 생성하기

 

서비스 계층이 데이터베이스와 직접적으로 통신해서는 안되기 때문에, 데이터베이스 응답을 얻으려면 repository layer를 moking해야 한다. 이 말은 repository 클래스의 객체를 mock object (모의 객체)로서 생성하여 사용함으로써 데이터를 사용한다는 것이다.

 

가상 객체라고 생각하면 된다.

 

따라서 CloudVendorRepository의 경우 mock 객체로서 사용한다.

 

autoCloseable 객체를 사용하는 이유는 리소스를 자동 해제하는 기능으로서 자원을 안전하게 사용하기 위함이다.

 

 

  • 설정 메서드 setUp()

 

클래스 실행 시 전체 클래스에 대한 mock이 자동으로 열리도록 한다. 이는 Mockito의 openMocks 메서드를 사용한다.

그리고 repository test에서와 동일하게, service 객체와 cloudVendor 객체를 생성해준다.

 

  • 해제 메서드

해제 시에는 autoCloseable을 close해주면 된다.

 

  • create 메서드에 대한 test

  • cloudvendor와 repository에 대해서 mock 객체를 선언해준다.
  • when 메서드를 사용해서 cloudvendorrepository의 save메서드를 호출하였을 때 cloudvendor를 return하도록 하여, 저장이 성공한 것처럼 보이도록 설정한다.
  • asserthat 메서드를 통해 실제 service 클래스의 create 메서드를 호출한 결과가 Success와 같은지 확인한다.
  • 결과가 true이면 test가 통과된다. 

createCloudVendor()의 unit test 결과

 

 

  • update 메서드에 대한 test

    • update 메서드는 앞선 create와 유사하므로 실제 service 클래스에서 호출하는 메서드를 update로만 바꾸어 주면 된다.
    • 이 역시 호출결과가 Success를 반환하면 test 통과이다.

updateCloudVendor()의 unit test 결과

 

  • get 메서드에 대한 test

  • mock 객체를 생성한다.
  • when 메서드를 사용해서 cloudvendorrepository의 findById메서드를 호출하였을 때, cloudvendor를 return하도록 하는데, 이때 find결과가 있을수도 없을 수도 있으므로 optional로 nullable을 설정해준다.
  • asserthat 메서드를 통해 실제 service 클래스의 get 메서드를 호출하여 그 cloudvendor의 name과 클래스에서 선언한 cloudvendor의 name이 동일한지 확인한다.
  • 결과가 true이면 테스트는 통과이다.

getCloudVendor()의 unit test 결과

 

  • get all 메서드에 대한 test

  • 앞선 get메서드와 로직은 비슷하나, all 이므로 list단위로 반환한다는 차이가 있다.
  • 따라서 리스트 중 첫번째 cloudVendor의 phoneNumber를 비교하도록 한다.
  • 결과로 true를 반환하면 test는 통과이다.

getAllCloudVendor()의 unit test 결과

 

  • delete 메서드에 대한 test

  • 이 메서드의 test에서는 mock을 생성할 때, 실제로 repository 클래스의 메서드를 사용할 수 있도록 설정해준다.
  • 이를 위해서 Mokito의 CALLS_REAL_METHODS를 인자로 함께 넣어준다.
  • 또한 doAnswer를 사용해, cloudVendorRepository가 호출되었을 때 실제로 Method를 사용하도록 하고 deleteById 메서드를 호출하도록 한다.
  • asserThat으로 service의 delete메서드를 수행하고 나서 Success를 반환해야 한다.
  • 반환한다면 test는 통과한다.

deleteCloudVendor()의 unit test 결과

 

service test 클래스의 test 실행 결과 모두 통과하는 것을 확인하였다.

service 단의 모든 unit test가 성공적

 

 

test시에는 내 코드가 실제로 구현한 모든 코드를 test할 수 있는지 확인할 필요가 있다.

보통 90%이상이면 옳다고 판단한다.

IntelliJ에서는 아래와 같이 test coverage를 확인할 수 있도록 기능을 제공하고 있다. 

test coverage 확인 결과 91%

 

service class의 test coverage 확인 결과 91%가 cover되는 것을 확인하였다.

그럼 어느 부분을 cover하지 못했을까?

실제 service class의 코드를 살펴보자.

 

각 메서드마다 test가 cover된 부분은 왼쪽에 초록색 바로 표시가 된다. 

내리다 보니, getCloudVendor 메서드 쪽에서 중간에 빨간색 바를 확인하였다.

 

왼쪽을 보면 throw~ 예외처리 부분에 대한 test의 범위는 빨간색으로 표시되면서 포함되지 않은 것을 확인할 수 있다.

 

이렇게 test covergae를 통해서 내가 짠 test 코드가 실제로 구현의 어느 부분까지 cover할 수 있는지 확인 가능하다.

 

 

오늘은 service layer의 test code를 구현해보았다.

 

다음 시간에는 Controller의 test를 구현해보자.

 

↓↓↓ 다음 내용

2024.01.10 - [Web Application/Backend] - [REST API] Spring Boot로 REST API 프로젝트 (8) - JUnit TEST controller 계층 test 예제

 

[REST API] Spring Boot로 REST API 프로젝트 (8) - JUnit TEST controller 계층 test 예제

↓↓↓ 이전내용 2024.01.05 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (7) - JUnit TEST service 계층 test 예제 [REST API] Spring Boot로 REST API CRUD 간단 구현 (7) - JUnit TEST service 계층 test 예

im-gonna.tistory.com

 

반응형
반응형
REST : 웹(HTTP)의 장점을 활용한 아키텍쳐

 

1. REST (REpresentational State Transfer) 기본

  • REST의 요소
  • method
method 의미 idemptent
POST Create No
GET Select Yes
PUT Update Yes
DELETE Delete Yes

 

** idempotent : 한 번 수행하냐, 여러 번 수행했을 때 결과가 같나?

 

  • Resource
    ✔ http://myweb/users와 같은 URI
    ✔ 모든 것을 Resource (명사)로 표현하고, 세부 Resource에는 id를 붙임

  • Message
    ✔ 메시지 포맷이 존재
    : JSON, XML 과 같은 형태가 있음 (최근에는 JSON 을 씀)
HTTP POST, http://myweb/users/
{
	"users" : {
		"name" : "terry"
	}
}

 

  • REST 특징
  • Uniform Interface (일관된 인터페이스)
    • HTTP 표준을 기반으로 하며, 특정 언어나 기술에 종속되지 않음.
    • 예를 들어, REST API가 HTTP와 JSON을 사용하여 정의되었다면, 어떤 플랫폼이든 해당 API에 접근 가능.
  • Self-Descriptive Messages (자기 서술적 메시지)
    • API 메시지 자체만으로도 그 의미를 이해할 수 있도록 설계해야 함.
    • 메시지를 보고도 어떤 리소스에 어떤 동작을 수행하는지 직관적으로 이해할 수 있어야 함.
  • HATEOAS (Hypermedia As The Engine Of Application State)
    • 응답에는 현재의 상태를 나타내는 하이퍼링크가 포함되어야 함.
    • 클라이언트는 이 링크를 통해 다음에 수행 가능한 작업을 이해하고 진행할 수 있음.
  • Statelessness (무상태성)
    • 각각의 요청은 독립적이며, 서버는 클라이언트의 상태를 저장하지 않음.
    • 이로써 서버는 간단해지고, 확장성이 높아짐.
  • Resource 지향 아키텍처 (ROA)
    • 자원(리소스)을 중심으로 하는 아키텍처
    • 각 리소스는 고유한 URI(Uniform Resource Identifier)를 가지며, 명사 형태로 정의됨.
  • Client-Server Architecture (클라이언트-서버 아키텍처)
    • 시스템을 클라이언트와 서버로 분리함으로써 각각의 역할을 명확하게.
  • Cache Ability (캐시 사용 가능)
    • 응답은 캐싱될 수 있어서, 동일한 요청에 대한 반복적인 처리를 최소화
  • Layered System (계층화 구조)
    • 시스템은 계층화될 수 있어서, 각 계층은 독립적으로 구현

  • Code On Demand (선택적 코드 전송)
    • 서버로부터 클라이언트가 실행 가능한 코드를 전송할 수 있습니다. 이는 선택 사항이며, 일반적으로는 사용되지 않음

=> REST는 자원을 중심으로 하며, 간단하고 일관된 인터페이스를 통해 클라이언트와 서버 간의 통신을 단순화하고 효율적으로 만들기 위한 웹 아키텍처

 

 

***참고
https://gyoogle.dev/blog/web-knowledge/REST%20API.html

반응형

'Web Application' 카테고리의 다른 글

HTTP status code (HTTP 상태 코드)  (0) 2023.12.28
HTTP Request Methods  (0) 2023.12.23
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형

클라우드 환경에서 HTTP API를 통해 통신하는 것이 대부분이다.

이때, 응답 상태 코드를 통해 성공/실패 여부를 확인할 수 있으므로 API 문서를 작성할 때 꼭 알아야 할 것이 HTTP status code이다.

 

  • 10x : 정보 확인
  • 20x : 통신 성공
  • 30x : 리다이렉트
  • 40x : 클라이언트 오류
  • 50x : 서버 오류

 

200번대 : 통신 성공

상태 코드 이름 의미
200 OK 요청 성공(GET)
201 Create 생성 성공(POST)
202 Accepted 요청 접수O,
리소스 처리 X
204 No Contents 요청 성공 O,
내용 없음

 

 

300번대 : 리다이렉트

상태코드 이름 의미
300 Multiple Choice 요청 URI에 여러 리소스가 존재
301 Move Permanently 요청 URI가 새 위치로 옮겨감
304 Not Modified 요청 URI의 내용이 변경 X

 

 

400번대 : 클라이언트 오류

상태코드 이름 의미
400 Bad Request API에서 정의되지 않은 요청 들어옴
401 Unauthorized 인증 오류
403 Forbidden 권한 밖의 접근 시도
404 Not Found 요청 URI에 대한 리소스 존재 X
405 Method Not Allowed API에서 정의되지 않은 메소드 호출
406 Not Accepted 처리 불가
408 Request Timeout 요청 대기 시간 초과
409 Conflict 모순
429 Too Many Request 요청 횟수 상한 초과

 

 

500번대 : 서버 오류

상태코드 이름 의미
500 Internal Server Error 서버 내부 오류
502 Bad Gateway 게이트웨이 오류
503 Service Unavailable 서비스 이용 불가
504 Gateway Timeout 게이트웨이 시간 초과

 

 

***참고

https://gyoogle.dev/blog/web-knowledge/HTTP%20status%20code.html

반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP Request Methods  (0) 2023.12.23
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형
HTTP Request Methods란?
클라이언트가 웹서버에게 요청하는 목적 및 그 종류를 알리는 수단을 말한다.

 

 

  1. GET
    URL(URI) 형식으로 서버 측에 리소스를 요청한다.
    리소스(데이터)를 받기 위함
  2. HEAD
    GET과 유사하지만, HEAD는 실제 문서 요청이 아닌 문서에 대한 정보 요청이다.
    즉, Response 메세지를 받았을 때, Body는 비어있고, Header 정보만 들어있다.
    메세지 헤더 정보를 받기 위함

  3. POST
    클라이언트에서 서버로 어떤 정보를 제출하기 위해 사용한다.
    Request 데이터를 HTTP Body에 담아 웹 서버로 전송한다.
    내용 및 파일 전송을 하기 위함

  4. PUT
    POST와 유사하나, 기존 데이터를 갱신할 때 사용한다.
    리소스(데이터)를 갱신하기 위함

  5. DELETE
    웹 서버측에 요청한 리소스를 삭제할 때 사용한다.
    (실제로 클라이언트에서 서버 자원을 삭제하도록 하진 않아 비활성화로 구성한다.)
    리소스(데이터)를 삭제하기 위함

  6. CONNECT
    보통 Proxy를 통해 SSL 통신을 하고자할 때 사용한다.
    클라이언트와 서버 사이의 중간 경유를 위함

  7. OPTIONS
    웹 서버 측에서 지원하고 있는 메소드가 무엇인지 알기 위해 사용한다.
    서버 측 제공 메소드에 대한 질의를 하기 위함

  8. TRACE
    웹 서버로부터 받은 내용을 확인하기 위해 loop-back 테스트를 할 때 사용한다.
    Request 리소스가 수신되는 경로를 보기 위함

  9. PATCH
    PUT과 유사하나, 모든 데이터를 갱신하는 것이 아닌 리소스의 일부분만 수정할 때 쓰인다.
    리소스(데이터)의 일부분만 갱신하기 위함

 

***참고
https://gyoogle.dev/blog/web-knowledge/HTTP%20Request%20Methods.html

반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP status code (HTTP 상태 코드)  (0) 2023.12.28
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형
쿠키
  • 저장 위치 
    클라이언트의 웹 브라우저가 지정하는 메모리 or 하드디스크
    (브라우저 : 크롬, 네이버웨일, edge 등과 같은 것)
  • 만료 시점
    저장할 때 expires 속성을 정의해 무효화시키면 삭제될 날짜를 정할 수 있음
  • 리소스
    클라인언트에 저장되고 클라이언트의 메모리를 사용하기 때문에 서버 자원을 사용하지 않음
  • 용량 제한
    클라이언트도 모르게 접속되는 사이트에 의하여 설정될 수 있기 때문에 쿠키로 인해 문제가 발생하는 것을 막고자 한 도메인당 20개, 하나의 쿠키 당 4KB로 제한해 둠
    1. 사용자가 웹사이트에 처음 방문하면 서버에서 클라이언트에게 쿠키(고유한 식별자)를 생성하고 전송함.
    2. 클라이언트는 받은 쿠키를 브라우저에 저장함.
    3. 이후 사용자가 같은 웹사이트를 방문할 때, 브라우저는 저장된 쿠키를 함께 서버로 전송함.
  • 예를 들어, 어떤 웹 페이지에 방문하여 로그인을 한 뒤, 동일한 웹 페이지를 방문하였을 때 로그인 상태가 유지되어 있는 이유는 브라우저가 처음에 저장한 쿠키를 두번째 방문 때 서버로 주었기 때문임! 이때 서버는 고유한 식별자로서 구분하고 이전에 로그인한 사용자임을 알아챌 수 있음!
세션
  • 저장위치
    서버의 메모리에 저장
  • 만료 시점
    클라이언트가 로그아웃하거나, 설정 시간동안 반응이 없으면 무효화 되기 때문에 정확한 시점을 알 수 없음
  • 리소스
    세션은 서버에 저장되고, 서버 메모리로 로딩 되기 때문에 세션이 생길 때마다 리소스를 차지함
  • 용량 제한
    클라이언트가 접속하면 서버에 의해 생성되므로 개수나 용량 제한이 없음
  • 세션은 서버 측에서 상태를 유지하기 위한 메커니즘임.
  • 각 세션은 고유한 식별자(session ID)로 구분되며, 이 식별자를 통해 서버는 사용자를 식별하고 해당 세션과 연결된 데이터를 유지함.
    1. 사용자가 웹사이트에 접속하면 서버는 고유한 세션 ID를 생성하고 클라이언트에게 전송함.
    2. 클라이언트는 이 세션 ID를 쿠키 또는 URL 매개변수 등을 통해 저장함.
    3. 사용자의 요청이 서버에 도달하면, 서버는 세션 ID를 사용하여 해당 세션과 연결된 데이터에 접근함.
  • 예를 들어, 클라이언트가 서버에 요청을 보낼 때, 서버는 세션 ID를 사용하여 해당 세션에 저장된 정보를 가져와 로그인 상태를 확인합니다. 따라서 로그인 정보나 장바구니 같은 경우의 정보를 불러온다.

 

쿠키와 세션을 이용한 로그인 메커니즘

사용자가 로그인한 후에는 브라우저가 쿠키를 저장하고, 이후에 해당 웹 페이지를 방문할 때 브라우저가 저장한 쿠키를 함께 서버로 전송하여 서버는 사용자를 식별하고 세션을 통해 로그인 상태를 유지한다.

  1. 로그인 요청: 사용자가 로그인 페이지에서 로그인 정보(일반적으로 사용자명과 암호)를 입력하면, 서버는 이 정보를 받아 인증을 진행한다.
  2. 쿠키 및 세션 생성: 인증이 성공하면 서버는 클라이언트(브라우저)에게 고유한 식별자인 쿠키를 생성하고 응답으로 전송합니다. 이 쿠키는 클라이언트 측에서 저장되어 나중에 사용자를 식별하는 데 사용된다. 또한, 서버는 사용자와 관련된 정보를 저장하고 세션 ID를 생성하여 이를 클라이언트에게 전송한다.
  3. 쿠키 저장: 클라이언트(브라우저)는 받은 쿠키를 저장한다. 일반적으로 쿠키는 브라우저의 쿠키 저장소에 저장된다.
  4. 이후 요청에서 쿠키 전송: 사용자가 이후에 해당 웹 페이지나 다른 페이지를 요청할 때, 브라우저는 저장한 쿠키를 요청과 함께 서버로 전송한다.
  5. 서버에서 로그인 상태 확인: 서버는 받은 쿠키를 확인하여 해당 사용자를 식별하고, 세션을 통해 사용자의 로그인 상태를 확인한다.

이러한 과정을 통해 사용자는 로그인 후에도 쿠키와 세션을 통해 로그인 상태를 유지하게 된다.

이는 사용자 경험을 향상시키고, 로그인 정보를 보안적으로 관리하기 위한 일반적인 방법 중 하나이다.

 

  Cookie Session
저장 위치 client server
저장 형식 text object
만료 시점 쿠키 저장시 설정 (설정 없으면 브라우저 종료 시) 정확한 시점 모름
리소스 클라이언트의 리소스 서버의 리소스
용량제한 한 도메인 당 20개, 한 쿠키당 4KB 제한없음

 

*** Gyoogle 님 블로그를 참고하였습니다.
반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP status code (HTTP 상태 코드)  (0) 2023.12.28
HTTP Request Methods  (0) 2023.12.23
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13

+ Recent posts