카테고리 없음

#88. 쿠키 (아이디저장, 팝업창삭제), 이메일인증

열하나요 2023. 11. 10. 11:05

88-1. 쿠키

쿠키는 F12 > Application에 들어가면 볼 수 있음

Name / Value로 구성되어 있음

 

아이디 저장이나 팝업창 오늘하루보지않음 같이 보안상 문제가 없는 것들을 저장해 놓음

절대로 중요한 것은 저장하면 안됨! 하지만 빠름

 

1. 쿠키 만드는 법

new Cookie(name값, value값);

 

2. expire지정하는 법

new Cookie("", "").setMaxAge(초단위); => 미국시간으로 나옴

 

3. 보내는법

HttpServletResponse response객체로 

response.addCookie(name);

@RequestMapping("create")
public String create(HttpServletResponse response) {

    // JavaScript에서도 할 수 있고 Java에서도 할 수 있음

    // cookie는 name과 value가 필수!!!!!!! expire는 선택!
    // name, value는 마음대로 지정해도 됨
    Cookie ck = new Cookie("newjeans", "mycookie");
    // name과 value는 무조건!!! 모두 문자열만!!! 가능!!!(아스키코드)

    // 쿠카는 객체를 생성한 다음 응답정보에 첨부해야 발급!

    // setMaxAge() == 만료시간
    ck.setMaxAge(24*60*60);

    // 아이디 저장 쿠키
    Cookie saveId =  new Cookie("saveId", "newjeans");
    saveId.setMaxAge(60*60*24*28);

    response.addCookie(ck);
    response.addCookie(saveId);

    return "cookie/create";
}

 

4. 쿠키 지우는 법

똑같이 Cookie객체를 만들어 => 지울 쿠키의 name값만 같으면 됨

setMaxAge(0)으로 response에 담아 보내기

@RequestMapping("delete")
public String delete(HttpServletResponse response) {

    // 쿠키는 삭제 명령이 따로 없음
    // 만료시간을 0초로 설정해서 덮어씌워줌
    Cookie ck = new Cookie("newjeans", "delete"); // name속성만 같으면 끝
    ck.setMaxAge(0);
    response.addCookie(ck);

    // 아이디 저장 쿠키 지우기
    Cookie saveIddd = new Cookie("saveId", "delete"); // name속성만 같으면 끝
    saveIddd.setMaxAge(0);
    response.addCookie(saveIddd);

    return "cookie/create";
}

 

 

5. JSP에서 쿠키 사용법

${ cookie.newjeans } => EL구문으로 cookie.name값으로 사용할 수 있음

<div>
    쿠키 : ${ cookie.newjeans }	
    뉴진스 쿠키 있나요?? : ${ cookie.newjeans != null } <br>
    뉴진스 쿠키 있나요?? : ${ not empty cookie.newjeans } <br> <!-- cookie.newjeans != null && cookie.newjeans != '' -->
    쿠키 값 : ${ cookie.newjeans.value }
</div>

 

6. JSP에서 쿠키 value값 가져오기

${ cookie.newjeans.value } => 쿠키객체.name명.value

 <form>
     <c:choose>
        <c:when test="${ not empty cookie.saveId }">
            아이디 : <input type="text" value="${ cookie.saveId.value }" /> <br>
            <input type="checkbox" checked>아이디저장</input>
        </c:when>
        <c:otherwise>
            아이디 : <input type="text" /> <br>
            <input type="checkbox">아이디저장</input>
        </c:otherwise>
    </c:choose>
 </form>

 

<c:if test="${ not empty cookie.saveId }">
	<script>
		window.open("http://www.naver.com", "나는 광고야", "width=400, height=400");
	</script>
</c>

 

 

88-2. 메일 인증

pom.xml에 라이브러리 추가

<!-- 6. 메일 관련 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

 

 

// 직접 객체를 생성해서 이메일을 보내는 객체
// 필요한 의존성 목록
// - spring-context-support
// - java mail-api

public class TestMail1 {
	
	public static JavaMailSenderImpl sender;
	
