본문 바로가기
카테고리 없음

개발 직군 웹 개발 필기 시험

by sjs_2215 2019. 7. 27.

HTTP 프로토콜의 특징

출처: https://victorydntmd.tistory.com/34

- 쿠키와 세션이 나오게 된 배경?

​ : HTTP 프로토콜의 특징 때문

<HTTP 프로토콜의 특징 2가지>

-서버와 클라이언트가 통신을 할 때마다 서버는 클라이언트가 누구인지 인증을 계속해야 한다.

ex) 사용자가 쇼핑몰에 최초 로그인했어도, 페이지 이동할 때마다 계속 인증해야 하는 단점이 생겨버림

  1. Connectionless

: 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징

  1. Stateless

: 통신이 끝나면 상태를 유지하지 않는 특징

BUT, 쿠키와 세션을 사용했을 경우에는 최초 로그인을 하면 어떠한 방식에 의해서 서버가 그 사용자에 대한 인증을 유지하게 된다.

-> 상태 유지를 위한 쿠키와 세션 <-


쿠키

출처: <https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies

https://web.stanford.edu/~ouster/cgi-bin/cs142-fall10/lecture.php?topic=cookie

1. 쿠키

쿠키 뜻: 클라이언트 측(브라우저)에서 관리되는 (키와 값이 들어있는) 작은 기록 정보 파일을 의미

원리: 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송

효과: 사용자의 로그인 상태를 유지

목적:

  1. 세션 관리

: 서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리

  1. 개인화(Personalization)

: 사용자 선호, 테마 등의 세팅

  1. 트래킹

: 사용자 행동을 기록하고 분석하는 용도

모든 요청마다 쿠키가 함께 전송되기 때문에 (특히 mobile data connections에서) 성능이 떨어지는 원인이 될 수 있다. 지금은 modern storage APIs를 사용해 정보를 저장하는 걸 권장

쿠키 만들기 (PHP 4, PHP 5, PHP 7)

출처

setcookie ( string $name [, string $value = "" [, int $expires = 0 [, string $path = "" [, string $domain = "" [, bool $secure = FALSE [, bool $httponly = FALSE ]]]]]] ) : bool
setcookie ( string $name [, string $value = "" [, array $options = [] ]] ) : bool

https://clairdelunes.tistory.com/28

! 쿠키의 정보를 클라이언트에 저장하는 방법

(1) 쿠키 객체를 생성한다.

Cookie cookie = new Cookie("name", "홍길동");


(2) 쿠키에 속성 값을 설정해준다.(속성 값 메서드는 다양함)

쿠키 정보가 1년 동안 유효할 수 있도록 이미 생성된 쿠키 객체의 유효기간을 설정한다.

cookie.setMaxAge(365*24*60*60);


(3) response 객체의 addCookie()메서드를 이용하여 쿠키를 추가한다.

response.addCookie(cookie);


! 서버가 클라이언트로부터 쿠키의 정보를 얻어오는 방법


(1) 쿠키 객체를 얻어온다.

- request 객체의 getCookies() 메소드를 이용하면 클라이언트의 설정된 모든 쿠키 객체들을 얻어올 수 있다. 쿠키가 여러 개 라면 배열 형태로 가져옴

Cookie[] cookies = request.getCookies();


(2) 쿠키 객체에 설정된 값을 알아낸다.

- 쿠키의 이름과 값을 알아내기 위해 getName()과 getValue()를 사용한다. (스크립트릿 생략)

for(Cookie cookie : cookies) {

out.println(cookie.getName() + " : "+ cookie.getValue() + "<br>");

}


! 쿠키 삭제하기

- 쿠키를 더 이상 사용하지 못하게 하려면 쿠키의 유효기간을 만료시켜야 한다.

​ 유효기간을 결정하는 메서드 setMaxAge()에 유효기간을 0으로 설정하면 된다.

ex) id 쿠키 값 삭제하기

Cookie cookie = new Cookie("id", "");

cookie.setMaxAge(0);

response.addCookie(cookie);

 

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including 'html' and 'head' tags as well as any whitespace.

Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE array. Cookie values may also exist in $_REQUEST.


세션

https://cjh5414.github.io/cookie-and-session/

 

인증에 쿠키보다 세션을 이용하는 이유: 쿠키의 단점 때문(쿠키보다 보안면에서 월등)

 

쿠키의 단점:

쿠키를 이용해서 사용자의 아이디와 비밀번호를 쿠키에 저장한다고 가정)

페이지를 이동하여도 쿠키를 통해 아이디와 비밀번호를 서버에 전달해서 서버에서는 사용자를 식별하여 해당 사용자의

 

로그인 상태를 유지시킬 수 있다.

 

하지만 이렇게 쿠키만을 이용하여 인증을 구현하면 쿠키가 유출, 조작될 수 있는 보안상 매우 큰 문제가 됨.

개인 소유가 아닌 컴퓨터에서 사용할 경우 누구나 그 사용자의 비밀번호를 확인할 수 있고 HTTP로 개인 정보를 주고받는 것은 매우 위험.

 

Session의 특징:

세션은 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리

서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지

저장 용량 제한 없음

 

물론 접속 시간에 제한을 두어 일정 시간 응답이 없다면 세션을 끊도록 설정 가능

 

사용자에 대한 정보를 서버에 저장하기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지

즉, 동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 됨

 

세션 객체 사용하기

 

세션에 정보를 등록하는 방법은 아래와 같습니다.

String name = "닌자";int age = 31;session.setAttribute("testName", name);session.setAttribute("testAge", age);

 

