연습 프로젝트

11.Quiz게시판.pdf
0.79MB

 

11_Quiz게시판-풀이.pdf
2.00MB

 

비밀번호는 댓글

728x90

 

 

 

 

 

웹소켓 ( Web Socket )

8_websocket 프로젝트 생성

프로젝트 버전 변경, 한글 인코딩 설정, 메이븐 프로젝트 업데이트, 이전에 만들었던 프로젝트와 /root 경로 겹치면 Servers > server.xml 에서 이전 경로 주석처리까지 진행

 

Spring WebSocket 라이브러리 버전 아무거나 추가 >> pom.xml 에 추가한 뒤 버전을 현재 사용 스프링 버전으로 변경해준다

 

데이터가 넘어올때 json 형식으로 넘어오므로 Jackson Databind 라이브러리 추가 ( 2.12.1 버전 라이브러리 추가 )

 

com.care.root 하위에 TestSocket.java 파일 생성하여 소켓에 대한 설정을 해줄 것임

 

servlet-context.xml > 하단에 Namespaces 클릭 > websocket 체크 > Source 로 이동

Namespaces 에서 websocket 활성화

 

servlet-context.xml 작성 >> /chat 경로로 요청하면 ts 를 바라보라는 의미!!!

 

TestSocket.java 클래스에서 TextWebSocketHandler 상속받기

 

Test.socket 에서 위 메소드 3가지 오버라이딩

 

afterConnectionsEstablished() : 클라이언트가 연동되면 실행

handleTextMessage() : 메세지를 받으면 실행

afterConnectionClosed() : 연결이 끊겼을 경우 실행

 

우선은 연결 시, 끊길 시, 메세지 받을 시 각 내용을 출력해볼 것임

 

HomeController.java 에 기본 경로 생성

 

test_socket.jsp 에 코드 작성 ( 상담사 연결 페이지를 출력하는 버튼 )

 

 

rec_data : 내용을 수신하기 위한 div

send_msg : 데이터를 보내기 위한 용도의 textarea

socket.jsp 작성

 

정상적으로 출력되는 것 확인

 

socket.jsp 에서 jquery 사용할 것이므로 CDN 값 추가

 

 

wsUri : 웹소켓 경로 설정 ( /chat 경로가 아까 servlet-context.xml 에서 설정한 경로 )

 

스크립트 작성

onMessage : 서버로부터 받은 값을 여기에 저장하겠다

onclose : 서버가 끊기면 작동할 로직

 

sendBtn 을 클릭하면 sendMessage() 함수를 실행하고 send_msg 의 값을 비워라 ( 텍스트 박스 안에 입력된 값을 비우기 )

 

sendMessage() 함수 정의 ( socket 으로 send_msg 의 값을 보내라 )

 

메세지가 들어올 경우 ( onMessage 함수 ) 와 연결이 끊길 경우 ( onClose 함수 ) 정의

 

접속 테스트, 메세지 전송 테스트

 

TestSocket.java 에 넘어온 메세지를 연결된 WebSocketSession 에게 전송한다 ( 지금은 자기 자신한테만 보내는 상태이며 제대로 값을 모든 세션에게 전송하려면 연결된 session 들을 배열에 담아서 반복문으로 돌려서 전송해야한다 )

 

session 을 List 로 받아 연결되면 List 에 add 로 세션 값을 저장

 

메세지가 들어오면 세션 값을 저장해놓은 List 를 반복문으로 돌려 메세지를 전송한다

 

정상적으로 모든 세션에 메세지가 전송되는 모습

 

HomeController.java 에서 test_socket 경로로 접속되면 session 값을 설정 >> 이 세션 값을 가져와서 유저를 나눌 것임 ( 추후에는 웹 사이트 아이디를 세션으로 설정하면 된다 )

 

 

일반 Session 의 값을 웹 소켓 session 에서 가로채서 사용하겠다는 의미

bean 에 추가한 경로 : org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor

 

위 작업을 진행해주지 않으면 httpsession 의 값과 websocket 의 session 의 값을 서로 다른 세션이기 때문에 httpsession 을 설정해줬다 하더라고 websocket 의 session 에서는 해당 값을 꺼내서 확인할 수 없다.

 

메세지가 들어올 시 WebSocketSession 의 Attribute 값을 map 에 담아 저장한 뒤 해당 map 에 설정해둔 name 키의 값을 사용해서 누가 보낸 메세지인지 출력 ( getPayload() 메소드는 현재 들어온 메세지를 출력 )