	public static void main(String[] args) {
		
		JavaMailSenderImpl impl = new JavaMailSenderImpl();
		
		// - 계정 설정
		impl.setHost("smtp.gmail.com");
		impl.setPort(587);
		impl.setUsername("kh@gmail.com");
		impl.setPassword("password");
		
		// - 옵션 설정
		Properties prop = new Properties();
		prop.put("mail.smtp.auth", true);
		prop.put("mail.smtp.starttls.enable", true);
		
		impl.setJavaMailProperties(prop);
		
		sender = impl;
		
		// 메시지 생성
		SimpleMailMessage message = new SimpleMailMessage();
		
		// 메시지 정보 설정 : 제목, 내용, 첨부파일(Simple에선 불가), 받는사람, 참조, 숨은참조
		message.setSubject("행운의편지");
		message.setText("봇) 이 편지는 영국에서 최초로 시작되어 일년에 한 바퀴 돌면서 받는 사람에게 행운을 주었고 지금은 당신에게로 옮겨진 이 편지는 4일 안에 당신 곁을 떠나야 합니다. 이 편지를 포함해서 7통을 행운이 필요한 사람에게 보내 주셔야 합니다. 복사를 해도 좋습니다. 혹 미신이라 하실지 모르지만 사실입니다. 영국에서 HGXWCH이라는 사람은 1930년에 이 편지를 받았습니다. 그는 비서에게 복사해서 보내라고 했습니다. 며칠 뒤에 복권이 당첨되어 20억을 받았습니다. 어떤 이는 이 편지를 받았으나 96시간 이내 자신의 손에서 떠나야 한다는 사실을 잊었습니다. 그는 곧 사직되었습니다. 나중에야 이 사실을 알고 7통의 편지를 보냈는데 다시 좋은 직장을 얻었습니다. 미국의 케네디 대통령은 이 편지를 받았지만 그냥 버렸습니다. 결국 9일 후 그는 암살 당했습니다. 기억해 주세요. 이 편지를 보내면 7년의 행운이 있을 것이고 그렇지 않으면 3년의 불행이 있을 것입니다. 그리고 이 편지를 버리거나 낙서를 해서는 절대로 안됩니다. 7통입니다. 이 편지를 받은 사람은 행운이 깃들 것입니다. 힘들겠지만 좋은게 좋다고 생각하세요. 7년의 행운을 빌면서...");
		
		String[] to = {1@gmail.com", "2@gmail.com", "3@gmail.com", "4@gmail.com"};
		// 한명한테만 보낼거면 배열말고 String으로 보내면 됨
		
		message.setTo(to);
		
		/*
		 * 참조
		 * 
		 * 메시지객체.setCc(참조할주소)
		 * 
		 * 숨은 참조
		 * 
		 * 메시지객체.setBcc(숨은 참조할 주소)
		 */
		
		// 전송
		sender.send(message);
	}
}

 

 

*** 객체를 bean으로 등록하는 법

root-context.xml에 등록

<!-- 메일 전송 도구 등록 -->
<bean id="sender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host"  value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="kh@gmail.com" />
    <property name="password" value="password" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
    </property>
</bean>

 

@Autowired 하여

private JavaMailSender sender;로 지정하여 사용가능

 

SimpleMail은 html태그를 보낼 수 없음

=> MimeMassage사용

 

 

88-3. 이메일 인증

1. 인증번호 보내고 DB에 저장

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메일인증~</title>
</head>
<body>

	<h1>이메일을 입력해 주세요~</h1>
	