세션에 등록된 정보는 다음과 같이 얻어올 수 있습니다.

String userName = (String)session.getAttribute("testName");int userAge = (Integer)session.getAttribute("testAge");

 

등록된 세션 정보의 삭제는 다음과 같이 합니다.

session.removeAttribute("testAge");

 

사용 중인 세션의 완전 삭제는 invalidate() 메쏘드를 호출하여 수행합니다.

session.invalidate();

 


  • 서브릿에서 데이터를 처리하는 방식 -> 겟 방식 / 포스트 방식

**GET** : 서버에 있는 정보를 가져오기 위해 설계됨. 240바이트까지 전달할 수 있음.

POST 방식에 비해 속도가 빠름. 검색엔진에서 검색단어 전송에 많이 이용함. URL 노출로 보안성이 요구되는 경우엔 사용할 수 없음.

**POST** : 서버로 정보를 올리기 위해 설계됨. URL에 파라미터가 표시되지 않음.

내부적으로 데이터가 이동함. GET 방식에 비해 속도 느림. 데이터 크기 제한 없음.

 

 


  • 개발자 대신 스프링에서 생명주기 이런 것꺼지다해 주는 걸 뭐라 하냐

<https://limmmee.tistory.com/13>

**IoC**

**컨테이너**


  • 스프링에서 DI(Dependecy Injection)

: DI는 Dependency Injection(의존성 주입)의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 Spring의 IOC 컨테이너의 구체적인 구현 방식입니다.

DI는 기존처럼 개발코드 부분에서 객체를 생성하는 것이 아니라, 팩토리 패턴처럼 객체의 생성과, 데이터를 주입만 담당하는 Factory에 해당하는 별도의 공간에서 객체를 생성하고 데이터 간의 의존성을 주입해 개발코드에서는 이를 가져다 씀으로써 의존성을 줄이는 방식입니다. 이때, Factory 패턴의 Factory Class의 역할을 스프링의 환경설정 파일이 담당합니다.

 

Spring을 적용하여 applicationContext.xml에서 설정만 해주면 외부 설정 파일(xml)에서 연관관계에 있는 객체를 주입해주기 때문에 의존 객체를 찾기 위한 코드가 필요하지 않게 됨.

즉, 외부 설정에서 객체를 찾아서 쓰기 때문에 코드 내에 의존관계를 맺는 코드 생성이 불필요.

 

  • 스프링에서 AOP(Aspect Oriented Programming)

: AOP는 Aspect Oriented Programming 관점 지향 프로그래밍의 약자로, 기존의 OOP(객체 지향 프로그래밍)에서 기능별로 class를 분리했음에도 불구하고, 여전히 로그, 트랜잭션, 자원 해제, 성능 테스트 메서드처럼 공통적으로 반복되는 중복 코드가 여전히 발생하는 단점을 해결하고자 나온 방식으로 이러한 공통 코드를 "횡단 관심사"라 표현하며 개발코드에서는 비즈니스 로직에 집중하고 실행시에 비지니스 로직 앞, 뒤 등 원하는 지점에 해당 공통 관심사를 수행할 수 있게 함으로써 중복 코드를 줄일 수 있는 방식입니다.

 

프로그래밍할 때 특정한 관심사를 가진 코드 부분을 별도의 모듈로 분리함으로써 기존 객체지향의 강력한 기능(상속, 위임)만으로는 처치가 곤란했던 중복을 할 수 있게 됨.

 


  • Model 1 방식과 Model 2 방식의 특징과 차이점

Model 1: 디자인 코드와 자바 코드(비즈니스 로직)를 구분하지 않고, 하나의 JSP 내에 기술해서 웹 프로그램을 제작하는 방식.

특징

• 개발하기가 쉽고, 배우기가 쉬움.

• 디자인 코드와 비즈니스 로직의 구분이 명확하지 않아, 복잡도가 높음.

• 수정 시 디자이너와 개발자의 협업이 필요.

• 비즈니스로직의 재 사용성이 어려우며, 유지 보수가 힘듦.

Model 2 : 웹 애플리케이션을 개발할 때, MVC패턴을 적용하여, 웹 애플리케이션의 개발이 가능하도록 구현한 것.

특징

• 초기 설계에 많은 시간이 소요.

• 디자인 코드와 비즈니스 로직이 분리되며, 비즈니스로직의 재사용성이 높아짐.

• 비즈니스로직 계층의 확장성이 용이하며, 유지보수가 편하다.

<https://k9e4h.tistory.com/75>

 


 

  • 서블릿 라이프 사이클 init() service() destroy()

https://gmlwjd9405.github.io/2018/10/28/servlet.html

  • 웹서버랑 was 차이

https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

  • 크로스 사이트 스크립트 공격 (xss: cross-site scripting attacks)

https://victorydntmd.tistory.com/83?category=719464

신뢰할 수 없는 데이터란, 외부의 파일이나 페이스북의 댓글과 같은 나의 웹 애플리케이션이 통제할 수 없는 데이터를 의미합니다.

이러한 데이터를 href 경로에 또는 innerHTML 속성을 이용하여 페이지에 HTML을 추가하는 경우, XSS 공격에 의해 보안이 위험해집니다.

XSS 공격은 사이트에 스크립트 코드를 삽입하는 공격 기법을 의미합니다.

DOM 트리에 접근할 수 있고, 쿠키와 세션 정보를 탈취해 사용자 인증을 수행할 수 있습니다.

그 결과로 해커가 유저의 계정으로 물품을 구매할 수 있게 되고, 또한 악성코드가 널리 퍼질 수도 있습니다.

Comments