WebSocketSession 의 getAttributes() 메소드는 반환 값을 Map 형태로 돌려준다

>> 위 방식대로 진행하면 메세지를 출력할 때 A 가 입력한 메세지가 B와 C 에게 도착할 때 B와 C 는 자신이 보낸 메세지로 보이게 되므로 보낸 사람의 이름으로 메세지가 도착하는 로직이 추가로 들어가야 한다

 

socket.jsp 에서 엔터를 입력하면 메세지가 전송되게 설정

엔터 값 == 13

 

 

728x90

'BE > Spring' 카테고리의 다른 글

[Spring] 연습 프로젝트  (1) 2024.05.17
[Spring] URL 로 데이터 넘겨받기  (0) 2024.05.16
[Spring] Ajax, RestController  (0) 2024.05.16
[Spring] 스케쥴러 ( Scheduler )  (0) 2024.05.16
[Spring] 이메일 전송 API, 이메일 인증 구현  (0) 2024.05.16

 

 

 

 

 

 

URL 로 데이터 넘겨받기

넘겨받고자 하는 URL 데이터를 {} 로 받아서 처리하며 해당 값은 @PathVariable 어노테이션으로 받아 처리한다

@PathVariable 어노테이션 뒤에는 자료형과 URL 로 넘어온 값을 받을 변수 이름을 지정해주면 된다

 

 

728x90

'BE > Spring' 카테고리의 다른 글

[Spring] 연습 프로젝트  (1) 2024.05.17
[Spring] 웹소켓 ( Web Socket )  (1) 2024.05.17
[Spring] Ajax, RestController  (0) 2024.05.16
[Spring] 스케쥴러 ( Scheduler )  (0) 2024.05.16
[Spring] 이메일 전송 API, 이메일 인증 구현  (0) 2024.05.16

 

 

 

 

 

Ajax, RestController

프로젝트 생성 및 버전 변경, 한글 인코딩 설정 후 메이븐 프로젝트 업데이트까지 실행할 것

 

경로설정

 

jsp 파일 생성하여 작성

 

ajax 를 사용하지 않으면 전체 페이지가 다시 요청되어 로딩된다...!!

ajax 를 사용하면 페이지 전체를 요청하는게 아닌 데이터만 요청한다

 

ajax 사용할 경로 추가

 

ajax01.jsp 파일 생성해서 코드 작성 후 테스트

 

>> 페이지가 완전 로딩되지 않고 요청에 return 되는 값만 출력된다!!!

 

경로 추가 ( @ResponseBody 태그를 사용해 return 값이 jsp 파일이 아닌 데이터 형식으로 반환하는 메소드임을 선언!! )

 

ajax 를 사용하여 data 매개변수로 응답 데이터를 저장한뒤 span 태그의 내부 html 을 데이터 값으로 변경

 

 

 

 

 

데이터를 json 형식으로 보내주기 위해 라이브러리 추가

2.9.5 버전 라이브러리 추가

 

라이브러리 추가

 

DTO 클래스 생성 >> 변수 선언 및 getter / setter 생성

 

Controller 에서 데이터 받아 처리하는 코드 작성

 

ajax03.jsp 작성 ( 데이터 json 형태로 넘겼다가 받아와서 값 처리 )

 

넘어오는 값을 DTO 가 아닌 Map 으로 담아서 처리할 수도 있음

Map 으로 담아서 처리

 

결과 확인

 

 

 

 

 


 

 

 

 

 

RestController 사용

@Controller : 페이지를 return 하는 컨트롤러

@RestController : 데이터를 return 하는 컨트롤러

 

Controller 작성

 

ajax04.jsp 작성

 

jquery 를 사용하여 ajax 를 사용

 

ajax04.jsp 를 출력하기 위해 HomeController 에 경로 설정

 

※ 전달받는 값이 json 형식이 아니라 text 형식이라 오류가 발생했음!!! ※

※ text 형식을 반환할거면 produces 값에 application/text 로 변환해주면 되는데 일단은 Map 에 키와 값으로 담아서 전송 ※

 

json 형태로 전송

 

응답으로 넘어온 데이터의 result 키를 확인

 

코드 실행
728x90

 

 

 

 

 

Scheduler

Scheduler 설정하는 방법

 

위와 같이 설정하면 Scheduler 설정은 끝 ( 10 초마다 한번씩 반복 )

 

시간 설정은 cron 의 값으로 설정 >> google 에 Scheduler cron 검색하면 시간 설정 값 확인할 수 있음