	<form action="mail" method="POST">
		<input type="text" name="email">
		<input type="submit" value="인증번호받기">
	</form>
	
</body>
</html>

 

 

Controller

@GetMapping("inputmail")
public String inputMail() {
    return "member/input";
}

// 이메일 인증
// PostMapping => Mapping값이 값아도 Post면 이리로 옴
@PostMapping("mail")
public String mail(String email, HttpServletRequest request) throws MessagingException {

    MimeMessage message = sender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

    // 요청을 보낸 친구의 요청을 알 수 있음 
    String ip = request.getRemoteAddr();


    // Math.random();
    // 이게 더 편함↓
    Random r = new Random();
    int i = r.nextInt(100000);
    // 자리수가 0으로 채워짐
    Format f = new DecimalFormat("000000");
    String secret = f.format(i);

    // VO에 @Builder => 객체를 생성하면서 필드명과 같은 메소드를 실행하면서 setter의 역할을 해줌
    // 내가 원하는 형태로 값을 만들어서 넣을 수 있음
    CertVO certVo = CertVO.builder()
                          .who(ip)
                          .secret(secret)
                          .build();

    memberService.sendMail(certVo);


    helper.setTo(email);
    helper.setSubject("인증번호를 보내드립니다.");
    helper.setText("인증번호 : " + secret);

    sender.send(message);

    return "redirect:/";
}

 

Service, DAO

// Service
	// 메일 인증 서비스
	void sendMail(CertVO certVo);
    
// ServiceImpl
	// 인증번호
	@Override
	public void sendMail(CertVO certVo) {
		memberDao.sendMail(sqlSession, certVo);
	}

// DAO
	// 인증번호
	public void sendMail(SqlSessionTemplate sqlSession, CertVO certVo) {
		sqlSession.insert("memberMapper.insertSecret", certVo);
	}

 

mapper

<!-- 메일인증 -->
<insert id="insertSecret" parameterType="com.kh.spring.member.model.vo.CertVO">
    INSERT INTO CERT(who, secret, when)
    VALUES (#{who}, #{secret}, sysdate)
</insert>

 

VO

package com.kh.spring.member.model.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

// Builder : 빌더 패턴. => 실무에서 볼 수 있는 디자인 패턴 2개 중 1개 (하나는 MVC패던, 하나는 Builder패턴)
// 생성자에 매개변수를 하나 지우거나(수정), 매개변수가 너무 많아서 어떤게 어떤값인지 헷갈리는 문제를 해결해줌
@Data @AllArgsConstructor @Builder
public class CertVO {
	private String who, secret, when;
}

 

 

2. 인증번호 검증

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>검증화면</title>
</head>
<body>

	<h1>인증번호를 내놔라</h1>
	
	<form action="check" method="post">
		<input type="text" name="secret" />
		<input type="submit" value="인증하기" />
	</form>

</body>
</html>

 

 

Controller

// 인증번호 입력할 페이지
@RequestMapping("checkPage")
public String checkPage() {
    return "member/check";
}

    // 인증번호 맞니?
@ResponseBody
@PostMapping("check")
public String checkCode(String secret, HttpServletRequest reqeust) {

    CertVO certVo = CertVO.builder()
                          .who(reqeust.getRemoteAddr())
                          .secret(secret)
                          .build();
    boolean result = memberService.validate(certVo);

    return "result:" + result;
}

 

 

Service, DAO

// Service
boolean validate(CertVO certVo);

// SerivceImpl
// 인증번호 검증
@Override
public boolean validate(CertVO certVo) {
    boolean result = memberDao.validate(sqlSession, certVo);

    // 인증번호가 맞으면 컬럼을 삭제
    if(result != false) {
        memberDao.deleteCert(sqlSession, certVo);
    }
    return result;
}

// DAO
// 인증번호가 맞으면 해당 컬럼을 지워줌
public void deleteCert(SqlSessionTemplate sqlSession, CertVO certVo) {
    sqlSession.delete("memberMapper.deleteCert", certVo);
}

 

mapper

<!-- 검증된 인증번호 삭제 -->
<delete id="deleteCert" parameterType="com.kh.spring.member.model.vo.CertVO">
    delete cert where who = #{who} and secret = #{secret}
</delete>

 

 

 

협업툴

https://www.jandi.com/landing/kr

 

JANDI - 가장 쉬운 업무용 협업툴 잔디

업무용 협업툴 잔디와 함께라면 신속하고 효율적인 협업을 할 수 있습니다.

www.jandi.com