728x90

 

 

 

 

 

이메일 전송 API, 이메일 인증 구현

 

Spring Context Support 라이브러리 버전 아무거나 선택해서 추가 >> 현재 사용중인 스프링 버전으로 변경

 

라이브러리 추가할 것임 ( JavaMail API JAR, JavaMail API )

 

1.5.4 버전 라이브러리 추가

 

1.5.3 버전 라이브러리 추가

 

google 계정으로 발송해볼 것임 >> google 로그인 후 Google 계정 관리 클릭

 

파일 세팅

 

Mailconfig 파일 작성 ( 비밀번호 칸에는 앱 비밀번호가 들어가야 한다 )

 

- 앱 비밀번호 설정하기 -

앱 비밀번호 설정하기 >> 앱 이름 설정 후 만들기 클릭 >> 생성된 앱 비밀번호를 setPassword 부분에 넣어준다

 

sendmail 경로로 접속 시 메일을 보냈습니다. 출력되게 설정

 

Service 쪽으로 받을 메일 주소, 제목, 내용을 전달

 

MailServiceImpl 작성 후 테스트

 

sendmail 경로로 접속하면 정상적으로 메일이 발송된다

 

메일 전송된 것 확인

 

 

 

 

 

이제 메일의 내용을 html 형식으로 보내볼 것임

Controller 에 HTML 형식으로 메일 보내는 것 추가

 

Service 에서 text 형식이 아니라고 명시한 뒤 메일 다시 전송해봄 ( 이미지는 구글에 검색해서 나온 이미지주소를 아무거나 사용했음 )

 

html 형식으로 메일 정상적으로 전달되는 모습!!!

 

 

 

 

 

이메일 인증을 만들어볼 것임

Controller 에 경로 추가

 

auth.jsp 작성

 

Controller 에 경로 추가

 

Service 에 랜덤 수 생성 코드 추가, session 을 발급

 

Controller 에 이메일 인증 내용을 작성하여 아까 만들어둔 sendMail02 메소드를 사용하여 이메일 전송 ( a 태그 안에 랜덤으로 생성한 키를 userId 값으로 넘겨준다 )

 

이메일 전송 후 확인 ( 이동 경로도 정상적으로 들어오는지 확인 )

 

세션의 값과 파라미터로 넘어온 값이 같은지 확인하는 코드 작성 후 확인

 

확인

 

 

728x90

 

 

 

 

 

파일 업로드, 다운로드

파일 세팅 ( FileService 인터페이스는 따로 사용하지 않으므로 생략 )

 

파일 세팅

 

pom.xml 파일에 프로젝트의 버전 변경 >> maven 프로젝트 업데이트 >> 한글 인코딩 작업 실행

 

이제 파일 업로드, 다운로드에 필요한 라이브러리를 추가할 것임

 

commons fileupload 라이브러리 추가할 것 >> 1.3.3 버전 >> pom.xml 에 추가

 

입, 출력을 담당하는 라이브러리 >> 2.4 버전 >> pom.xml 에 추가

 

class 파일로 bean 객체를 추가

 

기존에 servlet-context.xml 에서 빈 객체를 등록하던 방식을 클래스 파일에서 어노테이션을 사용해서 등록하여 사용

( 위 xml 파일은 어노테이션을 활용해서 작성하는 방법을 설명하기 위해 작성했으므로 xml 파일 내 빈 객체 등록 부분은 주석처리 하였음 )

 

파일 업로드 경로 작성 >> uploadForm.jsp 에 업로드 폼 작성 >> 파일 전송 시 이동될 경로 작성

 

Controller 에도 파일 받아서 처리할 url 경로 작성 및 넘어온 파일을 변수로 담아서 출력해봤음 >> service 쪽으로 받은 파일을 넘겨줌

 

파일 저장 로직 완성 ( 파일 명 앞에 저장 시간을 년월일시분초 형식으로 붙인 뒤 변수로 저장 경로를 지정하여 저장 )

 

 

 

 

 

DB 에 저장한 이미지의 이름을 저장해볼 것임

create table file_image(
    id varchar(20) primary key,
    name varchar(20),
    img_name varchar(100) 
);

sql 문 작성 및 실행

 

▼ DB 연동 작업 ▼

DB 연동에 필요한 라이브러리 추가

 

root-context.xml 작성

 

fileMapper.xml 세팅

 

▲ DB 연동 세팅 완료 ▲

 

DB 와 연동할 객체 DTO 작성

 

파일을 저장하지 않으면 DB 에 nan 으로 처리, 파일을 저장한다면 파일 명을 DB 에 저장

 

FileMapper 인터페이스에 메소드 추가

 

FileMapper.xml 파일에 sql 문 작성

 

FileMapper.xml 파일에 namespace 를 설정해주지 않아서 다시 고침

 

이미지 파일 전송해보니 정상적으로 파일 이름 DB 에 저장되는 모습

 

파일 저장도 되는 모습

 

( 현재 테이블에 id 값을 primary key 로 지정해놓아서 동일한 아이디로 파일 업로드를 하면 무결성 조건 에러가 발생되는데 이때, 정상적으로 파일은 디렉토리에 저장되지만 DB 에 파일명을 저장할때 무결성 조건 에러를 만나면서 DB 에 파일명이 저장되지는 않는다,,,, )

 

 

 

 

 

파일을 jsp 파일에 출력해볼 것임

경로 생성

 

Controller 에서 model 객체를 Service 에 전달, Service 에서는 Mapper 를 사용해 데이터를 가져와서 model 에 저장할 것임

 

 

FileMapper.xml 에 select 문 작성 ( resultMap 을 사용해서 컬럼명과 변수를 Mapping )

 

전달받은 데이터를 forEach 문으로 화면에 출력

 

다운로드와 이미지 출력 구현

 

download 경로를 컨트롤러에 작성 및 download 기능을 구현

 

 

 

 

 

파일 삭제 기능 추가

result.jsp 에 파일 별로 a 삭제할 경로와 파일 출력할 img 태그 추가

 

delete 경로로 들어왔을때 file 명과 id 값을 받아서 service 로 전달

 

service 에서는 mapper 로 id 값을 전달하여 db 에 저장된 파일정보를 삭제, 디렉토리 내의 파일은 service 에서 삭제

 

 

FileMapper.xml 에 sql 문 작성

 

코드 실행 영상

 

728x90

 

 

 

 

 

XSS 공격 대응 ( 크로스 사이트 스크립팅 )

xss 란 ? ( Cross Site Scripting )

: 회원가입 등에서 입력 란에 <script></script> 스크립트 문법을 사용해서 작동시키는 공격 방식

( 예를 들어 회원가입 란에 <script>alert("성공");</script> 를 입력한 뒤 회원가입을 진행하면 스크립트문이 실행되면서 alert 창이 실행된다 )

회원가입 시 session_id 컬럼의 값을 지정해놓지 않아 오류가 발생하므로 컬럼 값을 지정하여 insert 해주고 session_id 컬럼에는 기본 값인 'nan' 으로 설정되게 한다

 

 

 

 

 

방법 1. ( 문자열 치환 메소드 선언 후 사용 )

<, >, " 등 문자가 저장될 때 문자를 치환해서 저장하는 로직을 추가한다

위와 같이 스크립트문에 필요한 문자를 치환하는 방법을 사용하면 xss 공격이 들어올 수 있는 모든 부분에 해당 메소드를 사용해서 문자를 치환처리해줘야 한다

 

 

 

 

 

방법 2. ( 네이버에서 제공해주는 라이브러리 사용 )

lucy-xss-servlet-filter-rule.xml
0.00MB
xss설정파일.txt
0.00MB

 

xss 설정파일.txt 파일 안에 있는 내용 pom.xml ( 라이브러리 추가 ) 과 web.xml ( 필터 추가 ) 에 추가

 

resources 하위에 lucy-xss-servlet-filter-rul.xml 파일 추가 ( 경로는 무조건 resources 하위여야 된다 )

 

네이버에서 제공하는 xss 공격 방어 방법을 사용하면 모든 경로에서 시도되는 xss 공격을 처리해준다

 

xss 공격을 차단하지 않은 경우

저장된 DB 데이터를 불러오는 도중 script 문을 만나 실행되는 모습

 

 xss 공격을 차단한 경우 

네이버에서 제공하는 xss 방지 라이브러리를 사용하면 스크립트문을 저장할때부터 작동되지 않게 저장이 된다

※ 만약 xss 공격을 차단하지 못하여 이미 script 문이 저장된 상태라면 뒤늦게 필터를 추가해도 추가적으로 저장되는 데이터에만 적용이되기 때문에 기존에 존재하는 데이터의 script 문은 처리가 되지 않는다 ※

※ 위 경우는 따로 출력문이나 DB 에서 데이터를 가져오는 부분에 로직을 추가해 처리해줘야 한다 ※

 

728x90

+ Recent posts